Changeset fa23560 in mainline for uspace/lib/libc/arch
- Timestamp:
- 2007-10-30T22:54:11Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4d21cf8
- Parents:
- b2a0f6dd
- Location:
- uspace/lib/libc/arch
- Files:
-
- 10 added
- 1 deleted
- 17 edited
- 7 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/libc/arch/amd64/Makefile.inc
rb2a0f6dd rfa23560 35 35 ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ 36 36 arch/$(ARCH)/src/fibril.S \ 37 arch/$(ARCH)/src/t hread.c37 arch/$(ARCH)/src/tls.c 38 38 39 39 LFLAGS += -N -
uspace/lib/libc/arch/amd64/include/thread.h
rb2a0f6dd rfa23560 36 36 #define LIBC_amd64_THREAD_H_ 37 37 38 #include <libc.h>39 40 typedef struct {41 void *self;42 void *fibril_data;43 } tcb_t;44 45 static inline void __tcb_set(tcb_t *tcb)46 {47 __SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb);48 }49 50 static inline tcb_t * __tcb_get(void)51 {52 void * retval;53 54 asm ("movq %%fs:0, %0" : "=r"(retval));55 return retval;56 }57 58 38 #endif 59 39 -
uspace/lib/libc/arch/amd64/src/tls.c
rb2a0f6dd rfa23560 35 35 */ 36 36 37 #include <thread.h> 38 #include <malloc.h> 39 #include <align.h> 37 #include <tls.h> 38 #include <sys/types.h> 40 39 41 /** Allocate TLS & TCB for initial module threads42 *43 * @param data Start of data section44 * @return pointer to tcb_t structure45 */46 40 tcb_t * __alloc_tls(void **data, size_t size) 47 41 { 48 tcb_t *tcb; 49 50 size = ALIGN_UP(size, &_tls_alignment); 51 *data = memalign(&_tls_alignment, sizeof(tcb_t) + size); 52 53 tcb = (tcb_t *) (*data + size); 54 tcb->self = tcb; 55 56 return tcb; 42 return tls_alloc_variant_2(data, size); 57 43 } 58 44 59 45 void __free_tls_arch(tcb_t *tcb, size_t size) 60 46 { 61 size = ALIGN_UP(size, &_tls_alignment); 62 void *start = ((void *)tcb) - size; 63 free(start); 47 tls_free_variant_2(tcb, size); 64 48 } 65 49 -
uspace/lib/libc/arch/arm32/Makefile.inc
rb2a0f6dd rfa23560 1 1 # 2 # Copyright (c) 2007 Michal Kebrt, Pavel Jancik 2 # Copyright (c) 2007 Michal Kebrt 3 # Copyright (c) 2007 Pavel Jancik 3 4 # All rights reserved. 4 5 # … … 38 39 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 39 40 arch/$(ARCH)/src/fibril.S \ 40 arch/$(ARCH)/src/t hread.c \41 arch/$(ARCH)/src/tls.c \ 41 42 arch/$(ARCH)/src/eabi.S 42 43 -
uspace/lib/libc/arch/arm32/include/thread.h
rb2a0f6dd rfa23560 1 1 /* 2 * Copyright (c) 2007 Pavel Jancik, Michal Kebrt 2 * Copyright (c) 2007 Pavel Jancik 3 * Copyright (c) 2007 Michal Kebrt 3 4 * All rights reserved. 4 5 * … … 31 32 */ 32 33 /** @file 33 * @brief Uspace threads and TLS.34 34 */ 35 35 … … 37 37 #define LIBC_arm32_THREAD_H_ 38 38 39 #include <unistd.h>40 41 /** Stack initial size. */42 #define THREAD_INITIAL_STACK_PAGES_NO 143 44 /** Offsets for accessing __thread variables are shifted 8 bytes higher. */45 #define ARM_TP_OFFSET (-8)46 47 /** TCB (Thread Control Block) struct.48 *49 * TLS starts just after this struct.50 */51 typedef struct {52 /** Fibril data. */53 void *fibril_data;54 } tcb_t;55 56 57 /** Sets TLS address to the r9 register.58 *59 * @param tcb TCB (TLS starts behind)60 */61 static inline void __tcb_set(tcb_t *tcb)62 {63 void *tls = (void *) tcb;64 tls += sizeof(tcb_t) + ARM_TP_OFFSET;65 asm volatile (66 "mov r9, %0"67 :68 : "r"(tls)69 );70 }71 72 73 /** Returns TCB address.74 *75 * @return TCB address (starts before TLS which address is stored in r9 register).76 */77 static inline tcb_t *__tcb_get(void)78 {79 void *ret;80 asm volatile (81 "mov %0, r9"82 : "=r"(ret)83 );84 return (tcb_t *) (ret - ARM_TP_OFFSET - sizeof(tcb_t));85 }86 87 88 /** Returns TLS address stored.89 *90 * Implemented in assembly.91 *92 * @return TLS address stored in r9 register93 */94 extern uintptr_t __aeabi_read_tp(void);95 96 39 #endif 97 40 -
uspace/lib/libc/arch/arm32/include/tls.h
rb2a0f6dd rfa23560 1 1 /* 2 * Copyright (c) 2006 Ondrej Palkovsky 2 * Copyright (c) 2007 Pavel Jancik 3 * Copyright (c) 2007 Michal Kebrt 3 4 * All rights reserved. 4 5 * … … 27 28 */ 28 29 29 /** @addtogroup libcsparc64 sparc64 30 * @ingroup lc 30 /** @addtogroup libcarm32 31 31 * @{ 32 32 */ 33 33 /** @file 34 *35 34 */ 36 35 37 #include <thread.h> 38 #include <malloc.h> 39 #include <align.h> 36 #ifndef LIBC_arm32_TLS_H_ 37 #define LIBC_arm32_TLS_H_ 40 38 41 /* 42 * sparc64 uses thread-local storage data structures, variant II, as described 43 * in: 44 * Drepper U.: ELF Handling For Thread-Local Storage, 2005 39 #include <sys/types.h> 40 41 #define CONFIG_TLS_VARIANT_1 42 43 /** Offsets for accessing __thread variables are shifted 8 bytes higher. */ 44 #define ARM_TP_OFFSET (-8) 45 46 /** TCB (Thread Control Block) struct. 47 * 48 * TLS starts just after this struct. 45 49 */ 50 typedef struct { 51 /** Fibril data. */ 52 void *fibril_data; 53 } tcb_t; 46 54 47 /** Allocate TLS variant II data structures for a thread. 55 56 /** Sets TLS address to the r9 register. 48 57 * 49 * Only static model is supported. 50 * 51 * @param data Pointer to pointer to thread local data. This is actually an 52 * output argument. 53 * @param size Size of thread local data. 54 * @return Pointer to TCB structure. 58 * @param tcb TCB (TLS starts behind) 55 59 */ 56 tcb_t * __alloc_tls(void **data, size_t size)60 static inline void __tcb_set(tcb_t *tcb) 57 61 { 58 tcb_t *tcb; 59 60 size = ALIGN_UP(size, &_tls_alignment); 61 *data = memalign(&_tls_alignment, sizeof(tcb_t) + size); 62 63 tcb = (tcb_t *) (*data + size); 64 tcb->self = tcb; 65 66 return tcb; 62 void *tls = (void *) tcb; 63 tls += sizeof(tcb_t) + ARM_TP_OFFSET; 64 asm volatile ( 65 "mov r9, %0" 66 : 67 : "r" (tls) 68 ); 67 69 } 68 70 69 /** Free TLS variant II data structures of a thread. 71 72 /** Returns TCB address. 70 73 * 71 * Only static model is supported. 74 * @return TCB address (starts before TLS which address is stored 75 * in r9 register). 76 */ 77 static inline tcb_t *__tcb_get(void) 78 { 79 void *ret; 80 asm volatile ( 81 "mov %0, r9" 82 : "=r"(ret) 83 ); 84 return (tcb_t *) (ret - ARM_TP_OFFSET - sizeof(tcb_t)); 85 } 86 87 88 /** Returns TLS address stored. 72 89 * 73 * @param tcb Pointer to TCB structure. 74 * @param size Size of thread local data. 90 * Implemented in assembly. 91 * 92 * @return TLS address stored in r9 register 75 93 */ 76 void __free_tls_arch(tcb_t *tcb, size_t size) 77 { 78 size = ALIGN_UP(size, &_tls_alignment); 79 void *start = ((void *) tcb) - size; 80 free(start); 81 } 94 extern uintptr_t __aeabi_read_tp(void); 95 96 #endif 82 97 83 98 /** @} -
uspace/lib/libc/arch/arm32/src/tls.c
rb2a0f6dd rfa23560 33 33 */ 34 34 /** @file 35 * @brief Uspace threads and TLS.36 35 */ 37 36 38 #include <t hread.h>39 #include < malloc.h>37 #include <tls.h> 38 #include <sys/types.h> 40 39 41 /** Allocates TLS & TCB.42 *43 * @param data Start of data section (output parameter).44 * @param size Size of (tbss + tdata) sections.45 * @return Pointer to the allocated #tcb_t structure.46 */47 40 tcb_t * __alloc_tls(void **data, size_t size) 48 41 { 49 tcb_t *result; 50 51 result = malloc(sizeof(tcb_t) + size); 52 *data = ((void *)result) + sizeof(tcb_t); 53 return result; 42 return tls_alloc_variant_1(data, size); 54 43 } 55 44 56 /** Deallocates TLS & TCB.57 *58 * @param tcb TCB structure to be deallocated (along with corresponding TLS).59 * @param size Not used.60 */61 45 void __free_tls_arch(tcb_t *tcb, size_t size) 62 46 { 63 free(tcb);47 tls_free_variant_1(tcb, size); 64 48 } 65 49 -
uspace/lib/libc/arch/ia32/Makefile.inc
rb2a0f6dd rfa23560 35 35 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 36 36 arch/$(ARCH)/src/fibril.S \ 37 arch/$(ARCH)/src/t hread.c37 arch/$(ARCH)/src/tls.c 38 38 39 39 LFLAGS += -N -
uspace/lib/libc/arch/ia32/include/thread.h
rb2a0f6dd rfa23560 36 36 #define LIBC_ia32_THREAD_H_ 37 37 38 #include <libc.h>39 40 typedef struct {41 void *self;42 void *fibril_data;43 } tcb_t;44 45 static inline void __tcb_set(tcb_t *tcb)46 {47 __SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb);48 }49 50 static inline tcb_t * __tcb_get(void)51 {52 void *retval;53 54 asm ("movl %%gs:0, %0" : "=r"(retval));55 return retval;56 }57 58 38 #endif 59 39 -
uspace/lib/libc/arch/ia64/Makefile.inc
rb2a0f6dd rfa23560 38 38 ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ 39 39 arch/$(ARCH)/src/fibril.S \ 40 arch/$(ARCH)/src/t hread.c40 arch/$(ARCH)/src/tls.c 41 41 42 42 BFD_NAME = elf64-little -
uspace/lib/libc/arch/ia64/include/thread.h
rb2a0f6dd rfa23560 38 38 #define THREAD_INITIAL_STACK_PAGES_NO 2 39 39 40 /* This structure must be exactly 16 bytes long */41 typedef struct {42 void *dtv; /* unused in static linking*/43 void *fibril_data;44 } tcb_t;45 46 static inline void __tcb_set(tcb_t *tcb)47 {48 asm volatile ("mov r13 = %0\n" : : "r" (tcb) : "r13");49 }50 51 static inline tcb_t *__tcb_get(void)52 {53 void *retval;54 55 asm volatile ("mov %0 = r13\n" : "=r" (retval));56 57 return retval;58 }59 60 40 #endif 61 41 -
uspace/lib/libc/arch/ia64/src/tls.c
rb2a0f6dd rfa23560 35 35 */ 36 36 37 #include <t hread.h>37 #include <tls.h> 38 38 #include <malloc.h> 39 39 40 /** Allocate TLS & TCB for initial module threads41 *42 * @param data Start of data section43 * @return pointer to tcb_t structure44 */45 extern char _tdata_start;46 extern char _tbss_end;47 40 tcb_t * __alloc_tls(void **data, size_t size) 48 41 { 49 tcb_t *tcb; 50 51 /* ASSERT(sizeof(tcb_t) == 16); */ 52 53 tcb = malloc(sizeof(tcb_t) + size); 54 *data = ((void *) tcb) + 16; 55 56 return tcb; 42 return tls_alloc_variant_1(data, size); 57 43 } 58 44 59 45 void __free_tls_arch(tcb_t *tcb, size_t size) 60 46 { 61 free(tcb);47 tls_free_variant_1(tcb, size); 62 48 } 63 49 -
uspace/lib/libc/arch/mips32/Makefile.inc
rb2a0f6dd rfa23560 41 41 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 42 42 arch/$(ARCH)/src/fibril.S \ 43 arch/$(ARCH)/src/t hread.c43 arch/$(ARCH)/src/tls.c 44 44 45 45 -
uspace/lib/libc/arch/mips32/include/thread.h
rb2a0f6dd rfa23560 34 34 */ 35 35 36 /* TLS for MIPS is described in http://www.linux-mips.org/wiki/NPTL */37 38 36 #ifndef LIBC_mips32_THREAD_H_ 39 37 #define LIBC_mips32_THREAD_H_ 40 41 /* I did not find any specification (neither MIPS nor PowerPC), but42 * as I found it43 * - it uses Variant II44 * - TCB is at Address(First TLS Block)+0x7000.45 * - DTV is at Address(First TLS Block)+0x800046 * - What would happen if the TLS data was larger then 0x7000?47 * - The linker never accesses DTV directly, has the second definition any48 * sense?49 * We will make it this way:50 * - TCB is at TP-0x7000-sizeof(tcb)51 * - No assumption about DTV etc., but it will not have a fixed address52 */53 #define MIPS_TP_OFFSET 0x700054 55 typedef struct {56 void *fibril_data;57 } tcb_t;58 59 static inline void __tcb_set(tcb_t *tcb)60 {61 void *tp = tcb;62 tp += MIPS_TP_OFFSET + sizeof(tcb_t);63 64 asm volatile ("add $27, %0, $0" : : "r"(tp)); /* Move tls to K1 */65 }66 67 static inline tcb_t * __tcb_get(void)68 {69 void * retval;70 71 asm volatile("add %0, $27, $0" : "=r"(retval));72 73 return (tcb_t *)(retval - MIPS_TP_OFFSET - sizeof(tcb_t));74 }75 38 76 39 #endif -
uspace/lib/libc/arch/mips32/src/tls.c
rb2a0f6dd rfa23560 34 34 */ 35 35 36 #include <t hread.h>37 #include < malloc.h>36 #include <tls.h> 37 #include <sys/types.h> 38 38 39 /** Allocate TLS & TCB for initial module threads40 *41 * @param data (out) Start of TLS section42 * @param size Size of tdata+tbss section43 * @return pointer to tcb_t structure44 */45 39 tcb_t * __alloc_tls(void **data, size_t size) 46 40 { 47 tcb_t *result; 48 49 result = malloc(sizeof(tcb_t) + size); 50 *data = ((void *)result) + sizeof(tcb_t); 51 return result; 41 return tls_alloc_variant_1(data, size); 52 42 } 53 43 54 44 void __free_tls_arch(tcb_t *tcb, size_t size) 55 45 { 56 free(tcb);46 tls_free_variant_1(tcb, size); 57 47 } 58 48 -
uspace/lib/libc/arch/mips32eb/Makefile.inc
rb2a0f6dd rfa23560 36 36 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 37 37 arch/$(ARCH)/src/fibril.S \ 38 arch/$(ARCH)/src/t hread.c38 arch/$(ARCH)/src/tls.c 39 39 40 40 LFLAGS += -N -
uspace/lib/libc/arch/ppc32/Makefile.inc
rb2a0f6dd rfa23560 35 35 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 36 36 arch/$(ARCH)/src/fibril.S \ 37 arch/$(ARCH)/src/t hread.c37 arch/$(ARCH)/src/tls.c 38 38 39 39 CFLAGS += -mcpu=powerpc -msoft-float -m32 -
uspace/lib/libc/arch/ppc32/include/thread.h
rb2a0f6dd rfa23560 36 36 #define LIBC_ppc32_THREAD_H_ 37 37 38 #define PPC_TP_OFFSET 0x700039 40 typedef struct {41 void *fibril_data;42 } tcb_t;43 44 static inline void __tcb_set(tcb_t *tcb)45 {46 void *tp = tcb;47 tp += PPC_TP_OFFSET + sizeof(tcb_t);48 49 asm volatile (50 "mr %%r2, %0\n"51 :52 : "r" (tp)53 );54 }55 56 static inline tcb_t * __tcb_get(void)57 {58 void * retval;59 60 asm volatile (61 "mr %0, %%r2\n"62 : "=r" (retval)63 );64 65 return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t));66 }67 68 38 #endif 69 39 -
uspace/lib/libc/arch/ppc32/src/tls.c
rb2a0f6dd rfa23560 33 33 */ 34 34 35 #include <t hread.h>36 #include < malloc.h>35 #include <tls.h> 36 #include <sys/types.h> 37 37 38 /** Allocate TLS & TCB for initial module threads39 *40 * @param data Start of data section41 * @return pointer to tcb_t structure42 *43 */44 38 tcb_t * __alloc_tls(void **data, size_t size) 45 39 { 46 tcb_t *result; 47 48 result = malloc(sizeof(tcb_t) + size); 49 *data = ((void *)result) + sizeof(tcb_t); 50 return result; 40 return tls_alloc_variant_1(data, size); 51 41 } 52 42 53 43 void __free_tls_arch(tcb_t *tcb, size_t size) 54 44 { 55 free(tcb);45 tls_free_variant_1(tcb, size); 56 46 } 57 47 -
uspace/lib/libc/arch/ppc64/Makefile.inc
rb2a0f6dd rfa23560 35 35 ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ 36 36 arch/$(ARCH)/src/fibril.S \ 37 arch/$(ARCH)/src/t hread.c37 arch/$(ARCH)/src/tls.c 38 38 39 39 CFLAGS += -mcpu=powerpc64 -msoft-float -m64 -
uspace/lib/libc/arch/ppc64/include/thread.h
rb2a0f6dd rfa23560 36 36 #define LIBC_ppc64_THREAD_H_ 37 37 38 #define PPC_TP_OFFSET 0x700039 40 typedef struct {41 void *fibril_data;42 } tcb_t;43 44 static inline void __tcb_set(tcb_t *tcb)45 {46 void *tp = tcb;47 tp += PPC_TP_OFFSET + sizeof(tcb_t);48 49 asm volatile (50 "mr %%r2, %0\n"51 :52 : "r" (tp)53 );54 }55 56 static inline tcb_t * __tcb_get(void)57 {58 void * retval;59 60 asm volatile (61 "mr %0, %%r2\n"62 : "=r" (retval)63 );64 65 return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t));66 }67 68 38 #endif 69 39 -
uspace/lib/libc/arch/sparc64/Makefile.inc
rb2a0f6dd rfa23560 34 34 35 35 ARCH_SOURCES += arch/$(ARCH)/src/fibril.S \ 36 arch/$(ARCH)/src/t hread.c36 arch/$(ARCH)/src/tls.c 37 37 38 38 CFLAGS += -mcpu=ultrasparc -m64 -
uspace/lib/libc/arch/sparc64/include/thread.h
rb2a0f6dd rfa23560 31 31 * @{ 32 32 */ 33 /**34 * @file35 * @brief sparc64 TLS functions.36 */37 33 38 34 #ifndef LIBC_sparc64_THREAD_H_ 39 35 #define LIBC_sparc64_THREAD_H_ 40 41 typedef struct {42 void *self;43 void *fibril_data;44 } tcb_t;45 46 static inline void __tcb_set(tcb_t *tcb)47 {48 asm volatile ("mov %0, %%g7\n" : : "r" (tcb) : "g7");49 }50 51 static inline tcb_t * __tcb_get(void)52 {53 void *retval;54 55 asm volatile ("mov %%g7, %0\n" : "=r" (retval));56 57 return retval;58 }59 36 60 37 #endif
Note:
See TracChangeset
for help on using the changeset viewer.