Changeset df3c6f02 in mainline for uspace/lib/c
- Timestamp:
- 2011-05-31T22:58:56Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d362410
- Parents:
- 82582e4 (diff), 4ce90544 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/lib/c
- Files:
-
- 18 added
- 55 edited
- 12 moved
-
Makefile (modified) (4 diffs)
-
arch/abs32le/Makefile.inc (modified) (1 diff)
-
arch/abs32le/_link.ld.in (modified) (1 diff)
-
arch/abs32le/src/entryjmp.c (moved) (moved from uspace/srv/loader/arch/abs32le/abs32le.c ) (1 diff)
-
arch/amd64/Makefile.inc (modified) (1 diff)
-
arch/amd64/_link.ld.in (modified) (2 diffs)
-
arch/amd64/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/amd64/amd64.s ) (1 diff)
-
arch/arm32/Makefile.inc (modified) (1 diff)
-
arch/arm32/_link.ld.in (modified) (1 diff)
-
arch/arm32/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/arm32/arm32.s ) (1 diff)
-
arch/ia32/Makefile.common (modified) (1 diff)
-
arch/ia32/Makefile.inc (modified) (2 diffs)
-
arch/ia32/_link.ld.in (modified) (4 diffs)
-
arch/ia32/include/config.h (modified) (1 diff)
-
arch/ia32/include/ddi.h (modified) (1 diff)
-
arch/ia32/include/faddr.h (modified) (1 diff)
-
arch/ia32/include/fibril.h (modified) (2 diffs)
-
arch/ia32/include/rtld/dynamic.h (moved) (moved from uspace/srv/loader/include/arch.h ) (1 diff)
-
arch/ia32/include/rtld/elf_dyn.h (added)
-
arch/ia32/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/ia32/ia32.s ) (1 diff)
-
arch/ia32/src/rtld/dynamic.c (added)
-
arch/ia32/src/rtld/reloc.c (added)
-
arch/ia32/src/stacktrace.c (modified) (1 diff)
-
arch/ia32/src/syscall.S (modified) (3 diffs)
-
arch/ia32/src/tls.c (modified) (2 diffs)
-
arch/ia64/Makefile.inc (modified) (1 diff)
-
arch/ia64/_link.ld.in (modified) (2 diffs)
-
arch/ia64/src/entry.s (modified) (1 diff)
-
arch/ia64/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/ia64/ia64.s ) (1 diff)
-
arch/ia64/src/thread_entry.s (modified) (1 diff)
-
arch/mips32/Makefile.inc (modified) (1 diff)
-
arch/mips32/_link.ld.in (modified) (1 diff)
-
arch/mips32/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/mips32/mips32.s ) (1 diff)
-
arch/mips32eb/Makefile.inc (modified) (1 diff)
-
arch/ppc32/Makefile.inc (modified) (1 diff)
-
arch/ppc32/_link.ld.in (modified) (2 diffs)
-
arch/ppc32/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/ppc32/ppc32.s ) (1 diff)
-
arch/sparc64/Makefile.inc (modified) (1 diff)
-
arch/sparc64/_link.ld.in (modified) (1 diff)
-
arch/sparc64/src/entryjmp.s (moved) (moved from uspace/srv/loader/arch/sparc64/sparc64.s ) (1 diff)
-
generic/adt/prodcons.c (added)
-
generic/as.c (modified) (3 diffs)
-
generic/assert.c (added)
-
generic/async.c (modified) (1 diff)
-
generic/async_sess.c (modified) (1 diff)
-
generic/dlfcn.c (added)
-
generic/errno.c (modified) (1 diff)
-
generic/event.c (modified) (1 diff)
-
generic/fibril_synch.c (modified) (1 diff)
-
generic/io/klog.c (modified) (2 diffs)
-
generic/io/vprintf.c (modified) (1 diff)
-
generic/libc.c (modified) (2 diffs)
-
generic/malloc.c (modified) (32 diffs)
-
generic/rtld/dynamic.c (added)
-
generic/rtld/elf_load.c (added)
-
generic/rtld/module.c (added)
-
generic/rtld/rtld.c (added)
-
generic/rtld/symbol.c (added)
-
generic/stacktrace.c (modified) (1 diff)
-
generic/str.c (modified) (2 diffs)
-
generic/thread.c (modified) (1 diff)
-
include/adt/fifo.h (modified) (1 diff)
-
include/adt/list.h (modified) (11 diffs)
-
include/adt/measured_strings.h (modified) (1 diff)
-
include/adt/prodcons.h (added)
-
include/as.h (modified) (1 diff)
-
include/assert.h (modified) (3 diffs)
-
include/dlfcn.h (moved) (moved from kernel/test/fpu/mips2_skip.c ) (2 diffs)
-
include/entry_point.h (moved) (moved from kernel/arch/sparc64/include/mm/cache.h ) (3 diffs)
-
include/errno.h (modified) (1 diff)
-
include/event.h (modified) (1 diff)
-
include/fibril.h (modified) (1 diff)
-
include/fibril_synch.h (modified) (2 diffs)
-
include/io/klog.h (modified) (1 diff)
-
include/loader/pcb.h (modified) (1 diff)
-
include/macros.h (modified) (1 diff)
-
include/malloc.h (modified) (1 diff)
-
include/rtld/dynamic.h (added)
-
include/rtld/elf_dyn.h (added)
-
include/rtld/module.h (added)
-
include/rtld/rtld.h (added)
-
include/rtld/rtld_arch.h (added)
-
include/rtld/rtld_debug.h (added)
-
include/rtld/symbol.h (moved) (moved from kernel/test/fpu/sse1_skip.c ) (2 diffs)
-
include/str.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/Makefile
r82582e4 rdf3c6f02 41 41 CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config 42 42 43 LINKER_SCRIPTS = \ 44 $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld \ 45 $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld \ 46 $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld \ 47 $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld 48 43 49 PRE_DEPEND = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) 44 EXTRA_OUTPUT = $(LINKER_SCRIPT )45 EXTRA_CLEAN = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) $(LINKER_SCRIPT )50 EXTRA_OUTPUT = $(LINKER_SCRIPTS) 51 EXTRA_CLEAN = $(INCLUDE_KERNEL) $(INCLUDE_ARCH) $(INCLUDE_LIBARCH) $(COMMON_HEADER_ARCH) $(LINKER_SCRIPTS) 46 52 LIBRARY = libc 53 SLIBRARY = libc.so.0.0 54 LSONAME = libc.so0 55 47 56 48 57 -include $(COMMON_MAKEFILE) 49 58 -include $(CONFIG_MAKEFILE) 50 59 -include arch/$(UARCH)/Makefile.inc 60 61 EXTRA_CFLAGS += -I../../srv/loader/include 51 62 52 63 GENERIC_SOURCES = \ … … 97 108 generic/adt/measured_strings.c \ 98 109 generic/adt/char_map.c \ 110 generic/adt/prodcons.c \ 99 111 generic/time.c \ 100 112 generic/stdlib.c \ … … 113 125 generic/arg_parse.c \ 114 126 generic/sort.c \ 115 generic/stats.c 127 generic/stats.c \ 128 generic/assert.c 129 130 ifeq ($(CONFIG_RTLD), y) 131 GENERIC_SOURCES += \ 132 generic/dlfcn.c \ 133 generic/rtld/rtld.c \ 134 generic/rtld/elf_load.c \ 135 generic/rtld/dynamic.c \ 136 generic/rtld/module.c \ 137 generic/rtld/symbol.c 138 endif 116 139 117 140 SOURCES = \ … … 132 155 ln -sfn ../$< $@ 133 156 134 $(LI NKER_SCRIPT): $(LINKER_SCRIPT).in157 $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 135 158 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -E -x c $< | grep -v "^\#" > $@ 159 160 $(LIBC_PREFIX)/arch/$(UARCH)/_link-loader.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 161 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DLOADER -E -x c $< | grep -v "^\#" > $@ 162 163 $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 164 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DSHLIB -E -x c $< | grep -v "^\#" > $@ 165 166 $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in 167 $(GCC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DDLEXE -E -x c $< | grep -v "^\#" > $@ 136 168 137 169 $(COMMON_HEADER_ARCH): $(COMMON_HEADER) -
uspace/lib/c/arch/abs32le/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.c \ 31 arch/$(UARCH)/src/entryjmp.c \ 31 32 arch/$(UARCH)/src/thread_entry.c \ 32 33 arch/$(UARCH)/src/fibril.c \ -
uspace/lib/c/arch/abs32le/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 } 8 13 9 14 SECTIONS { 15 #ifdef LOADER 16 .interp : { 17 *(.interp); 18 } :interp 19 20 . = 0x70001000 + SIZEOF_HEADERS; 21 #else 10 22 . = 0x1000 + SIZEOF_HEADERS; 11 23 #endif 12 24 .text : { 13 25 *(.text .text.*); -
uspace/lib/c/arch/abs32le/src/entryjmp.c
r82582e4 rdf3c6f02 31 31 32 32 #include <bool.h> 33 #include "arch.h"33 #include <entry_point.h> 34 34 35 void program_run(void *entry_point, void *pcb) 35 /** Jump to program entry point. */ 36 void entry_point_jmp(void *entry_point, void *pcb) 36 37 { 37 38 while (true); -
uspace/lib/c/arch/amd64/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.S \ -
uspace/lib/c/arch/amd64/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 debug PT_NOTE; … … 9 14 10 15 SECTIONS { 16 #ifdef LOADER 17 .interp : { 18 *(.interp); 19 } :interp 20 21 . = 0x70001000 + SIZEOF_HEADERS; 22 #else 11 23 . = 0x1000 + SIZEOF_HEADERS; 12 24 #endif 13 25 .init : { 14 26 *(.init); -
uspace/lib/c/arch/amd64/src/entryjmp.s
r82582e4 rdf3c6f02 27 27 # 28 28 29 .globl program_run29 .globl entry_point_jmp 30 30 31 ## void program_run(void *entry_point, void *pcb);31 ## void entry_point_jmp(void *entry_point, void *pcb); 32 32 # 33 33 # %rdi contains entry_point 34 34 # %rsi contains pcb 35 35 # 36 # Jump to aprogram entry point37 program_run:36 # Jump to program entry point 37 entry_point_jmp: 38 38 # pcb must be passed in %rdi, use %rdx as a scratch register 39 39 mov %rdi, %rdx -
uspace/lib/c/arch/arm32/Makefile.inc
r82582e4 rdf3c6f02 30 30 ARCH_SOURCES = \ 31 31 arch/$(UARCH)/src/entry.s \ 32 arch/$(UARCH)/src/entryjmp.s \ 32 33 arch/$(UARCH)/src/thread_entry.s \ 33 34 arch/$(UARCH)/src/syscall.c \ -
uspace/lib/c/arch/arm32/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 } 8 13 9 14 SECTIONS { 15 #ifdef LOADER 16 .interp : { 17 *(.interp); 18 } :interp 19 20 . = 0x70001000 + SIZEOF_HEADERS; 21 #else 10 22 . = 0x1000 + SIZEOF_HEADERS; 11 23 #endif 12 24 .init : { 13 25 *(.init); -
uspace/lib/c/arch/arm32/src/entryjmp.s
r82582e4 rdf3c6f02 27 27 # 28 28 29 .globl program_run29 .globl entry_point_jmp 30 30 31 ## void program_run(void *entry_point, void *pcb);31 ## void entry_point_jmp(void *entry_point, void *pcb); 32 32 # 33 33 # r0 contains entry_point 34 34 # r1 contains pcb 35 35 # 36 # Jump to aprogram entry point37 program_run:36 # Jump to program entry point 37 entry_point_jmp: 38 38 # load ras_page address to r2 39 39 ldr r2, =ras_page -
uspace/lib/c/arch/ia32/Makefile.common
r82582e4 rdf3c6f02 28 28 29 29 CLANG_ARCH = i386 30 GCC_CFLAGS += -march=pentium 30 GCC_CFLAGS += -march=pentium -fno-omit-frame-pointer 31 31 32 32 ENDIANESS = LE -
uspace/lib/c/arch/ia32/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.S \ … … 35 36 arch/$(UARCH)/src/setjmp.S \ 36 37 arch/$(UARCH)/src/stacktrace.c \ 37 arch/$(UARCH)/src/stacktrace_asm.S 38 arch/$(UARCH)/src/stacktrace_asm.S \ 39 arch/$(UARCH)/src/rtld/dynamic.c \ 40 arch/$(UARCH)/src/rtld/reloc.c 38 41 39 42 .PRECIOUS: arch/$(UARCH)/src/entry.o -
uspace/lib/c/arch/ia32/_link.ld.in
r82582e4 rdf3c6f02 1 #ifndef SHLIB 1 2 STARTUP(LIBC_PATH/arch/UARCH/src/entry.o) 2 3 ENTRY(__entry) 4 #endif 3 5 4 6 PHDRS { 7 #if defined(LOADER) || defined(DLEXE) 8 interp PT_INTERP; 9 text PT_LOAD FILEHDR PHDRS FLAGS(5); 10 #else 5 11 text PT_LOAD FLAGS(5); 12 #endif 6 13 data PT_LOAD FLAGS(6); 14 #if defined(SHLIB) || defined(DLEXE) 15 dynamic PT_DYNAMIC; 16 #endif 7 17 debug PT_NOTE; 8 18 } 9 19 10 20 SECTIONS { 21 #if defined(LOADER) || defined(DLEXE) 22 .interp : { 23 *(.interp); 24 } :interp 25 #endif 26 #ifdef LOADER 27 . = 0x70001000 + SIZEOF_HEADERS; 28 #else 11 29 . = 0x1000 + SIZEOF_HEADERS; 12 30 #endif 13 31 .init : { 14 32 *(.init); … … 19 37 *(.rodata .rodata.*); 20 38 } :text 39 40 #if defined(SHLIB) || defined(DLEXE) 41 .rel.plt : { 42 *(.rel.plt); 43 } 44 /* 45 *.rel.dyn MUST FOLLOW IMMEDIATELY after .rel.plt 46 * without alignment gap or DT_REL will be broken 47 */ 48 .rel.dyn : { 49 *(.rel.*); 50 } :text 21 51 52 .plt : { 53 *(.plt); 54 } :text 55 56 .dynsym : { 57 *(.dynsym); 58 } :text 59 60 .dynstr : { 61 *(.dynstr); 62 } :text 63 64 .hash : { 65 *(.hash); 66 } :text 67 #endif 22 68 . = . + 0x1000; 69 70 #if defined(SHLIB) || defined(DLEXE) 71 .dynamic : { 72 *(.dynamic); 73 } :data :dynamic 74 #endif 23 75 24 76 .data : { … … 26 78 } :data 27 79 80 #if defined(SHLIB) || defined(DLEXE) 81 .data.rel : { 82 *(.data.rel .data.rel.*); 83 } :data 84 85 .got : { 86 *(.got); 87 } :data 88 .got.plt : { 89 *(.got.plt); 90 } :data 91 #endif 92 93 #ifndef DLEXE 28 94 .tdata : { 29 95 _tdata_start = .; … … 37 103 38 104 _tls_alignment = ALIGNOF(.tdata); 105 #endif 39 106 40 107 .bss : { 108 *(.dynbss); 41 109 *(COMMON); 42 110 *(.bss); -
uspace/lib/c/arch/ia32/include/config.h
r82582e4 rdf3c6f02 36 36 #define LIBC_ia32_CONFIG_H_ 37 37 38 #define PAGE_WIDTH 12 39 #define PAGE_SIZE (1 << PAGE_WIDTH) 38 #define PAGE_WIDTH 12 39 #define PAGE_SIZE (1 << PAGE_WIDTH) 40 41 #define USER_ADDRESS_SPACE_START_ARCH UINT32_C(0x00000000) 42 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 40 43 41 44 #endif -
uspace/lib/c/arch/ia32/include/ddi.h
r82582e4 rdf3c6f02 37 37 #include <libarch/types.h> 38 38 39 #define IO_SPACE_BOUNDARY ((void *) (64 * 1024))39 #define IO_SPACE_BOUNDARY ((void *) (64 * 1024)) 40 40 41 41 static inline uint8_t pio_read_8(ioport8_t *port) -
uspace/lib/c/arch/ia32/include/faddr.h
r82582e4 rdf3c6f02 38 38 #include <libarch/types.h> 39 39 40 #define FADDR(fptr) ((uintptr_t) (fptr))40 #define FADDR(fptr) ((uintptr_t) (fptr)) 41 41 42 42 #endif -
uspace/lib/c/arch/ia32/include/fibril.h
r82582e4 rdf3c6f02 42 42 * panic sooner or later 43 43 */ 44 #define SP_DELTA (12)44 #define SP_DELTA 12 45 45 46 46 #define context_set(c, _pc, stack, size, ptls) \ … … 51 51 (c)->ebp = 0; \ 52 52 } while (0) 53 54 /* We include only registers that must be preserved 53 54 /* 55 * We include only registers that must be preserved 55 56 * during function call 56 57 */ -
uspace/lib/c/arch/ia32/include/rtld/dynamic.h
r82582e4 rdf3c6f02 27 27 */ 28 28 29 /** @addtogroup fs29 /** @addtogroup generic 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief34 33 */ 35 34 36 #ifndef L OADER_ARCH_H_37 #define L OADER_ARCH_H_35 #ifndef LIBC_ia32_RTLD_DYNAMIC_H_ 36 #define LIBC_ia32_RTLD_DYNAMIC_H_ 38 37 39 extern void program_run(void *entry_point, void *pcb); 38 #include <sys/types.h> 39 40 typedef struct { 41 /* Empty. */ 42 } dyn_info_arch_t; 40 43 41 44 #endif 42 45 43 /** 44 * @} 46 /** @} 45 47 */ -
uspace/lib/c/arch/ia32/src/entryjmp.s
r82582e4 rdf3c6f02 27 27 # 28 28 29 .globl program_run29 .globl entry_point_jmp 30 30 31 ## void program_run(void *entry_point, void *pcb);31 ## void entry_point_jmp(void *entry_point, void *pcb); 32 32 # 33 # Jump to aprogram entry point34 program_run:33 # Jump to program entry point 34 entry_point_jmp: 35 35 # Use standard ia32 prologue not to confuse anybody 36 36 push %ebp -
uspace/lib/c/arch/ia32/src/stacktrace.c
r82582e4 rdf3c6f02 35 35 */ 36 36 37 #include <libarch/config.h> 37 38 #include <sys/types.h> 38 39 #include <bool.h> 39 40 40 #include <stacktrace.h> 41 41 42 #define FRAME_OFFSET_FP_PREV 043 #define FRAME_OFFSET_RA 442 #define FRAME_OFFSET_FP_PREV 0 43 #define FRAME_OFFSET_RA 4 44 44 45 45 bool stacktrace_fp_valid(stacktrace_t *st, uintptr_t fp) 46 46 { 47 47 (void) st; 48 return fp != 0;48 return (fp != 0) && (fp <= USER_ADDRESS_SPACE_END_ARCH); 49 49 } 50 50 -
uspace/lib/c/arch/ia32/src/syscall.S
r82582e4 rdf3c6f02 32 32 __syscall_fast_func: 33 33 .long __syscall_slow 34 .size __syscall_fast_func, . - __syscall_fast_func 34 35 35 36 .text … … 71 72 */ 72 73 .global __syscall_fast 74 .type __syscall_fast, @function 75 73 76 __syscall_fast: 74 77 pushl %ebx … … 95 98 popl %ebx 96 99 ret 100 101 .size __syscall_fast, . - __syscall_fast -
uspace/lib/c/arch/ia32/src/tls.c
r82582e4 rdf3c6f02 37 37 #include <tls.h> 38 38 #include <sys/types.h> 39 #include <align.h> 39 40 40 41 tcb_t * __alloc_tls(void **data, size_t size) … … 48 49 } 49 50 51 /* 52 * Rtld TLS support 53 */ 54 55 typedef struct { 56 unsigned long int ti_module; 57 unsigned long int ti_offset; 58 } tls_index; 59 60 void __attribute__ ((__regparm__ (1))) 61 *___tls_get_addr(tls_index *ti); 62 63 void __attribute__ ((__regparm__ (1))) 64 *___tls_get_addr(tls_index *ti) 65 { 66 size_t tls_size; 67 uint8_t *tls; 68 69 /* Calculate size of TLS block */ 70 tls_size = ALIGN_UP(&_tbss_end - &_tdata_start, &_tls_alignment); 71 72 /* The TLS block is just before TCB */ 73 tls = (uint8_t *)__tcb_get() - tls_size; 74 75 return tls + ti->ti_offset; 76 } 77 50 78 /** @} 51 79 */ -
uspace/lib/c/arch/ia64/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.S \ -
uspace/lib/c/arch/ia64/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 5 7 text PT_LOAD FLAGS(5); 8 #else 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 } 8 13 9 14 SECTIONS { 15 #ifdef LOADER 16 .interp : { 17 *(.interp); 18 } :interp 19 20 . = 0x800000000 + SIZEOF_HEADERS; 21 #else 10 22 . = 0x4000 + SIZEOF_HEADERS; 11 23 #endif 24 /* 25 * XXX This is just a work around. Problem: .init section does not 26 * have the proper alignment. 27 */ 28 . = ALIGN(., 16); 29 12 30 .init : { 13 31 *(.init); … … 22 40 23 41 .got : { 24 _gp = .; 42 /* Tell the linker where we expect GP to point. */ 43 __gp = .; 25 44 *(.got .got.*); 26 45 } :data -
uspace/lib/c/arch/ia64/src/entry.s
r82582e4 rdf3c6f02 39 39 __entry: 40 40 alloc loc0 = ar.pfs, 0, 1, 2, 0 41 movl gp = _ gp41 movl gp = __gp 42 42 43 43 # Pass PCB pointer as the first argument to __main -
uspace/lib/c/arch/ia64/src/entryjmp.s
r82582e4 rdf3c6f02 28 28 29 29 .text 30 .globl program_run30 .globl entry_point_jmp 31 31 32 ## void program_run(void *entry_point, void *pcb);32 ## void entry_point_jmp(void *entry_point, void *pcb); 33 33 # 34 34 # in0 (r32) contains entry_point 35 35 # in1 (r33) contains pcb 36 36 # 37 # Jump to aprogram entry point38 program_run:37 # Jump to program entry point 38 entry_point_jmp: 39 39 # Pass pcb to the entry point in r2 40 40 -
uspace/lib/c/arch/ia64/src/thread_entry.s
r82582e4 rdf3c6f02 37 37 alloc loc0 = ar.pfs, 0, 1, 1, 0 38 38 39 movl gp = _ gp39 movl gp = __gp 40 40 41 41 # -
uspace/lib/c/arch/mips32/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.c \ -
uspace/lib/c/arch/mips32/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 } 8 13 9 14 SECTIONS { 15 #ifdef LOADER 16 .interp : { 17 *(.interp); 18 } :interp 19 20 . = 0x70004000 + SIZEOF_HEADERS; 21 #else 10 22 . = 0x4000 + SIZEOF_HEADERS; 11 23 #endif 12 24 .init : { 13 25 *(.init); -
uspace/lib/c/arch/mips32/src/entryjmp.s
r82582e4 rdf3c6f02 29 29 .text 30 30 .section .text 31 .global program_run31 .global entry_point_jmp 32 32 .set noreorder 33 33 34 ## void program_run(void *entry_point, void *pcb);34 ## void entry_point_jmp(void *entry_point, void *pcb); 35 35 # 36 36 # $a0 (=$4) contains entry_point 37 37 # $a1 (=$5) contains pcb 38 38 # 39 # Jump to aprogram entry point40 .ent program_run41 program_run:39 # Jump to program entry point 40 .ent entry_point_jmp 41 entry_point_jmp: 42 42 # tmp := entry_point 43 43 move $25, $a0 -
uspace/lib/c/arch/mips32eb/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.c \ -
uspace/lib/c/arch/ppc32/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/syscall.c \ -
uspace/lib/c/arch/ppc32/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 12 debug PT_NOTE; 7 13 } 8 14 9 15 SECTIONS { 16 #ifdef LOADER 17 .interp : { 18 *(.interp); 19 } :interp 20 21 . = 0x70001000 + SIZEOF_HEADERS; 22 #else 10 23 . = 0x1000 + SIZEOF_HEADERS; 11 24 #endif 12 25 .init : { 13 26 *(.init); … … 43 56 } :data 44 57 58 #ifdef CONFIG_LINE_DEBUG 59 .comment 0 : { *(.comment); } :debug 60 .debug_abbrev 0 : { *(.debug_abbrev); } :debug 61 .debug_aranges 0 : { *(.debug_aranges); } :debug 62 .debug_info 0 : { *(.debug_info); } :debug 63 .debug_line 0 : { *(.debug_line); } :debug 64 .debug_loc 0 : { *(.debug_loc); } :debug 65 .debug_pubnames 0 : { *(.debug_pubnames); } :debug 66 .debug_pubtypes 0 : { *(.debug_pubtypes); } :debug 67 .debug_ranges 0 : { *(.debug_ranges); } :debug 68 .debug_str 0 : { *(.debug_str); } :debug 69 #endif 70 45 71 /DISCARD/ : { 46 72 *(*); -
uspace/lib/c/arch/ppc32/src/entryjmp.s
r82582e4 rdf3c6f02 27 27 # 28 28 29 .globl program_run29 .globl entry_point_jmp 30 30 31 ## void program_run(void *entry_point, void *pcb);31 ## void entry_point_jmp(void *entry_point, void *pcb); 32 32 # 33 33 # %r3 contains entry_point 34 34 # %r4 contains pcb 35 35 # 36 # Jump to aprogram entry point37 program_run:36 # Jump to program entry point 37 entry_point_jmp: 38 38 mtctr %r3 39 39 mr %r6, %r4 # Pass pcb to the entry point in %r6 -
uspace/lib/c/arch/sparc64/Makefile.inc
r82582e4 rdf3c6f02 29 29 ARCH_SOURCES = \ 30 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/entryjmp.s \ 31 32 arch/$(UARCH)/src/thread_entry.s \ 32 33 arch/$(UARCH)/src/fibril.S \ -
uspace/lib/c/arch/sparc64/_link.ld.in
r82582e4 rdf3c6f02 3 3 4 4 PHDRS { 5 #ifdef LOADER 6 interp PT_INTERP; 7 text PT_LOAD FILEHDR PHDRS FLAGS(5); 8 #else 5 9 text PT_LOAD FLAGS(5); 10 #endif 6 11 data PT_LOAD FLAGS(6); 7 12 } 8 13 9 14 SECTIONS { 15 #ifdef LOADER 16 .interp : { 17 *(.interp); 18 } :interp 19 20 . = 0x70004000 + SIZEOF_HEADERS; 21 #else 10 22 . = 0x4000 + SIZEOF_HEADERS; 11 23 #endif 12 24 .init : { 13 25 *(.init); -
uspace/lib/c/arch/sparc64/src/entryjmp.s
r82582e4 rdf3c6f02 27 27 # 28 28 29 .globl program_run29 .globl entry_point_jmp 30 30 31 ## void program_run(void *entry_point, void *pcb);31 ## void entry_point_jmp(void *entry_point, void *pcb); 32 32 # 33 33 # %o0 contains entry_point 34 34 # %o1 contains pcb 35 35 # 36 # Jump to aprogram entry point37 program_run:36 # Jump to program entry point 37 entry_point_jmp: 38 38 # Pass pcb pointer to entry point in %o1. As it is already 39 39 # there, no action is needed. -
uspace/lib/c/generic/as.c
r82582e4 rdf3c6f02 51 51 * 52 52 */ 53 void *as_area_create(void *address, size_t size, int flags)53 void *as_area_create(void *address, size_t size, unsigned int flags) 54 54 { 55 55 return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t) address, … … 67 67 * 68 68 */ 69 int as_area_resize(void *address, size_t size, int flags)69 int as_area_resize(void *address, size_t size, unsigned int flags) 70 70 { 71 71 return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t) address, … … 95 95 * 96 96 */ 97 int as_area_change_flags(void *address, int flags)97 int as_area_change_flags(void *address, unsigned int flags) 98 98 { 99 99 return __SYSCALL2(SYS_AS_AREA_CHANGE_FLAGS, (sysarg_t) address, -
uspace/lib/c/generic/async.c
r82582e4 rdf3c6f02 102 102 #include <arch/barrier.h> 103 103 #include <bool.h> 104 #include <stdlib.h> 105 #include <malloc.h> 104 106 #include "private/async.h" 105 107 -
uspace/lib/c/generic/async_sess.c
r82582e4 rdf3c6f02 105 105 #include <errno.h> 106 106 #include <assert.h> 107 #include <async.h> 107 108 #include "private/async_sess.h" 108 109 -
uspace/lib/c/generic/errno.c
r82582e4 rdf3c6f02 36 36 #include <fibril.h> 37 37 38 int _errno; 38 static fibril_local int fibril_errno; 39 40 int *__errno(void) 41 { 42 return &fibril_errno; 43 } 39 44 40 45 /** @} -
uspace/lib/c/generic/event.c
r82582e4 rdf3c6f02 41 41 #include <kernel/ipc/event_types.h> 42 42 43 /** Subscribe forevent notifications.43 /** Subscribe event notifications. 44 44 * 45 * @param evno Event number.46 * @param method Use thismethod for notifying me.45 * @param evno Event type to subscribe. 46 * @param imethod Use this interface and method for notifying me. 47 47 * 48 48 * @return Value returned by the kernel. 49 * 49 50 */ 50 int event_subscribe(event_type_t e , sysarg_tmethod)51 int event_subscribe(event_type_t evno, sysarg_t imethod) 51 52 { 52 return __SYSCALL2(SYS_EVENT_SUBSCRIBE, (sysarg_t) e, (sysarg_t) method); 53 return __SYSCALL2(SYS_EVENT_SUBSCRIBE, (sysarg_t) evno, 54 (sysarg_t) imethod); 55 } 56 57 /** Unmask event notifications. 58 * 59 * @param evno Event type to unmask. 60 * 61 * @return Value returned by the kernel. 62 * 63 */ 64 int event_unmask(event_type_t evno) 65 { 66 return __SYSCALL1(SYS_EVENT_UNMASK, (sysarg_t) evno); 53 67 } 54 68 -
uspace/lib/c/generic/fibril_synch.c
r82582e4 rdf3c6f02 43 43 #include <stacktrace.h> 44 44 #include <stdlib.h> 45 #include <stdio.h> 45 46 #include "private/async.h" 46 47 -
uspace/lib/c/generic/io/klog.c
r82582e4 rdf3c6f02 38 38 #include <sys/types.h> 39 39 #include <unistd.h> 40 #include <errno.h> 40 41 #include <io/klog.h> 42 #include <io/printf_core.h> 41 43 42 44 size_t klog_write(const void *buf, size_t size) … … 55 57 } 56 58 59 /** Print formatted text to klog. 60 * 61 * @param fmt Format string 62 * 63 * \see For more details about format string see printf_core. 64 * 65 */ 66 int klog_printf(const char *fmt, ...) 67 { 68 va_list args; 69 va_start(args, fmt); 70 71 int ret = klog_vprintf(fmt, args); 72 73 va_end(args); 74 75 return ret; 76 } 77 78 static int klog_vprintf_str_write(const char *str, size_t size, void *data) 79 { 80 size_t wr = klog_write(str, size); 81 return str_nlength(str, wr); 82 } 83 84 static int klog_vprintf_wstr_write(const wchar_t *str, size_t size, void *data) 85 { 86 size_t offset = 0; 87 size_t chars = 0; 88 89 while (offset < size) { 90 char buf[STR_BOUNDS(1)]; 91 size_t sz = 0; 92 93 if (chr_encode(str[chars], buf, &sz, STR_BOUNDS(1)) == EOK) 94 klog_write(buf, sz); 95 96 chars++; 97 offset += sizeof(wchar_t); 98 } 99 100 return chars; 101 } 102 103 /** Print formatted text to klog. 104 * 105 * @param fmt Format string 106 * @param ap Format parameters 107 * 108 * \see For more details about format string see printf_core. 109 * 110 */ 111 int klog_vprintf(const char *fmt, va_list ap) 112 { 113 printf_spec_t ps = { 114 klog_vprintf_str_write, 115 klog_vprintf_wstr_write, 116 NULL 117 }; 118 119 return printf_core(fmt, &ps, ap); 120 } 121 57 122 /** @} 58 123 */ -
uspace/lib/c/generic/io/vprintf.c
r82582e4 rdf3c6f02 96 96 /** Print formatted text to stdout. 97 97 * 98 * @param file Output stream 99 * @param fmt Format string 100 * @param ap Format parameters 98 * @param fmt Format string 99 * @param ap Format parameters 101 100 * 102 101 * \see For more details about format string see printf_core. -
uspace/lib/c/generic/libc.c
r82582e4 rdf3c6f02 53 53 #include "private/io.h" 54 54 55 #ifdef CONFIG_RTLD 56 #include <rtld/rtld.h> 57 #endif 58 55 59 static bool env_setup = false; 56 60 … … 77 81 char **argv; 78 82 83 #ifdef __IN_SHARED_LIBC__ 84 if (__pcb != NULL && __pcb->rtld_runtime != NULL) { 85 runtime_env = (runtime_env_t *) __pcb->rtld_runtime; 86 } 87 #endif 79 88 /* 80 89 * Get command line arguments and initialize -
uspace/lib/c/generic/malloc.c
r82582e4 rdf3c6f02 44 44 #include <mem.h> 45 45 #include <futex.h> 46 #include <stdlib.h> 46 47 #include <adt/gcdlcm.h> 47 48 #include "private/malloc.h" … … 63 64 */ 64 65 #define BASE_ALIGN 16 66 67 /** Heap shrink granularity 68 * 69 * Try not to pump and stress the heap to much 70 * by shrinking and enlarging it too often. 71 * A heap area won't shrunk if it the released 72 * free block is smaller than this constant. 73 * 74 */ 75 #define SHRINK_GRANULARITY (64 * PAGE_SIZE) 65 76 66 77 /** Overhead of each heap block. */ … … 68 79 (sizeof(heap_block_head_t) + sizeof(heap_block_foot_t)) 69 80 81 /** Overhead of each area. */ 82 #define AREA_OVERHEAD(size) \ 83 (ALIGN_UP(size + sizeof(heap_area_t), BASE_ALIGN)) 84 70 85 /** Calculate real size of a heap block. 71 86 * … … 85 100 * 86 101 */ 87 #define AREA_FIRST_BLOCK (area) \102 #define AREA_FIRST_BLOCK_HEAD(area) \ 88 103 (ALIGN_UP(((uintptr_t) (area)) + sizeof(heap_area_t), BASE_ALIGN)) 104 105 /** Get last block in heap area. 106 * 107 */ 108 #define AREA_LAST_BLOCK_FOOT(area) \ 109 (((uintptr_t) (area)->end) - sizeof(heap_block_foot_t)) 110 111 /** Get header in heap block. 112 * 113 */ 114 #define BLOCK_HEAD(foot) \ 115 ((heap_block_head_t *) \ 116 (((uintptr_t) (foot)) + sizeof(heap_block_foot_t) - (foot)->size)) 89 117 90 118 /** Get footer in heap block. … … 93 121 #define BLOCK_FOOT(head) \ 94 122 ((heap_block_foot_t *) \ 95 (((uintptr_t) head) + head->size - sizeof(heap_block_foot_t)))123 (((uintptr_t) (head)) + (head)->size - sizeof(heap_block_foot_t))) 96 124 97 125 /** Heap area. … … 114 142 void *end; 115 143 144 /** Previous heap area */ 145 struct heap_area *prev; 146 116 147 /** Next heap area */ 117 148 struct heap_area *next; … … 156 187 157 188 /** Next heap block to examine (next fit algorithm) */ 158 static heap_block_head_t *next = NULL;189 static heap_block_head_t *next_fit = NULL; 159 190 160 191 /** Futex for thread-safe heap manipulation */ 161 192 static futex_t malloc_futex = FUTEX_INITIALIZER; 193 194 #ifndef NDEBUG 195 196 #define malloc_assert(expr) \ 197 do { \ 198 if (!(expr)) {\ 199 futex_up(&malloc_futex); \ 200 assert_abort(#expr, __FILE__, __LINE__); \ 201 } \ 202 } while (0) 203 204 #else /* NDEBUG */ 205 206 #define malloc_assert(expr) 207 208 #endif /* NDEBUG */ 162 209 163 210 /** Initialize a heap block … … 201 248 heap_block_head_t *head = (heap_block_head_t *) addr; 202 249 203 assert(head->magic == HEAP_BLOCK_HEAD_MAGIC);250 malloc_assert(head->magic == HEAP_BLOCK_HEAD_MAGIC); 204 251 205 252 heap_block_foot_t *foot = BLOCK_FOOT(head); 206 253 207 assert(foot->magic == HEAP_BLOCK_FOOT_MAGIC);208 assert(head->size == foot->size);254 malloc_assert(foot->magic == HEAP_BLOCK_FOOT_MAGIC); 255 malloc_assert(head->size == foot->size); 209 256 } 210 257 211 258 /** Check a heap area structure 212 259 * 260 * Should be called only inside the critical section. 261 * 213 262 * @param addr Address of the heap area. 214 263 * … … 218 267 heap_area_t *area = (heap_area_t *) addr; 219 268 220 assert(area->magic == HEAP_AREA_MAGIC); 221 assert(area->start < area->end); 222 assert(((uintptr_t) area->start % PAGE_SIZE) == 0); 223 assert(((uintptr_t) area->end % PAGE_SIZE) == 0); 269 malloc_assert(area->magic == HEAP_AREA_MAGIC); 270 malloc_assert(addr == area->start); 271 malloc_assert(area->start < area->end); 272 malloc_assert(((uintptr_t) area->start % PAGE_SIZE) == 0); 273 malloc_assert(((uintptr_t) area->end % PAGE_SIZE) == 0); 224 274 } 225 275 226 276 /** Create new heap area 227 277 * 228 * @param start Preffered starting address of the new area. 229 * @param size Size of the area. 278 * Should be called only inside the critical section. 279 * 280 * @param size Size of the area. 230 281 * 231 282 */ … … 247 298 248 299 area->start = astart; 249 area->end = (void *) 250 ALIGN_DOWN((uintptr_t) astart + asize, BASE_ALIGN);300 area->end = (void *) ((uintptr_t) astart + asize); 301 area->prev = NULL; 251 302 area->next = NULL; 252 303 area->magic = HEAP_AREA_MAGIC; 253 304 254 void *block = (void *) AREA_FIRST_BLOCK (area);305 void *block = (void *) AREA_FIRST_BLOCK_HEAD(area); 255 306 size_t bsize = (size_t) (area->end - block); 256 307 … … 261 312 last_heap_area = area; 262 313 } else { 314 area->prev = last_heap_area; 263 315 last_heap_area->next = area; 264 316 last_heap_area = area; … … 270 322 /** Try to enlarge a heap area 271 323 * 324 * Should be called only inside the critical section. 325 * 272 326 * @param area Heap area to grow. 273 * @param size Gross size of item to allocate (bytes). 327 * @param size Gross size to grow (bytes). 328 * 329 * @return True if successful. 274 330 * 275 331 */ … … 281 337 area_check(area); 282 338 283 size_t asize = ALIGN_UP((size_t) (area->end - area->start) + size,284 PAGE_SIZE);285 286 339 /* New heap area size */ 287 void *end = (void *) 288 ALIGN_DOWN((uintptr_t) area->start + asize, BASE_ALIGN); 340 size_t gross_size = (size_t) (area->end - area->start) + size; 341 size_t asize = ALIGN_UP(gross_size, PAGE_SIZE); 342 void *end = (void *) ((uintptr_t) area->start + asize); 289 343 290 344 /* Check for overflow */ … … 298 352 299 353 /* Add new free block */ 300 block_init(area->end, (size_t) (end - area->end), true, area); 354 size_t net_size = (size_t) (end - area->end); 355 if (net_size > 0) 356 block_init(area->end, net_size, true, area); 301 357 302 358 /* Update heap area parameters */ … … 308 364 /** Try to enlarge any of the heap areas 309 365 * 366 * Should be called only inside the critical section. 367 * 310 368 * @param size Gross size of item to allocate (bytes). 311 369 * … … 317 375 318 376 /* First try to enlarge some existing area */ 319 heap_area_t *area;320 for (area = first_heap_area; area != NULL;area = area->next) {377 for (heap_area_t *area = first_heap_area; area != NULL; 378 area = area->next) { 321 379 if (area_grow(area, size)) 322 380 return true; … … 324 382 325 383 /* Eventually try to create a new area */ 326 return area_create(AREA_FIRST_BLOCK(size)); 327 } 328 329 /** Try to shrink heap space 330 * 384 return area_create(AREA_OVERHEAD(size)); 385 } 386 387 /** Try to shrink heap 388 * 389 * Should be called only inside the critical section. 331 390 * In all cases the next pointer is reset. 332 391 * 333 */ 334 static void heap_shrink(void) 335 { 336 next = NULL; 392 * @param area Last modified heap area. 393 * 394 */ 395 static void heap_shrink(heap_area_t *area) 396 { 397 area_check(area); 398 399 heap_block_foot_t *last_foot = 400 (heap_block_foot_t *) AREA_LAST_BLOCK_FOOT(area); 401 heap_block_head_t *last_head = BLOCK_HEAD(last_foot); 402 403 block_check((void *) last_head); 404 malloc_assert(last_head->area == area); 405 406 if (last_head->free) { 407 /* 408 * The last block of the heap area is 409 * unused. The area might be potentially 410 * shrunk. 411 */ 412 413 heap_block_head_t *first_head = 414 (heap_block_head_t *) AREA_FIRST_BLOCK_HEAD(area); 415 416 block_check((void *) first_head); 417 malloc_assert(first_head->area == area); 418 419 size_t shrink_size = ALIGN_DOWN(last_head->size, PAGE_SIZE); 420 421 if (first_head == last_head) { 422 /* 423 * The entire heap area consists of a single 424 * free heap block. This means we can get rid 425 * of it entirely. 426 */ 427 428 heap_area_t *prev = area->prev; 429 heap_area_t *next = area->next; 430 431 if (prev != NULL) { 432 area_check(prev); 433 prev->next = next; 434 } else 435 first_heap_area = next; 436 437 if (next != NULL) { 438 area_check(next); 439 next->prev = prev; 440 } else 441 last_heap_area = prev; 442 443 as_area_destroy(area->start); 444 } else if (shrink_size >= SHRINK_GRANULARITY) { 445 /* 446 * Make sure that we always shrink the area 447 * by a multiple of page size and update 448 * the block layout accordingly. 449 */ 450 451 size_t asize = (size_t) (area->end - area->start) - shrink_size; 452 void *end = (void *) ((uintptr_t) area->start + asize); 453 454 /* Resize the address space area */ 455 int ret = as_area_resize(area->start, asize, 0); 456 if (ret != EOK) 457 abort(); 458 459 /* Update heap area parameters */ 460 area->end = end; 461 size_t excess = ((size_t) area->end) - ((size_t) last_head); 462 463 if (excess > 0) { 464 if (excess >= STRUCT_OVERHEAD) { 465 /* 466 * The previous block cannot be free and there 467 * is enough free space left in the area to 468 * create a new free block. 469 */ 470 block_init((void *) last_head, excess, true, area); 471 } else { 472 /* 473 * The excess is small. Therefore just enlarge 474 * the previous block. 475 */ 476 heap_block_foot_t *prev_foot = (heap_block_foot_t *) 477 (((uintptr_t) last_head) - sizeof(heap_block_foot_t)); 478 heap_block_head_t *prev_head = BLOCK_HEAD(prev_foot); 479 480 block_check((void *) prev_head); 481 482 block_init(prev_head, prev_head->size + excess, 483 prev_head->free, area); 484 } 485 } 486 } 487 } 488 489 next_fit = NULL; 337 490 } 338 491 … … 361 514 static void split_mark(heap_block_head_t *cur, const size_t size) 362 515 { 363 assert(cur->size >= size);516 malloc_assert(cur->size >= size); 364 517 365 518 /* See if we should split the block. */ … … 397 550 { 398 551 area_check((void *) area); 399 assert((void *) first_block >= (void *) AREA_FIRST_BLOCK(area)); 400 assert((void *) first_block < area->end); 401 402 heap_block_head_t *cur; 403 for (cur = first_block; (void *) cur < area->end; 552 malloc_assert((void *) first_block >= (void *) AREA_FIRST_BLOCK_HEAD(area)); 553 malloc_assert((void *) first_block < area->end); 554 555 for (heap_block_head_t *cur = first_block; (void *) cur < area->end; 404 556 cur = (heap_block_head_t *) (((void *) cur) + cur->size)) { 405 557 block_check(cur); … … 424 576 split_mark(cur, real_size); 425 577 426 next = cur;578 next_fit = cur; 427 579 return addr; 428 580 } else { … … 435 587 * data in (including alignment). 436 588 */ 437 if ((void *) cur > (void *) AREA_FIRST_BLOCK (area)) {589 if ((void *) cur > (void *) AREA_FIRST_BLOCK_HEAD(area)) { 438 590 /* 439 591 * There is a block before the current block. … … 476 628 split_mark(next_head, real_size); 477 629 478 next = next_head;630 next_fit = next_head; 479 631 return aligned; 480 632 } else { … … 495 647 size_t reduced_size = cur->size - excess; 496 648 cur = (heap_block_head_t *) 497 (AREA_FIRST_BLOCK (area) + excess);649 (AREA_FIRST_BLOCK_HEAD(area) + excess); 498 650 499 block_init((void *) AREA_FIRST_BLOCK (area), excess,500 true, area);651 block_init((void *) AREA_FIRST_BLOCK_HEAD(area), 652 excess, true, area); 501 653 block_init(cur, reduced_size, true, area); 502 654 split_mark(cur, real_size); 503 655 504 next = cur;656 next_fit = cur; 505 657 return aligned; 506 658 } … … 526 678 static void *malloc_internal(const size_t size, const size_t align) 527 679 { 528 assert(first_heap_area != NULL);680 malloc_assert(first_heap_area != NULL); 529 681 530 682 if (align == 0) … … 540 692 541 693 /* Try the next fit approach */ 542 split = next ;694 split = next_fit; 543 695 544 696 if (split != NULL) { … … 551 703 552 704 /* Search the entire heap */ 553 heap_area_t *area;554 for (area = first_heap_area; area != NULL;area = area->next) {705 for (heap_area_t *area = first_heap_area; area != NULL; 706 area = area->next) { 555 707 heap_block_head_t *first = (heap_block_head_t *) 556 AREA_FIRST_BLOCK (area);708 AREA_FIRST_BLOCK_HEAD(area); 557 709 558 710 void *addr = malloc_area(area, first, split, real_size, … … 651 803 652 804 block_check(head); 653 assert(!head->free);805 malloc_assert(!head->free); 654 806 655 807 heap_area_t *area = head->area; 656 808 657 809 area_check(area); 658 assert((void *) head >= (void *) AREA_FIRST_BLOCK(area));659 assert((void *) head < area->end);810 malloc_assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area)); 811 malloc_assert((void *) head < area->end); 660 812 661 813 void *ptr = NULL; … … 674 826 block_init((void *) head + real_size, 675 827 orig_size - real_size, true, area); 676 heap_shrink( );828 heap_shrink(area); 677 829 } 678 830 … … 696 848 697 849 ptr = ((void *) head) + sizeof(heap_block_head_t); 698 next = NULL;850 next_fit = NULL; 699 851 } else 700 852 reloc = true; … … 728 880 729 881 block_check(head); 730 assert(!head->free);882 malloc_assert(!head->free); 731 883 732 884 heap_area_t *area = head->area; 733 885 734 886 area_check(area); 735 assert((void *) head >= (void *) AREA_FIRST_BLOCK(area));736 assert((void *) head < area->end);887 malloc_assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area)); 888 malloc_assert((void *) head < area->end); 737 889 738 890 /* Mark the block itself as free. */ … … 750 902 751 903 /* Look at the previous block. If it is free, merge the two. */ 752 if ((void *) head > (void *) AREA_FIRST_BLOCK (area)) {904 if ((void *) head > (void *) AREA_FIRST_BLOCK_HEAD(area)) { 753 905 heap_block_foot_t *prev_foot = 754 906 (heap_block_foot_t *) (((void *) head) - sizeof(heap_block_foot_t)); … … 764 916 } 765 917 766 heap_shrink( );918 heap_shrink(area); 767 919 768 920 futex_up(&malloc_futex); 769 921 } 770 922 923 void *heap_check(void) 924 { 925 futex_down(&malloc_futex); 926 927 if (first_heap_area == NULL) { 928 futex_up(&malloc_futex); 929 return (void *) -1; 930 } 931 932 /* Walk all heap areas */ 933 for (heap_area_t *area = first_heap_area; area != NULL; 934 area = area->next) { 935 936 /* Check heap area consistency */ 937 if ((area->magic != HEAP_AREA_MAGIC) || 938 ((void *) area != area->start) || 939 (area->start >= area->end) || 940 (((uintptr_t) area->start % PAGE_SIZE) != 0) || 941 (((uintptr_t) area->end % PAGE_SIZE) != 0)) { 942 futex_up(&malloc_futex); 943 return (void *) area; 944 } 945 946 /* Walk all heap blocks */ 947 for (heap_block_head_t *head = (heap_block_head_t *) 948 AREA_FIRST_BLOCK_HEAD(area); (void *) head < area->end; 949 head = (heap_block_head_t *) (((void *) head) + head->size)) { 950 951 /* Check heap block consistency */ 952 if (head->magic != HEAP_BLOCK_HEAD_MAGIC) { 953 futex_up(&malloc_futex); 954 return (void *) head; 955 } 956 957 heap_block_foot_t *foot = BLOCK_FOOT(head); 958 959 if ((foot->magic != HEAP_BLOCK_FOOT_MAGIC) || 960 (head->size != foot->size)) { 961 futex_up(&malloc_futex); 962 return (void *) foot; 963 } 964 } 965 } 966 967 futex_up(&malloc_futex); 968 969 return NULL; 970 } 971 771 972 /** @} 772 973 */ -
uspace/lib/c/generic/stacktrace.c
r82582e4 rdf3c6f02 61 61 stacktrace_prepare(); 62 62 stacktrace_print_fp_pc(stacktrace_fp_get(), stacktrace_pc_get()); 63 63 64 /* 64 65 * Prevent the tail call optimization of the previous call by 65 66 * making it a non-tail call. 66 67 */ 67 (void) stacktrace_fp_get(); 68 69 printf("-- end of stack trace --\n"); 68 70 } 69 71 -
uspace/lib/c/generic/str.c
r82582e4 rdf3c6f02 1215 1215 void order_suffix(const uint64_t val, uint64_t *rv, char *suffix) 1216 1216 { 1217 if (val > 10000000000000000000ULL) {1218 *rv = val / 1000000000000000000ULL;1217 if (val > UINT64_C(10000000000000000000)) { 1218 *rv = val / UINT64_C(1000000000000000000); 1219 1219 *suffix = 'Z'; 1220 } else if (val > 1000000000000000000ULL) {1221 *rv = val / 1000000000000000ULL;1220 } else if (val > UINT64_C(1000000000000000000)) { 1221 *rv = val / UINT64_C(1000000000000000); 1222 1222 *suffix = 'E'; 1223 } else if (val > 1000000000000000ULL) {1224 *rv = val / 1000000000000ULL;1223 } else if (val > UINT64_C(1000000000000000)) { 1224 *rv = val / UINT64_C(1000000000000); 1225 1225 *suffix = 'T'; 1226 } else if (val > 1000000000000ULL) {1227 *rv = val / 1000000000ULL;1226 } else if (val > UINT64_C(1000000000000)) { 1227 *rv = val / UINT64_C(1000000000); 1228 1228 *suffix = 'G'; 1229 } else if (val > 1000000000ULL) {1230 *rv = val / 1000000ULL;1229 } else if (val > UINT64_C(1000000000)) { 1230 *rv = val / UINT64_C(1000000); 1231 1231 *suffix = 'M'; 1232 } else if (val > 1000000ULL) {1233 *rv = val / 1000ULL;1232 } else if (val > UINT64_C(1000000)) { 1233 *rv = val / UINT64_C(1000); 1234 1234 *suffix = 'k'; 1235 1235 } else { … … 1239 1239 } 1240 1240 1241 void bin_order_suffix(const uint64_t val, uint64_t *rv, const char **suffix, 1242 bool fixed) 1243 { 1244 if (val > UINT64_C(1152921504606846976)) { 1245 *rv = val / UINT64_C(1125899906842624); 1246 *suffix = "EiB"; 1247 } else if (val > UINT64_C(1125899906842624)) { 1248 *rv = val / UINT64_C(1099511627776); 1249 *suffix = "TiB"; 1250 } else if (val > UINT64_C(1099511627776)) { 1251 *rv = val / UINT64_C(1073741824); 1252 *suffix = "GiB"; 1253 } else if (val > UINT64_C(1073741824)) { 1254 *rv = val / UINT64_C(1048576); 1255 *suffix = "MiB"; 1256 } else if (val > UINT64_C(1048576)) { 1257 *rv = val / UINT64_C(1024); 1258 *suffix = "KiB"; 1259 } else { 1260 *rv = val; 1261 if (fixed) 1262 *suffix = "B "; 1263 else 1264 *suffix = "B"; 1265 } 1266 } 1267 1241 1268 /** @} 1242 1269 */ -
uspace/lib/c/generic/thread.c
r82582e4 rdf3c6f02 44 44 45 45 #ifndef THREAD_INITIAL_STACK_PAGES_NO 46 #define THREAD_INITIAL_STACK_PAGES_NO 146 #define THREAD_INITIAL_STACK_PAGES_NO 2 47 47 #endif 48 48 -
uspace/lib/c/include/adt/fifo.h
r82582e4 rdf3c6f02 51 51 typedef unsigned long fifo_index_t; 52 52 53 #define FIFO_CREATE_STATIC(name, t, itms) \54 struct { \55 t fifo[(itms)]; \56 fifo_count_t items; \57 fifo_index_t head; \58 fifo_index_t tail; \53 #define FIFO_CREATE_STATIC(name, t, itms) \ 54 struct { \ 55 t fifo[(itms)]; \ 56 fifo_count_t items; \ 57 fifo_index_t head; \ 58 fifo_index_t tail; \ 59 59 } name 60 60 -
uspace/lib/c/include/adt/list.h
r82582e4 rdf3c6f02 47 47 * 48 48 * @param name Name of the new statically allocated list. 49 */ 50 #define LIST_INITIALIZE(name) link_t name = { \ 51 .prev = &name, \ 52 .next = &name \ 53 } 49 * 50 */ 51 #define LIST_INITIALIZE(name) \ 52 link_t name = { \ 53 .prev = &name, \ 54 .next = &name \ 55 } 56 57 #define list_get_instance(link, type, member) \ 58 ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 59 60 #define list_foreach(list, iterator) \ 61 for (link_t *iterator = (list).next; \ 62 iterator != &(list); iterator = iterator->next) 54 63 55 64 /** Initialize doubly-linked circular list link … … 58 67 * 59 68 * @param link Pointer to link_t structure to be initialized. 69 * 60 70 */ 61 71 static inline void link_initialize(link_t *link) … … 69 79 * Initialize doubly-linked circular list. 70 80 * 71 * @param head Pointer to link_t structure representing head of the list. 72 */ 73 static inline void list_initialize(link_t *head) 74 { 75 head->prev = head; 76 head->next = head; 81 * @param list Pointer to link_t structure representing the list. 82 * 83 */ 84 static inline void list_initialize(link_t *list) 85 { 86 list->prev = list; 87 list->next = list; 77 88 } 78 89 … … 82 93 * 83 94 * @param link Pointer to link_t structure to be added. 84 * @param head Pointer to link_t structure representing head of the list. 85 */ 86 static inline void list_prepend(link_t *link, link_t *head) 87 { 88 link->next = head->next; 89 link->prev = head; 90 head->next->prev = link; 91 head->next = link; 95 * @param list Pointer to link_t structure representing the list. 96 * 97 */ 98 static inline void list_prepend(link_t *link, link_t *list) 99 { 100 link->next = list->next; 101 link->prev = list; 102 list->next->prev = link; 103 list->next = link; 92 104 } 93 105 … … 97 109 * 98 110 * @param link Pointer to link_t structure to be added. 99 * @param head Pointer to link_t structure representing head of the list. 100 */ 101 static inline void list_append(link_t *link, link_t *head) 102 { 103 link->prev = head->prev; 104 link->next = head; 105 head->prev->next = link; 106 head->prev = link; 107 } 108 109 /** Insert item before another item in doubly-linked circular list. */ 110 static inline void list_insert_before(link_t *l, link_t *r) 111 { 112 list_append(l, r); 113 } 114 115 /** Insert item after another item in doubly-linked circular list. */ 116 static inline void list_insert_after(link_t *r, link_t *l) 117 { 118 list_prepend(l, r); 111 * @param list Pointer to link_t structure representing the list. 112 * 113 */ 114 static inline void list_append(link_t *link, link_t *list) 115 { 116 link->prev = list->prev; 117 link->next = list; 118 list->prev->next = link; 119 list->prev = link; 120 } 121 122 /** Insert item before another item in doubly-linked circular list. 123 * 124 */ 125 static inline void list_insert_before(link_t *link, link_t *list) 126 { 127 list_append(link, list); 128 } 129 130 /** Insert item after another item in doubly-linked circular list. 131 * 132 */ 133 static inline void list_insert_after(link_t *link, link_t *list) 134 { 135 list_prepend(list, link); 119 136 } 120 137 … … 123 140 * Remove item from doubly-linked circular list. 124 141 * 125 * @param link Pointer to link_t structure to be removed from the list it is contained in. 142 * @param link Pointer to link_t structure to be removed from the list 143 * it is contained in. 144 * 126 145 */ 127 146 static inline void list_remove(link_t *link) … … 136 155 * Query emptiness of doubly-linked circular list. 137 156 * 138 * @param head Pointer to link_t structure representing head of the list. 139 */ 140 static inline int list_empty(link_t *head) 141 { 142 return ((head->next == head) ? 1 : 0); 143 } 144 157 * @param list Pointer to link_t structure representing the list. 158 * 159 */ 160 static inline int list_empty(link_t *list) 161 { 162 return (list->next == list); 163 } 164 165 /** Get head item of a list. 166 * 167 * @param list Pointer to link_t structure representing the list. 168 * 169 * @return Head item of the list. 170 * @return NULL if the list is empty. 171 * 172 */ 173 static inline link_t *list_head(link_t *list) 174 { 175 return ((list->next == list) ? NULL : list->next); 176 } 145 177 146 178 /** Split or concatenate headless doubly-linked circular list … … 151 183 * concatenates splitted lists and splits concatenated lists. 152 184 * 153 * @param part1 Pointer to link_t structure leading the first (half of the headless) list. 154 * @param part2 Pointer to link_t structure leading the second (half of the headless) list. 185 * @param part1 Pointer to link_t structure leading the first 186 * (half of the headless) list. 187 * @param part2 Pointer to link_t structure leading the second 188 * (half of the headless) list. 189 * 155 190 */ 156 191 static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) … … 165 200 } 166 201 167 168 202 /** Split headless doubly-linked circular list 169 203 * 170 204 * Split headless doubly-linked circular list. 171 205 * 172 * @param part1 Pointer to link_t structure leading the first half of the headless list. 173 * @param part2 Pointer to link_t structure leading the second half of the headless list. 206 * @param part1 Pointer to link_t structure leading 207 * the first half of the headless list. 208 * @param part2 Pointer to link_t structure leading 209 * the second half of the headless list. 210 * 174 211 */ 175 212 static inline void headless_list_split(link_t *part1, link_t *part2) … … 182 219 * Concatenate two headless doubly-linked circular lists. 183 220 * 184 * @param part1 Pointer to link_t structure leading the first headless list. 185 * @param part2 Pointer to link_t structure leading the second headless list. 221 * @param part1 Pointer to link_t structure leading 222 * the first headless list. 223 * @param part2 Pointer to link_t structure leading 224 * the second headless list. 225 * 186 226 */ 187 227 static inline void headless_list_concat(link_t *part1, link_t *part2) … … 190 230 } 191 231 192 #define list_get_instance(link, type, member) ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 193 194 extern int list_member(const link_t *link, const link_t *head); 195 extern void list_concat(link_t *head1, link_t *head2); 196 extern unsigned int list_count(const link_t *link); 232 /** Get n-th item of a list. 233 * 234 * @param list Pointer to link_t structure representing the list. 235 * @param n Item number (indexed from zero). 236 * 237 * @return n-th item of the list. 238 * @return NULL if no n-th item found. 239 * 240 */ 241 static inline link_t *list_nth(link_t *list, unsigned int n) 242 { 243 unsigned int cnt = 0; 244 245 list_foreach(*list, link) { 246 if (cnt == n) 247 return link; 248 249 cnt++; 250 } 251 252 return NULL; 253 } 254 255 extern int list_member(const link_t *, const link_t *); 256 extern void list_concat(link_t *, link_t *); 257 extern unsigned int list_count(const link_t *); 197 258 198 259 #endif -
uspace/lib/c/include/adt/measured_strings.h
r82582e4 rdf3c6f02 61 61 extern measured_string_t *measured_string_create_bulk(const uint8_t *, size_t); 62 62 extern measured_string_t *measured_string_copy(measured_string_t *); 63 63 64 extern int measured_strings_receive(measured_string_t **, uint8_t **, size_t); 64 65 extern int measured_strings_reply(const measured_string_t *, size_t); -
uspace/lib/c/include/as.h
r82582e4 rdf3c6f02 54 54 } 55 55 56 extern void *as_area_create(void * address, size_t size, int flags);57 extern int as_area_resize(void * address, size_t size, int flags);58 extern int as_area_change_flags(void * address, int flags);59 extern int as_area_destroy(void * address);60 extern void *set_maxheapsize(size_t mhs);61 extern void * as_get_mappable_page(size_t sz);56 extern void *as_area_create(void *, size_t, unsigned int); 57 extern int as_area_resize(void *, size_t, unsigned int); 58 extern int as_area_change_flags(void *, unsigned int); 59 extern int as_area_destroy(void *); 60 extern void *set_maxheapsize(size_t); 61 extern void *as_get_mappable_page(size_t); 62 62 63 63 #endif -
uspace/lib/c/include/assert.h
r82582e4 rdf3c6f02 40 40 * 41 41 * If NDEBUG is not set, the assert() macro 42 * evaluates expr and if it is false prints 42 * evaluates expr and if it is false prints 43 43 * error message and terminate program. 44 44 * … … 47 47 */ 48 48 49 #include <stdio.h>50 #include <stdlib.h>51 52 49 #ifndef NDEBUG 53 50 54 51 #define assert(expr) \ 55 52 do { \ 56 if (!(expr)) { \ 57 printf("Assertion failed (%s) at file '%s', " \ 58 "line %d.\n", #expr, __FILE__, __LINE__); \ 59 abort(); \ 60 } \ 53 if (!(expr)) \ 54 assert_abort(#expr, __FILE__, __LINE__); \ 61 55 } while (0) 62 56 … … 67 61 #endif /* NDEBUG */ 68 62 63 extern void assert_abort(const char *, const char *, unsigned int) 64 __attribute__((noreturn)); 65 69 66 #endif 70 67 -
uspace/lib/c/include/dlfcn.h
r82582e4 rdf3c6f02 1 1 /* 2 * Copyright (c) 200 9 Martin Decky2 * Copyright (c) 2008 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 #include <test.h> 29 /** @addtogroup rtld 30 * @{ 31 */ 32 /** @file 33 * @brief UNIX-like dynamic linker interface. 34 */ 30 35 31 const char *test_mips2(void) 32 { 33 return NULL; 34 } 36 #ifndef LIBC_DLFCN_H_ 37 #define LIBC_DLFCN_H_ 38 39 void *dlopen(const char *, int); 40 void *dlsym(void *, const char *); 41 42 #endif 43 44 /** 45 * @} 46 */ -
uspace/lib/c/include/entry_point.h
r82582e4 rdf3c6f02 1 1 /* 2 * Copyright (c) 20 06 Jakub Jermar2 * Copyright (c) 2011 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup sparc64mm29 /** @addtogroup libc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef KERN_sparc64_CACHE_H_36 #define KERN_sparc64_CACHE_H_35 #ifndef LIBC_ENTRY_POINT_H_ 36 #define LIBC_ENTRY_POINT_H_ 37 37 38 #include <mm/page.h> 39 #include <mm/frame.h> 38 /* Defined in arch/ARCH/src/entryjmp.[c|s] */ 39 void entry_point_jmp(void *, void *); 40 40 41 41 #endif -
uspace/lib/c/include/errno.h
r82582e4 rdf3c6f02 39 39 #include <fibril.h> 40 40 41 #define errno _errno41 #define errno (*(__errno())) 42 42 43 extern int _errno;43 extern int *__errno(void) __attribute__((const)); 44 44 45 45 #define EMFILE (-18) -
uspace/lib/c/include/event.h
r82582e4 rdf3c6f02 39 39 40 40 extern int event_subscribe(event_type_t, sysarg_t); 41 extern int event_unmask(event_type_t); 41 42 42 43 #endif -
uspace/lib/c/include/fibril.h
r82582e4 rdf3c6f02 70 70 int (*func)(void *); 71 71 tcb_t *tcb; 72 72 73 73 struct fibril *clean_after_me; 74 74 int retval; 75 75 int flags; 76 76 77 77 fibril_owner_info_t *waits_for; 78 78 } fibril_t; -
uspace/lib/c/include/fibril_synch.h
r82582e4 rdf3c6f02 36 36 #define LIBC_FIBRIL_SYNCH_H_ 37 37 38 #include <async.h>39 38 #include <fibril.h> 40 39 #include <adt/list.h> 41 40 #include <libarch/tls.h> 42 41 #include <sys/time.h> 42 #include <bool.h> 43 43 44 44 typedef struct { 45 fibril_owner_info_t oi; /*Keep this the first thing. */45 fibril_owner_info_t oi; /**< Keep this the first thing. */ 46 46 int counter; 47 47 link_t waiters; … … 64 64 65 65 typedef struct { 66 fibril_owner_info_t oi; /*Keep this the first thing. */66 fibril_owner_info_t oi; /**< Keep this the first thing. */ 67 67 unsigned writers; 68 68 unsigned readers; -
uspace/lib/c/include/io/klog.h
r82582e4 rdf3c6f02 37 37 38 38 #include <sys/types.h> 39 #include <stdarg.h> 39 40 40 41 extern size_t klog_write(const void *, size_t); 41 42 extern void klog_update(void); 43 extern int klog_printf(const char *, ...); 44 extern int klog_vprintf(const char *, va_list); 42 45 43 46 #endif -
uspace/lib/c/include/loader/pcb.h
r82582e4 rdf3c6f02 72 72 /** Pointer to ELF dynamic section of the program. */ 73 73 void *dynamic; 74 /** Pointer to dynamic linker state structure (runtime_env_t). */ 75 void *rtld_runtime; 74 76 } pcb_t; 75 77 -
uspace/lib/c/include/macros.h
r82582e4 rdf3c6f02 39 39 #define max(a, b) ((a) > (b) ? (a) : (b)) 40 40 41 #define SIZE2KB(size) ((size) >> 10) 42 #define SIZE2MB(size) ((size) >> 20) 43 44 #define KB2SIZE(kb) ((kb) << 10) 45 #define MB2SIZE(mb) ((mb) << 20) 41 #define KiB2SIZE(kb) ((kb) << 10) 42 #define MiB2SIZE(mb) ((mb) << 20) 46 43 47 44 #define STRING(arg) STRING_ARG(arg) -
uspace/lib/c/include/malloc.h
r82582e4 rdf3c6f02 46 46 extern void *realloc(const void *addr, const size_t size); 47 47 extern void free(const void *addr); 48 extern void *heap_check(void); 48 49 49 50 #endif -
uspace/lib/c/include/rtld/symbol.h
r82582e4 rdf3c6f02 1 1 /* 2 * Copyright (c) 200 9 Martin Decky2 * Copyright (c) 2008 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 #include <test.h> 29 /** @addtogroup libc 30 * @{ 31 */ 32 /** @file 33 */ 30 34 31 const char *test_sse1(void) 32 { 33 return NULL; 34 } 35 #ifndef LIBC_RTLD_SYMBOL_H_ 36 #define LIBC_RTLD_SYMBOL_H_ 37 38 #include <rtld/rtld.h> 39 #include <elf.h> 40 41 elf_symbol_t *symbol_bfs_find(const char *name, module_t *start, module_t **mod); 42 elf_symbol_t *symbol_def_find(const char *name, module_t *origin, module_t **mod); 43 void *symbol_get_addr(elf_symbol_t *sym, module_t *m); 44 45 #endif 46 47 /** @} 48 */ -
uspace/lib/c/include/str.h
r82582e4 rdf3c6f02 89 89 extern int str_size_t(const char *, char **, unsigned int, bool, size_t *); 90 90 91 extern void order_suffix(const uint64_t val, uint64_t *rv, char *suffix); 91 extern void order_suffix(const uint64_t, uint64_t *, char *); 92 extern void bin_order_suffix(const uint64_t, uint64_t *, const char **, bool); 92 93 93 94 /*
Note:
See TracChangeset
for help on using the changeset viewer.
