blob: 272a798ad9dcdcbbc46be89495509955049b1ccc [file] [log] [blame]
/*
* 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)
{
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_ */