Browse Source

linker: Round TLS sizes up in linker script

Instead of rounding up both __tdata_size and __tbss_size at runtime,
perform the calculation when the image is built.

Signed-off-by: Peter Mitsis <peter.mitsis@intel.com>
pull/69442/head
Peter Mitsis 1 year ago committed by Anas Nashif
parent
commit
ee9c44fee6
  1. 8
      include/zephyr/linker/thread-local-storage.ld
  2. 15
      kernel/include/kernel_tls.h

8
include/zephyr/linker/thread-local-storage.ld

@ -24,14 +24,14 @@
#else #else
PROVIDE(__tdata_start = ADDR(tdata)); PROVIDE(__tdata_start = ADDR(tdata));
#endif #endif
PROVIDE(__tdata_size = SIZEOF(tdata));
PROVIDE(__tdata_end = __tdata_start + __tdata_size);
PROVIDE(__tdata_align = ALIGNOF(tdata)); PROVIDE(__tdata_align = ALIGNOF(tdata));
PROVIDE(__tdata_size = (SIZEOF(tdata) + __tdata_align - 1) & ~(__tdata_align - 1));
PROVIDE(__tdata_end = __tdata_start + __tdata_size);
PROVIDE(__tbss_align = ALIGNOF(tbss));
PROVIDE(__tbss_start = ADDR(tbss)); PROVIDE(__tbss_start = ADDR(tbss));
PROVIDE(__tbss_size = SIZEOF(tbss)); PROVIDE(__tbss_size = (SIZEOF(tbss) + __tbss_align - 1) & ~(__tbss_align - 1));
PROVIDE(__tbss_end = __tbss_start + __tbss_size); PROVIDE(__tbss_end = __tbss_start + __tbss_size);
PROVIDE(__tbss_align = ALIGNOF(tbss));
PROVIDE(__tls_start = __tdata_start); PROVIDE(__tls_start = __tdata_start);
PROVIDE(__tls_end = __tbss_end); PROVIDE(__tls_end = __tbss_end);

15
kernel/include/kernel_tls.h

@ -28,10 +28,8 @@
*/ */
static inline size_t z_tls_data_size(void) static inline size_t z_tls_data_size(void)
{ {
size_t tdata_size = ROUND_UP(__tdata_size, __tdata_align); return (size_t)(uintptr_t)__tdata_size +
size_t tbss_size = ROUND_UP(__tbss_size, __tbss_align); (size_t)(uintptr_t)__tbss_size;
return tdata_size + tbss_size;
} }
/** /**
@ -44,15 +42,12 @@ static inline size_t z_tls_data_size(void)
*/ */
static inline void z_tls_copy(char *dest) static inline void z_tls_copy(char *dest)
{ {
size_t tdata_size = (size_t)__tdata_size;
size_t tbss_size = (size_t)__tbss_size;
/* Copy initialized data (tdata) */ /* Copy initialized data (tdata) */
memcpy(dest, __tdata_start, tdata_size); memcpy(dest, __tdata_start, (size_t)(uintptr_t)__tdata_size);
/* Clear BSS data (tbss) */ /* Clear BSS data (tbss) */
dest += ROUND_UP(tdata_size, __tdata_align); dest += (size_t)(uintptr_t)__tdata_size;
memset(dest, 0, tbss_size); memset(dest, 0, (size_t)(uintptr_t)__tbss_size);
} }
#endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_ */ #endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_ */

Loading…
Cancel
Save