Changeset db24058 in mainline
- 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
- Files:
-
- 2 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/Makefile
r6db6fd1 rdb24058 50 50 generic/devmap.c \ 51 51 generic/event.c \ 52 generic/errno.c \ 52 53 generic/mem.c \ 53 54 generic/string.c \ … … 69 70 generic/io/printf_core.c \ 70 71 generic/io/console.c \ 71 malloc/malloc.c \72 generic/malloc.c \ 72 73 generic/sysinfo.c \ 73 74 generic/ipc.c \ … … 106 107 clean: 107 108 -rm -f include/kernel include/arch include/libarch libc.a arch/$(UARCH)/_link.ld Makefile.depend 108 find generic/ arch/$(UARCH)/ malloc-name '*.o' -follow -exec rm \{\} \;109 find generic/ arch/$(UARCH)/ -name '*.o' -follow -exec rm \{\} \; 109 110 110 111 depend: kerninc -
uspace/lib/libc/arch/ia64/Makefile.inc
r6db6fd1 rdb24058 38 38 arch/$(UARCH)/src/ddi.c 39 39 40 CFLAGS += -fno-unwind-tables -DMALLOC_ALIGNMENT_1640 CFLAGS += -fno-unwind-tables 41 41 LFLAGS += -N $(SOFTINT_PREFIX)/libsoftint.a 42 42 -
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 } -
uspace/lib/libc/include/async.h
r6db6fd1 rdb24058 47 47 extern atomic_t async_futex; 48 48 49 extern int __async_init(void); 50 extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); 51 52 static inline ipc_callid_t async_get_call(ipc_call_t *data) 53 { 54 return async_get_call_timeout(data, 0); 55 } 56 49 57 static inline void async_manager(void) 50 58 { 51 59 fibril_switch(FIBRIL_TO_MANAGER); 52 }53 54 extern ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs);55 56 static inline ipc_callid_t async_get_call(ipc_call_t *data)57 {58 return async_get_call_timeout(data, 0);59 60 } 60 61 … … 95 96 extern void async_create_manager(void); 96 97 extern void async_destroy_manager(void); 97 extern int _async_init(void);98 98 99 99 extern void async_set_client_connection(async_client_conn_t conn); -
uspace/lib/libc/include/bitops.h
r6db6fd1 rdb24058 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ … … 43 43 * If number is zero, it returns 0 44 44 */ 45 static inline int fnzb32(uint32_t arg)45 static inline unsigned int fnzb32(uint32_t arg) 46 46 { 47 int n = 0;48 47 unsigned int n = 0; 48 49 49 if (arg >> 16) { 50 50 arg >>= 16; … … 75 75 } 76 76 77 static inline int fnzb64(uint64_t arg)77 static inline unsigned int fnzb64(uint64_t arg) 78 78 { 79 int n = 0;80 79 unsigned int n = 0; 80 81 81 if (arg >> 32) { 82 82 arg >>= 32; … … 84 84 } 85 85 86 return n + fnzb32((uint32_t) arg);86 return (n + fnzb32((uint32_t) arg)); 87 87 } 88 88 89 #define fnzb(x) fnzb32(x) 89 static inline unsigned int fnzb(size_t arg) 90 { 91 return fnzb64(arg); 92 } 90 93 91 94 #endif -
uspace/lib/libc/include/errno.h
r6db6fd1 rdb24058 36 36 #define LIBC_ERRNO_H_ 37 37 38 /* TODO: support threads/fibrils */ 38 #include <kernel/errno.h> 39 #include <fibril.h> 40 39 41 extern int _errno; 42 40 43 #define errno _errno 41 42 #include <kernel/errno.h>43 44 44 45 #define EMFILE (-17) -
uspace/lib/libc/include/getopt.h
r6db6fd1 rdb24058 59 59 60 60 /* HelenOS Port - These need to be exposed for legacy getopt() */ 61 extern c har *optarg;61 extern const char *optarg; 62 62 extern int optind, opterr, optopt; 63 63 extern int optreset; -
uspace/lib/libc/include/macros.h
r6db6fd1 rdb24058 36 36 #define LIBC_MACROS_H_ 37 37 38 #define min(a, b) ((a) < (b) ? (a) : (b)) 39 #define max(a, b) ((a) > (b) ? (a) : (b)) 40 38 41 #define SIZE2KB(size) ((size) >> 10) 39 42 #define SIZE2MB(size) ((size) >> 20) -
uspace/lib/libc/include/mem.h
r6db6fd1 rdb24058 40 40 #define bzero(ptr, len) memset((ptr), 0, (len)) 41 41 42 extern void * 43 extern void * 44 extern void * 42 extern void *memset(void *, int, size_t); 43 extern void *memcpy(void *, const void *, size_t); 44 extern void *memmove(void *, const void *, size_t); 45 45 46 46 extern int bcmp(const char *, const char *, size_t); -
uspace/lib/libc/include/stdio.h
r6db6fd1 rdb24058 38 38 #include <sys/types.h> 39 39 #include <stdarg.h> 40 #include <string.h> 40 41 #include <adt/list.h> 41 42 … … 43 44 44 45 /** Default size for stream I/O buffers */ 45 #define BUFSIZ 409646 #define BUFSIZ 4096 46 47 47 48 #define DEBUG(fmt, ...) \ 48 { \49 charbuf[256]; \50 int n = snprintf(buf, sizeof(buf), fmt, ##__VA_ARGS__); \51 if (n > 0) \52 (void) __SYSCALL3(SYS_KLOG, 1, (sysarg_t) buf, str_size(buf)); \53 }49 { \ 50 char _buf[256]; \ 51 int _n = snprintf(_buf, sizeof(_buf), fmt, ##__VA_ARGS__); \ 52 if (_n > 0) \ 53 (void) __SYSCALL3(SYS_KLOG, 1, (sysarg_t) _buf, str_size(_buf)); \ 54 } 54 55 55 56 #ifndef SEEK_SET -
uspace/lib/libc/include/stdlib.h
r6db6fd1 rdb24058 39 39 #include <malloc.h> 40 40 41 #define abort() _exit(1)42 #define exit(status) 41 #define abort() _exit(1) 42 #define exit(status) _exit((status)) 43 43 44 #define RAND_MAX 71402544 #define RAND_MAX 714025 45 45 46 46 extern long int random(void); … … 51 51 return random(); 52 52 } 53 53 54 static inline void srand(unsigned int seed) 54 55 { -
uspace/lib/libc/include/unistd.h
r6db6fd1 rdb24058 66 66 67 67 extern void _exit(int status) __attribute__ ((noreturn)); 68 extern void *sbrk(ssize_t incr);69 68 extern int usleep(unsigned long usec); 70 69 extern unsigned int sleep(unsigned int seconds); -
uspace/lib/libc/include/vfs/vfs.h
r6db6fd1 rdb24058 56 56 unsigned int); 57 57 58 extern void stdio_init(int filc, fdi_node_t *filv[]);59 extern void stdio_done(void);58 extern void __stdio_init(int filc, fdi_node_t *filv[]); 59 extern void __stdio_done(void); 60 60 61 61 extern int open_node(fdi_node_t *, int);
Note:
See TracChangeset
for help on using the changeset viewer.