zephyr/kernel/include/kernel_tls.h
Peter Mitsis ee9c44fee6 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>
2024-02-25 22:28:56 -05:00

54 lines
1.3 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 <zephyr/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)
{
return (size_t)(uintptr_t)__tdata_size +
(size_t)(uintptr_t)__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)
{
/* Copy initialized data (tdata) */
memcpy(dest, __tdata_start, (size_t)(uintptr_t)__tdata_size);
/* Clear BSS data (tbss) */
dest += (size_t)(uintptr_t)__tdata_size;
memset(dest, 0, (size_t)(uintptr_t)__tbss_size);
}
#endif /* ZEPHYR_KERNEL_INCLUDE_KERNEL_TLS_H_ */