LCOV - code coverage report
Current view: top level - zephyr/kernel - thread_stack.h Coverage Total Hit
Test: new.info Lines: 70.4 % 27 19
Test Date: 2025-09-05 22:20:39

            Line data    Source code
       1            1 : /*
       2              :  * Copyright (c) 2020 Intel Corporation
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  *
      10              :  * @brief Macros for declaring thread stacks
      11              :  */
      12              : 
      13              : /**
      14              :  * @brief Thread Stack APIs
      15              :  * @ingroup kernel_apis
      16              :  * @defgroup thread_stack_api Thread Stack APIs
      17              :  * @{
      18              :  * @}
      19              :  */
      20              : 
      21              : #ifndef ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
      22              : #define ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
      23              : 
      24              : #if !defined(_ASMLANGUAGE)
      25              : #include <zephyr/arch/cpu.h>
      26              : #include <zephyr/sys/util.h>
      27              : 
      28              : #ifdef __cplusplus
      29              : extern "C" {
      30              : #endif
      31              : 
      32              : /* Using typedef deliberately here, this is quite intended to be an opaque
      33              :  * type.
      34              :  *
      35              :  * The purpose of this data type is to clearly distinguish between the
      36              :  * declared symbol for a stack (of type k_thread_stack_t) and the underlying
      37              :  * buffer which composes the stack data actually used by the underlying
      38              :  * thread; they cannot be used interchangeably as some arches precede the
      39              :  * stack buffer region with guard areas that trigger a MPU or MMU fault
      40              :  * if written to.
      41              :  *
      42              :  * APIs that want to work with the buffer inside should continue to use
      43              :  * char *.
      44              :  *
      45              :  * Stacks should always be created with K_THREAD_STACK_DEFINE().
      46              :  */
      47              : struct __packed z_thread_stack_element {
      48              :         char data;
      49              : };
      50              : 
      51              : /**
      52              :  * @typedef k_thread_stack_t
      53              :  * @brief Typedef of struct z_thread_stack_element
      54              :  *
      55              :  * @see z_thread_stack_element
      56              :  */
      57              : 
      58              : 
      59              : /**
      60              :  * @brief Properly align a CPU stack pointer value
      61              :  *
      62              :  * Take the provided value and round it down such that the value is aligned
      63              :  * to the CPU and ABI requirements. This is not used for any memory protection
      64              :  * hardware requirements.
      65              :  *
      66              :  * @param ptr Proposed stack pointer address
      67              :  * @return Properly aligned stack pointer address
      68              :  */
      69              : static inline char *z_stack_ptr_align(char *ptr)
      70              : {
      71              :         return (char *)ROUND_DOWN(ptr, ARCH_STACK_PTR_ALIGN);
      72              : }
      73              : #define Z_STACK_PTR_ALIGN(ptr) ((uintptr_t)z_stack_ptr_align((char *)(ptr)))
      74              : 
      75              : /**
      76              :  * @brief Helper macro for getting a stack frame struct
      77              :  *
      78              :  * It is very common for architectures to define a struct which contains
      79              :  * all the data members that are pre-populated in arch_new_thread().
      80              :  *
      81              :  * Given a type and an initial stack pointer, return a properly cast
      82              :  * pointer to the frame struct.
      83              :  *
      84              :  * @param type Type of the initial stack frame struct
      85              :  * @param ptr Initial aligned stack pointer value
      86              :  * @return Pointer to stack frame struct within the stack buffer
      87              :  */
      88              : #define Z_STACK_PTR_TO_FRAME(type, ptr) \
      89              :         (type *)((ptr) - sizeof(type))
      90              : 
      91              : #ifdef ARCH_KERNEL_STACK_RESERVED
      92              : #define K_KERNEL_STACK_RESERVED ((size_t)ARCH_KERNEL_STACK_RESERVED)
      93              : #else
      94            0 : #define K_KERNEL_STACK_RESERVED ((size_t)0)
      95              : #endif /* ARCH_KERNEL_STACK_RESERVED */
      96              : 
      97              : #define Z_KERNEL_STACK_SIZE_ADJUST(size) (ROUND_UP(size, \
      98              :                                                    ARCH_STACK_PTR_ALIGN) + \
      99              :                                           K_KERNEL_STACK_RESERVED)
     100              : 
     101              : #ifdef ARCH_KERNEL_STACK_OBJ_ALIGN
     102              : #define Z_KERNEL_STACK_OBJ_ALIGN        ARCH_KERNEL_STACK_OBJ_ALIGN
     103              : #else
     104              : #define Z_KERNEL_STACK_OBJ_ALIGN        ARCH_STACK_PTR_ALIGN
     105              : #endif /* ARCH_KERNEL_STACK_OBJ_ALIGN */
     106              : 
     107            0 : #define K_KERNEL_STACK_LEN(size) \
     108              :         ROUND_UP(Z_KERNEL_STACK_SIZE_ADJUST(size), Z_KERNEL_STACK_OBJ_ALIGN)
     109              : 
     110              : /**
     111              :  * @addtogroup thread_stack_api
     112              :  * @{
     113              :  */
     114              : 
     115              : #ifdef CONFIG_HW_SHADOW_STACK
     116              : /**
     117              :  * @typedef k_thread_hw_shadow_stack_t
     118              :  * @brief Typedef of arch_thread_hw_shadow_stack_t
     119              :  *
     120              :  * This is an opaque type that represents a hardware shadow stack.
     121              :  * The architecture implementation defines the actual type.
     122              :  */
     123              : #define k_thread_hw_shadow_stack_t arch_thread_hw_shadow_stack_t
     124              : 
     125              : /**
     126              :  * @brief Calculate the size of a hardware shadow stack
     127              :  *
     128              :  * This macro calculates the size to be allocated for a hardware shadow
     129              :  * stack. It accepts the indicated "size" as a parameter and pads some
     130              :  * extra bytes (e.g. for alignment).
     131              :  *
     132              :  * @param size Size of the shadow stack memory region
     133              :  */
     134              : #define K_THREAD_HW_SHADOW_STACK_SIZE(size_) \
     135              :         ARCH_THREAD_HW_SHADOW_STACK_SIZE(size_)
     136              : 
     137              : /**
     138              :  * @brief Declare a hardware shadow stack
     139              :  *
     140              :  * This macro declares the symbol of a hardware shadow stack defined
     141              :  * elsewhere in the current scope.
     142              :  *
     143              :  * @param sym Hardware shadow stack symbol name
     144              :  * @param size Size of the shadow stack memory region
     145              :  */
     146              : #define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size) \
     147              :         ARCH_THREAD_HW_SHADOW_STACK_DECLARE(__ ## sym ## _shstk, size)
     148              : 
     149              : /**
     150              :  * @brief Declare a hardware shadow stack array
     151              :  *
     152              :  * This macro declares the symbol of a hardware shadow stack array defined
     153              :  * elsewhere in the current scope.
     154              :  *
     155              :  * @param sym Hardware shadow stack array symbol name
     156              :  * @param nmemb Number of stacks defined
     157              :  * @param size Size of the shadow stack memory region
     158              :  */
     159              : #define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     160              :         ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DECLARE(__ ## sym ## _shstk_arr, \
     161              :                                                   nmemb, size)
     162              : 
     163              : struct _stack_to_hw_shadow_stack {
     164              :         k_thread_stack_t *stack;
     165              :         k_thread_hw_shadow_stack_t *shstk_addr;
     166              :         size_t size;
     167              : };
     168              : 
     169              : 
     170              : /**
     171              :  * @brief Define a hardware shadow stack
     172              :  *
     173              :  * This macro defines a hardware shadow stack. Note that an application
     174              :  * usually doesn't have to define a hardware shadow stack directly,
     175              :  * as it is automatically defined by the kernel when a thread stack is
     176              :  * defined with K_THREAD_STACK_DEFINE().
     177              :  *
     178              :  * @param sym Hardware shadow stack symbol name
     179              :  * @param size Size of the shadow stack memory region
     180              :  */
     181              : #define K_THREAD_HW_SHADOW_STACK_DEFINE(sym, size_) \
     182              :         ARCH_THREAD_HW_SHADOW_STACK_DEFINE(__ ## sym ## _shstk, size_); \
     183              :         static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack, \
     184              :                 sym ## _stack_to_shstk_attach) = { \
     185              :                 .stack = sym, \
     186              :                 .shstk_addr = __ ## sym ## _shstk, \
     187              :                 .size = size_, \
     188              :         }
     189              : 
     190              : struct _stack_to_hw_shadow_stack_arr {
     191              :         uintptr_t stack_addr;
     192              :         uintptr_t shstk_addr;
     193              :         size_t stack_size;
     194              :         size_t shstk_size;
     195              :         size_t nmemb;
     196              : };
     197              : 
     198              : /**
     199              :  * @brief Define a hardware shadow stack array
     200              :  *
     201              :  * This macro defines a hardware shadow stack array. Note that an application
     202              :  * usually doesn't have to define a hardware shadow stack array directly,
     203              :  * as it is automatically defined by the kernel when a thread stack array is
     204              :  * defined with K_THREAD_STACK_ARRAY_DEFINE().
     205              :  *
     206              :  * @param sym Hardware shadow stack array symbol name
     207              :  * @param nmemb Number of stacks defined
     208              :  * @param size Size of the shadow stack memory region
     209              :  */
     210              : #define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb_, size_) \
     211              :         ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(__ ## sym ## _shstk_arr, nmemb_, \
     212              :                         K_THREAD_HW_SHADOW_STACK_SIZE(size_)); \
     213              :         static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack_arr, \
     214              :                 sym ## _stack_to_shstk_attach) = { \
     215              :                 .stack_addr = (uintptr_t)sym, \
     216              :                 .stack_size = K_KERNEL_STACK_LEN(size_), \
     217              :                 .nmemb = nmemb_, \
     218              :                 .shstk_addr = (uintptr_t)__ ## sym ## _shstk_arr, \
     219              :                 .shstk_size = K_THREAD_HW_SHADOW_STACK_SIZE(size_), \
     220              :         }
     221              : 
     222              : /**
     223              :  * @brief Attach a hardware shadow stack to a thread
     224              :  *
     225              :  * This macro attaches a hardware shadow stack to a thread. Note that an
     226              :  * application usually doesn't have to attach a hardware shadow stack
     227              :  * directly, as it is automatically attached by the kernel when a thread
     228              :  * is created.
     229              :  */
     230              : #define k_thread_hw_shadow_stack_attach arch_thread_hw_shadow_stack_attach
     231              : 
     232              : struct _thread_hw_shadow_stack_static {
     233              :         struct k_thread *thread;
     234              :         k_thread_hw_shadow_stack_t *shstk_addr;
     235              :         size_t size;
     236              : };
     237              : 
     238              : /**
     239              :  * @brief Attach a hardware shadow stack to a thread
     240              :  *
     241              :  * This macro attaches a hardware shadow stack to a thread. Note that an
     242              :  * application usually doesn't have to attach a hardware shadow stack
     243              :  * directly, as it is automatically attached by the kernel when a thread
     244              :  * is created.
     245              :  *
     246              :  * @param thread_ Thread to attach the hardware shadow stack to
     247              :  * @param shstk_addr_ Address of the hardware shadow stack
     248              :  * @param size_ Size of the hardware shadow stack memory region
     249              :  */
     250              : #define K_THREAD_HW_SHADOW_STACK_ATTACH(thread_, shstk_addr_, size_) \
     251              :         static const STRUCT_SECTION_ITERABLE(_thread_hw_shadow_stack_static, \
     252              :                 thread ## _shstk_attach_static) = { \
     253              :                 .thread = thread_, \
     254              :                 .shstk_addr = shstk_addr_, \
     255              :                 .size = size_, \
     256              :         }
     257              : 
     258              : #else
     259            0 : #define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size)
     260            0 : #define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size)
     261            0 : #define K_THREAD_HW_SHADOW_STACK_DEFINE(sym, size)
     262            0 : #define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size_)
     263              : #endif
     264              : 
     265              : /**
     266              :  * @brief Declare a reference to a thread stack
     267              :  *
     268              :  * This macro declares the symbol of a thread stack defined elsewhere in the
     269              :  * current scope.
     270              :  *
     271              :  * @param sym Thread stack symbol name
     272              :  * @param size Size of the stack memory region
     273              :  */
     274            1 : #define K_KERNEL_STACK_DECLARE(sym, size) \
     275              :         K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
     276              :         extern struct z_thread_stack_element \
     277              :                 sym[K_KERNEL_STACK_LEN(size)]
     278              : 
     279              : /**
     280              :  * @brief Declare a reference to a thread stack array
     281              :  *
     282              :  * This macro declares the symbol of a thread stack array defined elsewhere in
     283              :  * the current scope.
     284              :  *
     285              :  * @param sym Thread stack symbol name
     286              :  * @param nmemb Number of stacks defined
     287              :  * @param size Size of the stack memory region
     288              :  */
     289            1 : #define K_KERNEL_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     290              :         K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
     291              :         extern struct z_thread_stack_element \
     292              :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     293              : 
     294              : /**
     295              :  * @brief Declare a reference to a pinned thread stack array
     296              :  *
     297              :  * This macro declares the symbol of a pinned thread stack array defined
     298              :  * elsewhere in the current scope.
     299              :  *
     300              :  * @param sym Thread stack symbol name
     301              :  * @param nmemb Number of stacks defined
     302              :  * @param size Size of the stack memory region
     303              :  */
     304            1 : #define K_KERNEL_PINNED_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     305              :         K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
     306              :         extern struct z_thread_stack_element \
     307              :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     308              : 
     309              : /**
     310              :  * @brief Define a toplevel kernel stack memory region in specified section
     311              :  *
     312              :  * This defines a region of memory for use as a thread stack in
     313              :  * the specified linker section.
     314              :  *
     315              :  * It is legal to precede this definition with the 'static' keyword.
     316              :  *
     317              :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     318              :  * parameter of k_thread_create(), it may not be the same as the
     319              :  * 'size' parameter. Use K_KERNEL_STACK_SIZEOF() instead.
     320              :  *
     321              :  * The total amount of memory allocated may be increased to accommodate
     322              :  * fixed-size stack overflow guards.
     323              :  *
     324              :  * @param sym Thread stack symbol name
     325              :  * @param size Size of the stack memory region
     326              :  * @param lsect Linker section for this stack
     327              :  */
     328              : #define Z_KERNEL_STACK_DEFINE_IN(sym, size, lsect) \
     329              :         struct z_thread_stack_element lsect \
     330              :                 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
     331              :                 sym[K_KERNEL_STACK_LEN(size)]
     332              : 
     333              : /**
     334              :  * @brief Define a toplevel array of kernel stack memory regions in specified section
     335              :  *
     336              :  * @param sym Kernel stack array symbol name
     337              :  * @param nmemb Number of stacks to define
     338              :  * @param size Size of the stack memory region
     339              :  * @param lsect Linker section for this array of stacks
     340              :  */
     341              : #define Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
     342              :         struct z_thread_stack_element lsect \
     343              :                 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
     344              :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     345              : 
     346              : /**
     347              :  * @brief Define a toplevel kernel stack memory region
     348              :  *
     349              :  * This defines a region of memory for use as a thread stack, for threads
     350              :  * that exclusively run in supervisor mode. This is also suitable for
     351              :  * declaring special stacks for interrupt or exception handling.
     352              :  *
     353              :  * Stacks defined with this macro may not host user mode threads.
     354              :  *
     355              :  * It is legal to precede this definition with the 'static' keyword.
     356              :  *
     357              :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     358              :  * parameter of k_thread_create(), it may not be the same as the
     359              :  * 'size' parameter. Use K_KERNEL_STACK_SIZEOF() instead.
     360              :  *
     361              :  * The total amount of memory allocated may be increased to accommodate
     362              :  * fixed-size stack overflow guards.
     363              :  *
     364              :  * @param sym Thread stack symbol name
     365              :  * @param size Size of the stack memory region
     366              :  */
     367            1 : #define K_KERNEL_STACK_DEFINE(sym, size) \
     368              :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
     369              :         K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
     370              :                                         K_THREAD_HW_SHADOW_STACK_SIZE(size))
     371              : 
     372              : /**
     373              :  * @brief Define a toplevel kernel stack memory region in pinned section
     374              :  *
     375              :  * See K_KERNEL_STACK_DEFINE() for more information and constraints.
     376              :  *
     377              :  * This puts the stack into the pinned noinit linker section if
     378              :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     379              :  * put the stack into the same section as K_KERNEL_STACK_DEFINE().
     380              :  *
     381              :  * @param sym Thread stack symbol name
     382              :  * @param size Size of the stack memory region
     383              :  */
     384              : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     385              : #define K_KERNEL_PINNED_STACK_DEFINE(sym, size) \
     386              :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __pinned_noinit); \
     387              :         K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
     388              :                                         K_THREAD_HW_SHADOW_STACK_SIZE(size))
     389              : #else
     390            1 : #define K_KERNEL_PINNED_STACK_DEFINE(sym, size) \
     391              :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
     392              :         K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
     393              :                                         K_THREAD_HW_SHADOW_STACK_SIZE(size))
     394              : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     395              : 
     396              : /**
     397              :  * @brief Define a toplevel array of kernel stack memory regions
     398              :  *
     399              :  * Stacks defined with this macro may not host user mode threads.
     400              :  *
     401              :  * @param sym Kernel stack array symbol name
     402              :  * @param nmemb Number of stacks to define
     403              :  * @param size Size of the stack memory region
     404              :  */
     405            1 : #define K_KERNEL_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     406              :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
     407              :         K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
     408              : 
     409              : 
     410              : /**
     411              :  * @brief Define a toplevel array of kernel stack memory regions in pinned section
     412              :  *
     413              :  * See K_KERNEL_STACK_ARRAY_DEFINE() for more information and constraints.
     414              :  *
     415              :  * This puts the stack into the pinned noinit linker section if
     416              :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     417              :  * put the stack into the same section as K_KERNEL_STACK_ARRAY_DEFINE().
     418              :  *
     419              :  * @param sym Kernel stack array symbol name
     420              :  * @param nmemb Number of stacks to define
     421              :  * @param size Size of the stack memory region
     422              :  */
     423              : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     424              : #define K_KERNEL_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     425              :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __pinned_noinit); \
     426              :         K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
     427              : #else
     428            1 : #define K_KERNEL_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     429              :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
     430              :         K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
     431              : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     432              : 
     433              : /**
     434              :  * @brief Define an embedded stack memory region
     435              :  *
     436              :  * Used for kernel stacks embedded within other data structures.
     437              :  *
     438              :  * Stacks defined with this macro may not host user mode threads.
     439              :  * @param sym Thread stack symbol name
     440              :  * @param size Size of the stack memory region
     441              :  */
     442            1 : #define K_KERNEL_STACK_MEMBER(sym, size) \
     443              :         Z_KERNEL_STACK_DEFINE_IN(sym, size,)
     444              : 
     445            0 : #define K_KERNEL_STACK_SIZEOF(sym) (sizeof(sym) - K_KERNEL_STACK_RESERVED)
     446              : 
     447              : /** @} */
     448              : 
     449            0 : static inline char *K_KERNEL_STACK_BUFFER(k_thread_stack_t *sym)
     450              : {
     451              :         return (char *)sym + K_KERNEL_STACK_RESERVED;
     452              : }
     453              : #ifndef CONFIG_USERSPACE
     454              : #define K_THREAD_STACK_RESERVED         K_KERNEL_STACK_RESERVED
     455              : #define K_THREAD_STACK_SIZEOF           K_KERNEL_STACK_SIZEOF
     456              : #define K_THREAD_STACK_LEN              K_KERNEL_STACK_LEN
     457              : #define K_THREAD_STACK_DEFINE           K_KERNEL_STACK_DEFINE
     458              : #define K_THREAD_STACK_ARRAY_DEFINE     K_KERNEL_STACK_ARRAY_DEFINE
     459              : #define K_THREAD_STACK_BUFFER           K_KERNEL_STACK_BUFFER
     460              : #define K_THREAD_STACK_DECLARE          K_KERNEL_STACK_DECLARE
     461              : #define K_THREAD_STACK_ARRAY_DECLARE    K_KERNEL_STACK_ARRAY_DECLARE
     462              : #define K_THREAD_PINNED_STACK_DEFINE    K_KERNEL_PINNED_STACK_DEFINE
     463              : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE \
     464              :                                         K_KERNEL_PINNED_STACK_ARRAY_DEFINE
     465              : #else
     466              : /**
     467              :  * @brief Indicate how much additional memory is reserved for stack objects
     468              :  *
     469              :  * Any given stack declaration may have additional memory in it for guard
     470              :  * areas, supervisor mode stacks, or platform-specific data.  This macro
     471              :  * indicates how much space is reserved for this.
     472              :  *
     473              :  * This value only indicates memory that is permanently reserved in the stack
     474              :  * object. Memory that is "borrowed" from the thread's stack buffer is never
     475              :  * accounted for here.
     476              :  *
     477              :  * Reserved memory is at the beginning of the stack object. The reserved area
     478              :  * must be appropriately sized such that the stack buffer immediately following
     479              :  * it is correctly aligned.
     480              :  */
     481              : #ifdef ARCH_THREAD_STACK_RESERVED
     482              : #define K_THREAD_STACK_RESERVED         ((size_t)(ARCH_THREAD_STACK_RESERVED))
     483              : #else
     484            1 : #define K_THREAD_STACK_RESERVED         ((size_t)0U)
     485              : #endif /* ARCH_THREAD_STACK_RESERVED */
     486              : 
     487              : /**
     488              :  * @brief Properly align the lowest address of a stack object
     489              :  *
     490              :  * Return an alignment value for the lowest address of a stack object, taking
     491              :  * into consideration all alignment constraints imposed by the CPU, ABI, and
     492              :  * any memory management policies, including any alignment required by
     493              :  * reserved platform data within the stack object. This will always be at least
     494              :  * ARCH_STACK_PTR_ALIGN or an even multiple thereof.
     495              :  *
     496              :  * Depending on hardware, this is either a fixed value or a function of the
     497              :  * provided size. The requested size is significant only if
     498              :  * CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT is enabled.
     499              :  *
     500              :  * If CONFIG_USERSPACE is enabled, this determines the alignment of stacks
     501              :  * which may be used by user mode threads, or threads running in supervisor
     502              :  * mode which may later drop privileges to user mode.
     503              :  *
     504              :  * Arches define this with ARCH_THREAD_STACK_OBJ_ALIGN().
     505              :  *
     506              :  * If ARCH_THREAD_STACK_OBJ_ALIGN is not defined assume ARCH_STACK_PTR_ALIGN
     507              :  * is appropriate.
     508              :  *
     509              :  * @param size Requested size of the stack buffer (which could be ignored)
     510              :  * @return Alignment of the stack object
     511              :  */
     512              : #if defined(ARCH_THREAD_STACK_OBJ_ALIGN)
     513              : #define Z_THREAD_STACK_OBJ_ALIGN(size)  \
     514              :         ARCH_THREAD_STACK_OBJ_ALIGN(Z_THREAD_STACK_SIZE_ADJUST(size))
     515              : #else
     516              : #define Z_THREAD_STACK_OBJ_ALIGN(size)  ARCH_STACK_PTR_ALIGN
     517              : #endif /* ARCH_THREAD_STACK_OBJ_ALIGN */
     518              : 
     519              : /**
     520              :  * @brief Round up a requested stack size to satisfy constraints
     521              :  *
     522              :  * Given a requested stack buffer size, return an adjusted size value for
     523              :  * the entire stack object which takes into consideration:
     524              :  *
     525              :  * - Reserved memory for platform data
     526              :  * - Alignment of stack buffer bounds to CPU/ABI constraints
     527              :  * - Alignment of stack buffer bounds to satisfy memory management hardware
     528              :  *   constraints such that a protection region can cover the stack buffer area
     529              :  *
     530              :  * If CONFIG_USERSPACE is enabled, this determines the size of stack objects
     531              :  * which  may be used by user mode threads, or threads running in supervisor
     532              :  * mode which may later drop privileges to user mode.
     533              :  *
     534              :  * Arches define this with ARCH_THREAD_STACK_SIZE_ADJUST().
     535              :  *
     536              :  * If ARCH_THREAD_STACK_SIZE_ADJUST is not defined, assume rounding up to
     537              :  * ARCH_STACK_PTR_ALIGN is appropriate.
     538              :  *
     539              :  * Any memory reserved for platform data is also included in the total
     540              :  * returned.
     541              :  *
     542              :  * @param size Requested size of the stack buffer
     543              :  * @return Adjusted size of the stack object
     544              :  */
     545              : #if defined(ARCH_THREAD_STACK_SIZE_ADJUST)
     546              : #define Z_THREAD_STACK_SIZE_ADJUST(size) \
     547              :         ARCH_THREAD_STACK_SIZE_ADJUST((size) + K_THREAD_STACK_RESERVED)
     548              : #else
     549              : #define Z_THREAD_STACK_SIZE_ADJUST(size) \
     550              :         (ROUND_UP((size), ARCH_STACK_PTR_ALIGN) + K_THREAD_STACK_RESERVED)
     551              : #endif /* ARCH_THREAD_STACK_SIZE_ADJUST */
     552              : 
     553              : /**
     554              :  * @addtogroup thread_stack_api
     555              :  * @{
     556              :  */
     557              : 
     558              : /**
     559              :  * @brief Declare a reference to a thread stack
     560              :  *
     561              :  * This macro declares the symbol of a thread stack defined elsewhere in the
     562              :  * current scope.
     563              :  *
     564              :  * @param sym Thread stack symbol name
     565              :  * @param size Size of the stack memory region
     566              :  */
     567            1 : #define K_THREAD_STACK_DECLARE(sym, size) \
     568              :         extern struct z_thread_stack_element \
     569              :                 sym[K_THREAD_STACK_LEN(size)]
     570              : 
     571              : /**
     572              :  * @brief Declare a reference to a thread stack array
     573              :  *
     574              :  * This macro declares the symbol of a thread stack array defined elsewhere in
     575              :  * the current scope.
     576              :  *
     577              :  * @param sym Thread stack symbol name
     578              :  * @param nmemb Number of stacks defined
     579              :  * @param size Size of the stack memory region
     580              :  */
     581            1 : #define K_THREAD_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     582              :         extern struct z_thread_stack_element \
     583              :                 sym[nmemb][K_THREAD_STACK_LEN(size)]
     584              : 
     585              : /**
     586              :  * @brief Return the size in bytes of a stack memory region
     587              :  *
     588              :  * Convenience macro for passing the desired stack size to k_thread_create()
     589              :  * since the underlying implementation may actually create something larger
     590              :  * (for instance a guard area).
     591              :  *
     592              :  * The value returned here is not guaranteed to match the 'size' parameter
     593              :  * passed to K_THREAD_STACK_DEFINE and may be larger, but is always safe to
     594              :  * pass to k_thread_create() for the associated stack object.
     595              :  *
     596              :  * @param sym Stack memory symbol
     597              :  * @return Size of the stack buffer
     598              :  */
     599            1 : #define K_THREAD_STACK_SIZEOF(sym)      (sizeof(sym) - K_THREAD_STACK_RESERVED)
     600              : 
     601              : /**
     602              :  * @brief Define a toplevel thread stack memory region in specified region
     603              :  *
     604              :  * This defines a region of memory suitable for use as a thread's stack
     605              :  * in specified region.
     606              :  *
     607              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     608              :  * and put in 'noinit' section so that it isn't zeroed at boot
     609              :  *
     610              :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     611              :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     612              :  * inside needs to be examined, examine thread->stack_info for the associated
     613              :  * thread object to obtain the boundaries.
     614              :  *
     615              :  * It is legal to precede this definition with the 'static' keyword.
     616              :  *
     617              :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     618              :  * parameter of k_thread_create(), it may not be the same as the
     619              :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     620              :  *
     621              :  * Some arches may round the size of the usable stack region up to satisfy
     622              :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     623              :  * size.
     624              :  *
     625              :  * @param sym Thread stack symbol name
     626              :  * @param size Size of the stack memory region
     627              :  * @param lsect Linker section for this stack
     628              :  */
     629              : #define Z_THREAD_STACK_DEFINE_IN(sym, size, lsect) \
     630              :         struct z_thread_stack_element lsect \
     631              :                 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
     632              :                 sym[K_THREAD_STACK_LEN(size)]
     633              : 
     634              : /**
     635              :  * @brief Define a toplevel array of thread stack memory regions in specified region
     636              :  *
     637              :  * Create an array of equally sized stacks. See Z_THREAD_STACK_DEFINE_IN
     638              :  * definition for additional details and constraints.
     639              :  *
     640              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     641              :  * and put in specified section so that it isn't zeroed at boot
     642              :  *
     643              :  * @param sym Thread stack symbol name
     644              :  * @param nmemb Number of stacks to define
     645              :  * @param size Size of the stack memory region
     646              :  * @param lsect Linker section for this stack
     647              :  */
     648              : #define Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
     649              :         struct z_thread_stack_element lsect \
     650              :                 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
     651              :                 sym[nmemb][K_THREAD_STACK_LEN(size)]
     652              : 
     653              : /**
     654              :  * @brief Define a toplevel thread stack memory region
     655              :  *
     656              :  * This defines a region of memory suitable for use as a thread's stack.
     657              :  *
     658              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     659              :  * and put in 'noinit' section so that it isn't zeroed at boot
     660              :  *
     661              :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     662              :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     663              :  * inside needs to be examined, examine thread->stack_info for the associated
     664              :  * thread object to obtain the boundaries.
     665              :  *
     666              :  * It is legal to precede this definition with the 'static' keyword.
     667              :  *
     668              :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     669              :  * parameter of k_thread_create(), it may not be the same as the
     670              :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     671              :  *
     672              :  * Some arches may round the size of the usable stack region up to satisfy
     673              :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     674              :  * size.
     675              :  *
     676              :  * @param sym Thread stack symbol name
     677              :  * @param size Size of the stack memory region
     678              :  */
     679            1 : #define K_THREAD_STACK_DEFINE(sym, size) \
     680              :         Z_THREAD_STACK_DEFINE_IN(sym, size, __stackmem)
     681              : 
     682              : /**
     683              :  * @brief Define a toplevel thread stack memory region in pinned section
     684              :  *
     685              :  * This defines a region of memory suitable for use as a thread's stack.
     686              :  *
     687              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     688              :  * and put in 'noinit' section so that it isn't zeroed at boot
     689              :  *
     690              :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     691              :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     692              :  * inside needs to be examined, examine thread->stack_info for the associated
     693              :  * thread object to obtain the boundaries.
     694              :  *
     695              :  * It is legal to precede this definition with the 'static' keyword.
     696              :  *
     697              :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     698              :  * parameter of k_thread_create(), it may not be the same as the
     699              :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     700              :  *
     701              :  * Some arches may round the size of the usable stack region up to satisfy
     702              :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     703              :  * size.
     704              :  *
     705              :  * This puts the stack into the pinned noinit linker section if
     706              :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     707              :  * put the stack into the same section as K_THREAD_STACK_DEFINE().
     708              :  *
     709              :  * @param sym Thread stack symbol name
     710              :  * @param size Size of the stack memory region
     711              :  */
     712              : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     713              : #define K_THREAD_PINNED_STACK_DEFINE(sym, size) \
     714              :         Z_THREAD_STACK_DEFINE_IN(sym, size, __pinned_noinit)
     715              : #else
     716            1 : #define K_THREAD_PINNED_STACK_DEFINE(sym, size) \
     717              :         K_THREAD_STACK_DEFINE(sym, size)
     718              : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     719              : 
     720              : /**
     721              :  * @brief Calculate size of stacks to be allocated in a stack array
     722              :  *
     723              :  * This macro calculates the size to be allocated for the stacks
     724              :  * inside a stack array. It accepts the indicated "size" as a parameter
     725              :  * and if required, pads some extra bytes (e.g. for MPU scenarios). Refer
     726              :  * K_THREAD_STACK_ARRAY_DEFINE definition to see how this is used.
     727              :  * The returned size ensures each array member will be aligned to the
     728              :  * required stack base alignment.
     729              :  *
     730              :  * @param size Size of the stack memory region
     731              :  * @return Appropriate size for an array member
     732              :  */
     733            1 : #define K_THREAD_STACK_LEN(size) \
     734              :         ROUND_UP(Z_THREAD_STACK_SIZE_ADJUST(size), \
     735              :                  Z_THREAD_STACK_OBJ_ALIGN(size))
     736              : 
     737              : /**
     738              :  * @brief Define a toplevel array of thread stack memory regions
     739              :  *
     740              :  * Create an array of equally sized stacks. See K_THREAD_STACK_DEFINE
     741              :  * definition for additional details and constraints.
     742              :  *
     743              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     744              :  * and put in 'noinit' section so that it isn't zeroed at boot
     745              :  *
     746              :  * @param sym Thread stack symbol name
     747              :  * @param nmemb Number of stacks to define
     748              :  * @param size Size of the stack memory region
     749              :  */
     750            1 : #define K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     751              :         Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __stackmem)
     752              : 
     753              : /**
     754              :  * @brief Define a toplevel array of thread stack memory regions in pinned section
     755              :  *
     756              :  * Create an array of equally sized stacks. See K_THREAD_STACK_DEFINE
     757              :  * definition for additional details and constraints.
     758              :  *
     759              :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     760              :  * and put in 'noinit' section so that it isn't zeroed at boot
     761              :  *
     762              :  * This puts the stack into the pinned noinit linker section if
     763              :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     764              :  * put the stack into the same section as K_THREAD_STACK_DEFINE().
     765              :  *
     766              :  * @param sym Thread stack symbol name
     767              :  * @param nmemb Number of stacks to define
     768              :  * @param size Size of the stack memory region
     769              :  */
     770              : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     771              : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     772              :         Z_THREAD_PINNED_STACK_DEFINE_IN(sym, nmemb, size, __pinned_noinit)
     773              : #else
     774            1 : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     775              :         K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size)
     776              : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     777              : 
     778              : /** @} */
     779              : 
     780              : /**
     781              :  * @brief Get a pointer to the physical stack buffer
     782              :  *
     783              :  * Obtain a pointer to the non-reserved area of a stack object.
     784              :  * This is not guaranteed to be the beginning of the thread-writable region;
     785              :  * this does not account for any memory carved-out for MPU stack overflow
     786              :  * guards.
     787              :  *
     788              :  * Use with care. The true bounds of the stack buffer are available in the
     789              :  * stack_info member of its associated thread.
     790              :  *
     791              :  * @param sym defined stack symbol name
     792              :  * @return The buffer itself, a char *
     793              :  */
     794            1 : static inline char *K_THREAD_STACK_BUFFER(k_thread_stack_t *sym)
     795              : {
     796              :         return (char *)sym + K_THREAD_STACK_RESERVED;
     797              : }
     798              : 
     799              : #endif /* CONFIG_USERSPACE */
     800              : 
     801              : #ifdef __cplusplus
     802              : }
     803              : #endif
     804              : 
     805              : #endif /* _ASMLANGUAGE */
     806              : #endif /* ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H */
        

Generated by: LCOV version 2.0-1