text: /*
   * 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_ */
  