mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-11 14:52:56 +00:00
This lets the linker tell us what kind of alignment is required for both tdata and tbss data when copying them into stack. If they are not aligned as expected by the toolchain, generated code would be accessing incorrect location for thread variables. Fixes #32015 Signed-off-by: Daniel Leung <daniel.leung@intel.com>
59 lines
1.4 KiB
C
59 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2020 Intel Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Kernel Thread Local Storage APIs.
|
|
*
|
|
* Kernel APIs related to thread local storage.
|
|
*/
|
|
|
|
#ifndef ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_
|
|
#define ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_
|
|
|
|
#include <linker/linker-defs.h>
|
|
|
|
/**
|
|
* @brief Return the total size of TLS data/bss areas
|
|
*
|
|
* This returns the total size of thread local storage (TLS)
|
|
* data and bss areas as defined in the linker script.
|
|
* Note that this does not include any architecture specific
|
|
* bits required for proper functionality of TLS.
|
|
*
|
|
* @return Total size of TLS data/bss areas
|
|
*/
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* @brief Copy the TLS data/bss areas into destination
|
|
*
|
|
* This copies the TLS data into destination and clear the area
|
|
* of TLS bss size after the data section.
|
|
*
|
|
* @param dest Pointer to destination
|
|
*/
|
|
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);
|
|
|
|
/* Clear BSS data (tbss) */
|
|
dest += ROUND_UP(tdata_size, __tdata_align);
|
|
memset(dest, 0, tbss_size);
|
|
}
|
|
|
|
#endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_ */
|