Changeset db24058 in mainline for uspace/lib/libc/generic
- Timestamp:
- 2009-06-30T15:53:15Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2d11a7d8
- Parents:
- 6db6fd1
- Location:
- uspace/lib/libc/generic
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/generic/as.c
r6db6fd1 rdb24058 39 39 #include <sys/types.h> 40 40 #include <bitops.h> 41 #include <malloc.h> 41 42 42 /** 43 * Either 4*256M on 32-bit architecures or 16*256M on 64-bit architectures. 44 */ 45 #define MAX_HEAP_SIZE (sizeof(uintptr_t)<<28) 43 /** Last position allocated by as_get_mappable_page */ 44 static uintptr_t last_allocated = 0; 46 45 47 46 /** Create address space area. 48 47 * 49 48 * @param address Virtual address where to place new address space area. 50 * @param size Size of the area.51 * @param flags Flags describing type of the area.49 * @param size Size of the area. 50 * @param flags Flags describing type of the area. 52 51 * 53 52 * @return address on success, (void *) -1 otherwise. 53 * 54 54 */ 55 55 void *as_area_create(void *address, size_t size, int flags) 56 56 { 57 return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t 57 return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t) address, 58 58 (sysarg_t) size, (sysarg_t) flags); 59 59 } … … 62 62 * 63 63 * @param address Virtual address pointing into already existing address space 64 * 65 * @param size New requested size of the area.66 * @param flags Currently unused.64 * area. 65 * @param size New requested size of the area. 66 * @param flags Currently unused. 67 67 * 68 * @return Zero on success or a code from @ref errno.h on failure. 68 * @return zero on success or a code from @ref errno.h on failure. 69 * 69 70 */ 70 71 int as_area_resize(void *address, size_t size, int flags) 71 72 { 72 return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t 73 return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t) address, 73 74 (sysarg_t) size, (sysarg_t) flags); 74 75 } … … 77 78 * 78 79 * @param address Virtual address pointing into the address space area being 79 * 80 * destroyed. 80 81 * 81 * @return Zero on success or a code from @ref errno.h on failure. 82 * @return zero on success or a code from @ref errno.h on failure. 83 * 82 84 */ 83 85 int as_area_destroy(void *address) 84 86 { 85 return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t 87 return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t) address); 86 88 } 87 89 … … 89 91 * 90 92 * @param address Virtual address pointing into the address space area being 91 * 92 * @param flags New flags describing type of the area.93 * modified. 94 * @param flags New flags describing type of the area. 93 95 * 94 * @return Zero on success or a code from @ref errno.h on failure. 96 * @return zero on success or a code from @ref errno.h on failure. 97 * 95 98 */ 96 99 int as_area_change_flags(void *address, int flags) … … 100 103 } 101 104 102 static size_t heapsize = 0; 103 static size_t maxheapsize = (size_t) (-1); 104 105 static void *last_allocated = 0; 106 107 /* Start of heap linker symbol */ 108 extern char _heap; 109 110 /** Sbrk emulation 105 /** Return pointer to some unmapped area, where fits new as_area 111 106 * 112 * @param incr New area that should be allocated or negative, 113 if it should be shrinked 114 * @return Pointer to newly allocated area 107 * @param size Requested size of the allocation. 108 * 109 * @return pointer to the beginning 110 * 115 111 */ 116 void * sbrk(ssize_t incr)112 void *as_get_mappable_page(size_t size) 117 113 { 118 int rc; 119 void *res; 120 121 /* Check for invalid values */ 122 if ((incr < 0) && (((size_t) -incr) > heapsize)) 114 if (size == 0) 123 115 return NULL; 124 116 125 /* Check for too large value */ 126 if ((incr > 0) && (incr + heapsize < heapsize)) 127 return NULL; 128 129 /* Check for too small values */ 130 if ((incr < 0) && (incr + heapsize > heapsize)) 131 return NULL; 132 133 /* Check for user limit */ 134 if ((maxheapsize != (size_t) (-1)) && (heapsize + incr) > maxheapsize) 135 return NULL; 136 137 rc = as_area_resize(&_heap, heapsize + incr, 0); 138 if (rc != 0) 139 return NULL; 140 141 /* Compute start of new area */ 142 res = (void *) &_heap + heapsize; 143 144 heapsize += incr; 145 146 return res; 147 } 148 149 /** Set maximum heap size and return pointer just after the heap */ 150 void *set_maxheapsize(size_t mhs) 151 { 152 maxheapsize = mhs; 153 /* Return pointer to area not managed by sbrk */ 154 return ((void *) &_heap + maxheapsize); 155 } 156 157 /** Return pointer to some unmapped area, where fits new as_area 158 * 159 * @param sz Requested size of the allocation. 160 * 161 * @return Pointer to the beginning 162 * 163 * TODO: make some first_fit/... algorithm, we are now just incrementing 164 * the pointer to last area 165 */ 166 void *as_get_mappable_page(size_t sz) 167 { 168 void *res; 169 uint64_t asz; 170 int i; 171 172 if (!sz) 173 return NULL; 174 175 asz = 1 << (fnzb64(sz - 1) + 1); 176 177 /* Set heapsize to some meaningful value */ 178 if (maxheapsize == (size_t) -1) 179 set_maxheapsize(MAX_HEAP_SIZE); 117 size_t sz = 1 << (fnzb(size - 1) + 1); 118 if (last_allocated == 0) 119 last_allocated = get_max_heap_addr(); 180 120 181 121 /* 182 122 * Make sure we allocate from naturally aligned address. 183 123 */ 184 i = 0; 185 if (!last_allocated) { 186 last_allocated = (void *) ALIGN_UP((void *) &_heap + 187 maxheapsize, asz); 188 } else { 189 last_allocated = (void *) ALIGN_UP(((uintptr_t) 190 last_allocated) + (int) (i > 0), asz); 191 } 192 193 res = last_allocated; 194 last_allocated += ALIGN_UP(sz, PAGE_SIZE); 195 196 return res; 124 uintptr_t res = ALIGN_UP(last_allocated, sz); 125 last_allocated = res + ALIGN_UP(size, PAGE_SIZE); 126 127 return ((void *) res); 197 128 } 198 129 -
uspace/lib/libc/generic/async.c
r6db6fd1 rdb24058 739 739 * @return Zero on success or an error code. 740 740 */ 741 int _ async_init(void)741 int __async_init(void) 742 742 { 743 743 if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1, -
uspace/lib/libc/generic/getopt.c
r6db6fd1 rdb24058 48 48 int optopt = '?'; /* character checked for validity */ 49 49 int optreset; /* reset getopt */ 50 c har *optarg; /* argument associated with option */50 const char *optarg; /* argument associated with option */ 51 51 52 52 … … 163 163 const char *options; 164 164 { 165 c har *oli; /* option letter list index */165 const char *oli; /* option letter list index */ 166 166 int optchar; 167 167 … … 276 276 optarg = NULL; 277 277 if (*place) /* no white space */ 278 optarg = *place;278 optarg = place; 279 279 /* XXX: disable test for :: if PC? (GNU doesn't) */ 280 280 else if (oli[1] != ':') { /* arg not optional */ … … 354 354 retval = getopt_internal(nargc, (char **)nargv, options); 355 355 if (retval == -2) { 356 char *current_argv, *has_equal; 356 char *current_argv; 357 const char *has_equal; 357 358 size_t current_argv_len; 358 359 int i, ambiguous, match; -
uspace/lib/libc/generic/io/io.c
r6db6fd1 rdb24058 90 90 static LIST_INITIALIZE(files); 91 91 92 void stdio_init(int filc, fdi_node_t *filv[])92 void __stdio_init(int filc, fdi_node_t *filv[]) 93 93 { 94 94 if (filc > 0) { … … 114 114 } 115 115 116 void stdio_done(void)116 void __stdio_done(void) 117 117 { 118 118 link_t *link = files.next; -
uspace/lib/libc/generic/libc.c
r6db6fd1 rdb24058 53 53 #include <loader/pcb.h> 54 54 55 extern char _heap;56 55 extern int main(int argc, char *argv[]); 57 58 int _errno;59 56 60 57 void _exit(int status) … … 65 62 void __main(void *pcb_ptr) 66 63 { 67 (void) as_area_create(&_heap, 1, AS_AREA_WRITE | AS_AREA_READ); 68 69 _async_init(); 64 __heap_init(); 65 __async_init(); 70 66 fibril_t *fibril = fibril_setup(); 71 67 __tcb_set(fibril->tcb); … … 80 76 argc = 0; 81 77 argv = NULL; 82 stdio_init(0, NULL);78 __stdio_init(0, NULL); 83 79 } else { 84 80 argc = __pcb->argc; 85 81 argv = __pcb->argv; 86 stdio_init(__pcb->filc, __pcb->filv);82 __stdio_init(__pcb->filc, __pcb->filv); 87 83 } 88 84 89 85 main(argc, argv); 90 stdio_done();86 __stdio_done(); 91 87 } 92 88 -
uspace/lib/libc/generic/mman.c
r6db6fd1 rdb24058 38 38 #include <unistd.h> 39 39 40 void *mmap(void 40 void *mmap(void *start, size_t length, int prot, int flags, int fd, 41 41 off_t offset) 42 42 { … … 44 44 start = as_get_mappable_page(length); 45 45 46 // if (! 46 // if (!((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) 47 47 // return MAP_FAILED; 48 if (! (flags & MAP_ANONYMOUS)) 48 49 if (!(flags & MAP_ANONYMOUS)) 49 50 return MAP_FAILED; 50 51 51 52 return as_area_create(start, length, prot); 52 53 }
Note:
See TracChangeset
for help on using the changeset viewer.