diff --git a/include/zephyr/linker/thread-local-storage.ld b/include/zephyr/linker/thread-local-storage.ld index 6cfb74e9b72..5a1313e1c8c 100644 --- a/include/zephyr/linker/thread-local-storage.ld +++ b/include/zephyr/linker/thread-local-storage.ld @@ -24,14 +24,14 @@ #else PROVIDE(__tdata_start = ADDR(tdata)); #endif - PROVIDE(__tdata_size = SIZEOF(tdata)); - PROVIDE(__tdata_end = __tdata_start + __tdata_size); 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_size = SIZEOF(tbss)); + PROVIDE(__tbss_size = (SIZEOF(tbss) + __tbss_align - 1) & ~(__tbss_align - 1)); PROVIDE(__tbss_end = __tbss_start + __tbss_size); - PROVIDE(__tbss_align = ALIGNOF(tbss)); PROVIDE(__tls_start = __tdata_start); PROVIDE(__tls_end = __tbss_end); diff --git a/kernel/include/kernel_tls.h b/kernel/include/kernel_tls.h index 272a798ad9d..a50c1fc26a9 100644 --- a/kernel/include/kernel_tls.h +++ b/kernel/include/kernel_tls.h @@ -28,10 +28,8 @@ */ static inline size_t z_tls_data_size(void) { - size_t tdata_size = ROUND_UP(__tdata_size, __tdata_align); - size_t tbss_size = ROUND_UP(__tbss_size, __tbss_align); - - return tdata_size + tbss_size; + return (size_t)(uintptr_t)__tdata_size + + (size_t)(uintptr_t)__tbss_size; } /** @@ -44,15 +42,12 @@ static inline size_t z_tls_data_size(void) */ 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) */ - memcpy(dest, __tdata_start, tdata_size); + memcpy(dest, __tdata_start, (size_t)(uintptr_t)__tdata_size); /* Clear BSS data (tbss) */ - dest += ROUND_UP(tdata_size, __tdata_align); - memset(dest, 0, tbss_size); + dest += (size_t)(uintptr_t)__tdata_size; + memset(dest, 0, (size_t)(uintptr_t)__tbss_size); } #endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_ */