23 #ifndef _RTEMS_SCORE_TLS_H 24 #define _RTEMS_SCORE_TLS_H 26 #include <rtems/score/cpu.h> 47 extern char _TLS_Data_begin[];
49 extern char _TLS_Data_end[];
51 extern char _TLS_Data_size[];
53 extern char _TLS_BSS_begin[];
55 extern char _TLS_BSS_end[];
57 extern char _TLS_BSS_size[];
59 extern char _TLS_Size[];
61 extern char _TLS_Alignment[];
68 uint32_t generation_number;
83 static inline uintptr_t _TLS_Get_size(
void )
89 return (uintptr_t) _TLS_BSS_end - (uintptr_t) _TLS_Data_begin;
92 static inline uintptr_t _TLS_Heap_align_up( uintptr_t val )
94 uintptr_t msk = CPU_HEAP_ALIGNMENT - 1;
96 return (val + msk) & ~msk;
99 static inline uintptr_t _TLS_Get_thread_control_block_area_size(
107 static inline uintptr_t _TLS_Get_allocation_size(
112 uintptr_t aligned_size = _TLS_Heap_align_up( size );
114 return _TLS_Get_thread_control_block_area_size( alignment )
118 static inline void *_TLS_Copy_and_clear(
void *tls_area )
123 (
size_t) ((uintptr_t)_TLS_Data_size)
128 (
char *) tls_area + (
size_t)((intptr_t) _TLS_BSS_begin) -
129 (
size_t)((intptr_t) _TLS_Data_begin),
131 ((
size_t) (intptr_t)_TLS_BSS_size)
137 static inline void *_TLS_Initialize(
144 dtv->generation_number = 1;
145 dtv->tls_blocks[0] = tls_block;
147 return _TLS_Copy_and_clear( tls_block );
151 static inline void *_TLS_TCB_at_area_begin_initialize(
void *tls_area )
153 void *tls_block = (
char *) tls_area
154 + _TLS_Get_thread_control_block_area_size( (uintptr_t) _TLS_Alignment );
156 uintptr_t aligned_size = _TLS_Heap_align_up( (uintptr_t) _TLS_Size );
158 ((
char *) tls_block + aligned_size);
160 return _TLS_Initialize( tls_block, tcb, dtv );
164 static inline void *_TLS_TCB_before_TLS_block_initialize(
void *tls_area )
166 void *tls_block = (
char *) tls_area
167 + _TLS_Get_thread_control_block_area_size( (uintptr_t) _TLS_Alignment );
169 ((
char *) tls_block -
sizeof(*tcb));
170 uintptr_t aligned_size = _TLS_Heap_align_up( (uintptr_t) _TLS_Size );
172 ((
char *) tls_block + aligned_size);
174 return _TLS_Initialize( tls_block, tcb, dtv );
178 static inline void *_TLS_TCB_after_TLS_block_initialize(
void *tls_area )
180 uintptr_t size = (uintptr_t) _TLS_Size;
181 uintptr_t tls_align = (uintptr_t) _TLS_Alignment;
182 uintptr_t tls_mask = tls_align - 1;
183 uintptr_t heap_align = _TLS_Heap_align_up( tls_align );
184 uintptr_t heap_mask = heap_align - 1;
186 ((
char *) tls_area + ((size + heap_mask) & ~heap_mask));
187 void *tls_block = (
char *) tcb - ((size + tls_mask) & ~tls_mask);
189 ((
char *) tcb +
sizeof(*tcb));
191 _TLS_Initialize( tls_block, tcb, dtv );