LCOV - code coverage report
Current view: top level - zephyr/kernel - thread_stack.h Hit Total Coverage
Test: new.info Lines: 19 23 82.6 %
Date: 2024-12-22 00:14:23

          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             : /**
     116             :  * @brief Declare a reference to a thread stack
     117             :  *
     118             :  * This macro declares the symbol of a thread stack defined elsewhere in the
     119             :  * current scope.
     120             :  *
     121             :  * @param sym Thread stack symbol name
     122             :  * @param size Size of the stack memory region
     123             :  */
     124           1 : #define K_KERNEL_STACK_DECLARE(sym, size) \
     125             :         extern struct z_thread_stack_element \
     126             :                 sym[K_KERNEL_STACK_LEN(size)]
     127             : 
     128             : /**
     129             :  * @brief Declare a reference to a thread stack array
     130             :  *
     131             :  * This macro declares the symbol of a thread stack array defined elsewhere in
     132             :  * the current scope.
     133             :  *
     134             :  * @param sym Thread stack symbol name
     135             :  * @param nmemb Number of stacks defined
     136             :  * @param size Size of the stack memory region
     137             :  */
     138           1 : #define K_KERNEL_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     139             :         extern struct z_thread_stack_element \
     140             :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     141             : 
     142             : /**
     143             :  * @brief Declare a reference to a pinned thread stack array
     144             :  *
     145             :  * This macro declares the symbol of a pinned thread stack array defined
     146             :  * elsewhere in the current scope.
     147             :  *
     148             :  * @param sym Thread stack symbol name
     149             :  * @param nmemb Number of stacks defined
     150             :  * @param size Size of the stack memory region
     151             :  */
     152           1 : #define K_KERNEL_PINNED_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     153             :         extern struct z_thread_stack_element \
     154             :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     155             : 
     156             : /**
     157             :  * @brief Define a toplevel kernel stack memory region in specified section
     158             :  *
     159             :  * This defines a region of memory for use as a thread stack in
     160             :  * the specified linker section.
     161             :  *
     162             :  * It is legal to precede this definition with the 'static' keyword.
     163             :  *
     164             :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     165             :  * parameter of k_thread_create(), it may not be the same as the
     166             :  * 'size' parameter. Use K_KERNEL_STACK_SIZEOF() instead.
     167             :  *
     168             :  * The total amount of memory allocated may be increased to accommodate
     169             :  * fixed-size stack overflow guards.
     170             :  *
     171             :  * @param sym Thread stack symbol name
     172             :  * @param size Size of the stack memory region
     173             :  * @param lsect Linker section for this stack
     174             :  */
     175             : #define Z_KERNEL_STACK_DEFINE_IN(sym, size, lsect) \
     176             :         struct z_thread_stack_element lsect \
     177             :                 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
     178             :                 sym[K_KERNEL_STACK_LEN(size)]
     179             : 
     180             : /**
     181             :  * @brief Define a toplevel array of kernel stack memory regions in specified section
     182             :  *
     183             :  * @param sym Kernel stack array symbol name
     184             :  * @param nmemb Number of stacks to define
     185             :  * @param size Size of the stack memory region
     186             :  * @param lsect Linker section for this array of stacks
     187             :  */
     188             : #define Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
     189             :         struct z_thread_stack_element lsect \
     190             :                 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
     191             :                 sym[nmemb][K_KERNEL_STACK_LEN(size)]
     192             : 
     193             : /**
     194             :  * @brief Define a toplevel kernel stack memory region
     195             :  *
     196             :  * This defines a region of memory for use as a thread stack, for threads
     197             :  * that exclusively run in supervisor mode. This is also suitable for
     198             :  * declaring special stacks for interrupt or exception handling.
     199             :  *
     200             :  * Stacks defined with this macro may not host user mode threads.
     201             :  *
     202             :  * It is legal to precede this definition with the 'static' keyword.
     203             :  *
     204             :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     205             :  * parameter of k_thread_create(), it may not be the same as the
     206             :  * 'size' parameter. Use K_KERNEL_STACK_SIZEOF() instead.
     207             :  *
     208             :  * The total amount of memory allocated may be increased to accommodate
     209             :  * fixed-size stack overflow guards.
     210             :  *
     211             :  * @param sym Thread stack symbol name
     212             :  * @param size Size of the stack memory region
     213             :  */
     214           1 : #define K_KERNEL_STACK_DEFINE(sym, size) \
     215             :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem)
     216             : 
     217             : /**
     218             :  * @brief Define a toplevel kernel stack memory region in pinned section
     219             :  *
     220             :  * See K_KERNEL_STACK_DEFINE() for more information and constraints.
     221             :  *
     222             :  * This puts the stack into the pinned noinit linker section if
     223             :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     224             :  * put the stack into the same section as K_KERNEL_STACK_DEFINE().
     225             :  *
     226             :  * @param sym Thread stack symbol name
     227             :  * @param size Size of the stack memory region
     228             :  */
     229             : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     230             : #define K_KERNEL_PINNED_STACK_DEFINE(sym, size) \
     231             :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __pinned_noinit)
     232             : #else
     233           1 : #define K_KERNEL_PINNED_STACK_DEFINE(sym, size) \
     234             :         Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem)
     235             : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     236             : 
     237             : /**
     238             :  * @brief Define a toplevel array of kernel stack memory regions
     239             :  *
     240             :  * Stacks defined with this macro may not host user mode threads.
     241             :  *
     242             :  * @param sym Kernel stack array symbol name
     243             :  * @param nmemb Number of stacks to define
     244             :  * @param size Size of the stack memory region
     245             :  */
     246           1 : #define K_KERNEL_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     247             :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem)
     248             : 
     249             : /**
     250             :  * @brief Define a toplevel array of kernel stack memory regions in pinned section
     251             :  *
     252             :  * See K_KERNEL_STACK_ARRAY_DEFINE() for more information and constraints.
     253             :  *
     254             :  * This puts the stack into the pinned noinit linker section if
     255             :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     256             :  * put the stack into the same section as K_KERNEL_STACK_ARRAY_DEFINE().
     257             :  *
     258             :  * @param sym Kernel stack array symbol name
     259             :  * @param nmemb Number of stacks to define
     260             :  * @param size Size of the stack memory region
     261             :  */
     262             : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     263             : #define K_KERNEL_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     264             :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __pinned_noinit)
     265             : #else
     266           1 : #define K_KERNEL_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     267             :         Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem)
     268             : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     269             : 
     270             : /**
     271             :  * @brief Define an embedded stack memory region
     272             :  *
     273             :  * Used for kernel stacks embedded within other data structures.
     274             :  *
     275             :  * Stacks defined with this macro may not host user mode threads.
     276             :  * @param sym Thread stack symbol name
     277             :  * @param size Size of the stack memory region
     278             :  */
     279           1 : #define K_KERNEL_STACK_MEMBER(sym, size) \
     280             :         Z_KERNEL_STACK_DEFINE_IN(sym, size,)
     281             : 
     282           0 : #define K_KERNEL_STACK_SIZEOF(sym) (sizeof(sym) - K_KERNEL_STACK_RESERVED)
     283             : 
     284             : /** @} */
     285             : 
     286           0 : static inline char *K_KERNEL_STACK_BUFFER(k_thread_stack_t *sym)
     287             : {
     288             :         return (char *)sym + K_KERNEL_STACK_RESERVED;
     289             : }
     290             : #ifndef CONFIG_USERSPACE
     291             : #define K_THREAD_STACK_RESERVED         K_KERNEL_STACK_RESERVED
     292             : #define K_THREAD_STACK_SIZEOF           K_KERNEL_STACK_SIZEOF
     293             : #define K_THREAD_STACK_LEN              K_KERNEL_STACK_LEN
     294             : #define K_THREAD_STACK_DEFINE           K_KERNEL_STACK_DEFINE
     295             : #define K_THREAD_STACK_ARRAY_DEFINE     K_KERNEL_STACK_ARRAY_DEFINE
     296             : #define K_THREAD_STACK_BUFFER           K_KERNEL_STACK_BUFFER
     297             : #define K_THREAD_STACK_DECLARE          K_KERNEL_STACK_DECLARE
     298             : #define K_THREAD_STACK_ARRAY_DECLARE    K_KERNEL_STACK_ARRAY_DECLARE
     299             : #define K_THREAD_PINNED_STACK_DEFINE    K_KERNEL_PINNED_STACK_DEFINE
     300             : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE \
     301             :                                         K_KERNEL_PINNED_STACK_ARRAY_DEFINE
     302             : #else
     303             : /**
     304             :  * @brief Indicate how much additional memory is reserved for stack objects
     305             :  *
     306             :  * Any given stack declaration may have additional memory in it for guard
     307             :  * areas, supervisor mode stacks, or platform-specific data.  This macro
     308             :  * indicates how much space is reserved for this.
     309             :  *
     310             :  * This value only indicates memory that is permanently reserved in the stack
     311             :  * object. Memory that is "borrowed" from the thread's stack buffer is never
     312             :  * accounted for here.
     313             :  *
     314             :  * Reserved memory is at the beginning of the stack object. The reserved area
     315             :  * must be appropriately sized such that the stack buffer immediately following
     316             :  * it is correctly aligned.
     317             :  */
     318             : #ifdef ARCH_THREAD_STACK_RESERVED
     319             : #define K_THREAD_STACK_RESERVED         ((size_t)(ARCH_THREAD_STACK_RESERVED))
     320             : #else
     321           1 : #define K_THREAD_STACK_RESERVED         ((size_t)0U)
     322             : #endif /* ARCH_THREAD_STACK_RESERVED */
     323             : 
     324             : /**
     325             :  * @brief Properly align the lowest address of a stack object
     326             :  *
     327             :  * Return an alignment value for the lowest address of a stack object, taking
     328             :  * into consideration all alignment constraints imposed by the CPU, ABI, and
     329             :  * any memory management policies, including any alignment required by
     330             :  * reserved platform data within the stack object. This will always be at least
     331             :  * ARCH_STACK_PTR_ALIGN or an even multiple thereof.
     332             :  *
     333             :  * Depending on hardware, this is either a fixed value or a function of the
     334             :  * provided size. The requested size is significant only if
     335             :  * CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT is enabled.
     336             :  *
     337             :  * If CONFIG_USERSPACE is enabled, this determines the alignment of stacks
     338             :  * which may be used by user mode threads, or threads running in supervisor
     339             :  * mode which may later drop privileges to user mode.
     340             :  *
     341             :  * Arches define this with ARCH_THREAD_STACK_OBJ_ALIGN().
     342             :  *
     343             :  * If ARCH_THREAD_STACK_OBJ_ALIGN is not defined assume ARCH_STACK_PTR_ALIGN
     344             :  * is appropriate.
     345             :  *
     346             :  * @param size Requested size of the stack buffer (which could be ignored)
     347             :  * @return Alignment of the stack object
     348             :  */
     349             : #if defined(ARCH_THREAD_STACK_OBJ_ALIGN)
     350             : #define Z_THREAD_STACK_OBJ_ALIGN(size)  \
     351             :         ARCH_THREAD_STACK_OBJ_ALIGN(Z_THREAD_STACK_SIZE_ADJUST(size))
     352             : #else
     353             : #define Z_THREAD_STACK_OBJ_ALIGN(size)  ARCH_STACK_PTR_ALIGN
     354             : #endif /* ARCH_THREAD_STACK_OBJ_ALIGN */
     355             : 
     356             : /**
     357             :  * @brief Round up a requested stack size to satisfy constraints
     358             :  *
     359             :  * Given a requested stack buffer size, return an adjusted size value for
     360             :  * the entire stack object which takes into consideration:
     361             :  *
     362             :  * - Reserved memory for platform data
     363             :  * - Alignment of stack buffer bounds to CPU/ABI constraints
     364             :  * - Alignment of stack buffer bounds to satisfy memory management hardware
     365             :  *   constraints such that a protection region can cover the stack buffer area
     366             :  *
     367             :  * If CONFIG_USERSPACE is enabled, this determines the size of stack objects
     368             :  * which  may be used by user mode threads, or threads running in supervisor
     369             :  * mode which may later drop privileges to user mode.
     370             :  *
     371             :  * Arches define this with ARCH_THREAD_STACK_SIZE_ADJUST().
     372             :  *
     373             :  * If ARCH_THREAD_STACK_SIZE_ADJUST is not defined, assume rounding up to
     374             :  * ARCH_STACK_PTR_ALIGN is appropriate.
     375             :  *
     376             :  * Any memory reserved for platform data is also included in the total
     377             :  * returned.
     378             :  *
     379             :  * @param size Requested size of the stack buffer
     380             :  * @return Adjusted size of the stack object
     381             :  */
     382             : #if defined(ARCH_THREAD_STACK_SIZE_ADJUST)
     383             : #define Z_THREAD_STACK_SIZE_ADJUST(size) \
     384             :         ARCH_THREAD_STACK_SIZE_ADJUST((size) + K_THREAD_STACK_RESERVED)
     385             : #else
     386             : #define Z_THREAD_STACK_SIZE_ADJUST(size) \
     387             :         (ROUND_UP((size), ARCH_STACK_PTR_ALIGN) + K_THREAD_STACK_RESERVED)
     388             : #endif /* ARCH_THREAD_STACK_SIZE_ADJUST */
     389             : 
     390             : /**
     391             :  * @addtogroup thread_stack_api
     392             :  * @{
     393             :  */
     394             : 
     395             : /**
     396             :  * @brief Declare a reference to a thread stack
     397             :  *
     398             :  * This macro declares the symbol of a thread stack defined elsewhere in the
     399             :  * current scope.
     400             :  *
     401             :  * @param sym Thread stack symbol name
     402             :  * @param size Size of the stack memory region
     403             :  */
     404           1 : #define K_THREAD_STACK_DECLARE(sym, size) \
     405             :         extern struct z_thread_stack_element \
     406             :                 sym[K_THREAD_STACK_LEN(size)]
     407             : 
     408             : /**
     409             :  * @brief Declare a reference to a thread stack array
     410             :  *
     411             :  * This macro declares the symbol of a thread stack array defined elsewhere in
     412             :  * the current scope.
     413             :  *
     414             :  * @param sym Thread stack symbol name
     415             :  * @param nmemb Number of stacks defined
     416             :  * @param size Size of the stack memory region
     417             :  */
     418           1 : #define K_THREAD_STACK_ARRAY_DECLARE(sym, nmemb, size) \
     419             :         extern struct z_thread_stack_element \
     420             :                 sym[nmemb][K_THREAD_STACK_LEN(size)]
     421             : 
     422             : /**
     423             :  * @brief Return the size in bytes of a stack memory region
     424             :  *
     425             :  * Convenience macro for passing the desired stack size to k_thread_create()
     426             :  * since the underlying implementation may actually create something larger
     427             :  * (for instance a guard area).
     428             :  *
     429             :  * The value returned here is not guaranteed to match the 'size' parameter
     430             :  * passed to K_THREAD_STACK_DEFINE and may be larger, but is always safe to
     431             :  * pass to k_thread_create() for the associated stack object.
     432             :  *
     433             :  * @param sym Stack memory symbol
     434             :  * @return Size of the stack buffer
     435             :  */
     436           1 : #define K_THREAD_STACK_SIZEOF(sym)      (sizeof(sym) - K_THREAD_STACK_RESERVED)
     437             : 
     438             : /**
     439             :  * @brief Define a toplevel thread stack memory region in specified region
     440             :  *
     441             :  * This defines a region of memory suitable for use as a thread's stack
     442             :  * in specified region.
     443             :  *
     444             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     445             :  * and put in 'noinit' section so that it isn't zeroed at boot
     446             :  *
     447             :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     448             :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     449             :  * inside needs to be examined, examine thread->stack_info for the associated
     450             :  * thread object to obtain the boundaries.
     451             :  *
     452             :  * It is legal to precede this definition with the 'static' keyword.
     453             :  *
     454             :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     455             :  * parameter of k_thread_create(), it may not be the same as the
     456             :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     457             :  *
     458             :  * Some arches may round the size of the usable stack region up to satisfy
     459             :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     460             :  * size.
     461             :  *
     462             :  * @param sym Thread stack symbol name
     463             :  * @param size Size of the stack memory region
     464             :  * @param lsect Linker section for this stack
     465             :  */
     466             : #define Z_THREAD_STACK_DEFINE_IN(sym, size, lsect) \
     467             :         struct z_thread_stack_element lsect \
     468             :                 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
     469             :                 sym[K_THREAD_STACK_LEN(size)]
     470             : 
     471             : /**
     472             :  * @brief Define a toplevel array of thread stack memory regions in specified region
     473             :  *
     474             :  * Create an array of equally sized stacks. See Z_THREAD_STACK_DEFINE_IN
     475             :  * definition for additional details and constraints.
     476             :  *
     477             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     478             :  * and put in specified section so that it isn't zeroed at boot
     479             :  *
     480             :  * @param sym Thread stack symbol name
     481             :  * @param nmemb Number of stacks to define
     482             :  * @param size Size of the stack memory region
     483             :  * @param lsect Linker section for this stack
     484             :  */
     485             : #define Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
     486             :         struct z_thread_stack_element lsect \
     487             :                 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
     488             :                 sym[nmemb][K_THREAD_STACK_LEN(size)]
     489             : 
     490             : /**
     491             :  * @brief Define a toplevel thread stack memory region
     492             :  *
     493             :  * This defines a region of memory suitable for use as a thread's stack.
     494             :  *
     495             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     496             :  * and put in 'noinit' section so that it isn't zeroed at boot
     497             :  *
     498             :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     499             :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     500             :  * inside needs to be examined, examine thread->stack_info for the associated
     501             :  * thread object to obtain the boundaries.
     502             :  *
     503             :  * It is legal to precede this definition with the 'static' keyword.
     504             :  *
     505             :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     506             :  * parameter of k_thread_create(), it may not be the same as the
     507             :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     508             :  *
     509             :  * Some arches may round the size of the usable stack region up to satisfy
     510             :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     511             :  * size.
     512             :  *
     513             :  * @param sym Thread stack symbol name
     514             :  * @param size Size of the stack memory region
     515             :  */
     516           1 : #define K_THREAD_STACK_DEFINE(sym, size) \
     517             :         Z_THREAD_STACK_DEFINE_IN(sym, size, __stackmem)
     518             : 
     519             : /**
     520             :  * @brief Define a toplevel thread stack memory region in pinned section
     521             :  *
     522             :  * This defines a region of memory suitable for use as a thread's stack.
     523             :  *
     524             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     525             :  * and put in 'noinit' section so that it isn't zeroed at boot
     526             :  *
     527             :  * The defined symbol will always be a k_thread_stack_t which can be passed to
     528             :  * k_thread_create(), but should otherwise not be manipulated. If the buffer
     529             :  * inside needs to be examined, examine thread->stack_info for the associated
     530             :  * thread object to obtain the boundaries.
     531             :  *
     532             :  * It is legal to precede this definition with the 'static' keyword.
     533             :  *
     534             :  * It is NOT legal to take the sizeof(sym) and pass that to the stackSize
     535             :  * parameter of k_thread_create(), it may not be the same as the
     536             :  * 'size' parameter. Use K_THREAD_STACK_SIZEOF() instead.
     537             :  *
     538             :  * Some arches may round the size of the usable stack region up to satisfy
     539             :  * alignment constraints. K_THREAD_STACK_SIZEOF() will return the aligned
     540             :  * size.
     541             :  *
     542             :  * This puts the stack into the pinned noinit linker section if
     543             :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     544             :  * put the stack into the same section as K_THREAD_STACK_DEFINE().
     545             :  *
     546             :  * @param sym Thread stack symbol name
     547             :  * @param size Size of the stack memory region
     548             :  */
     549             : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     550             : #define K_THREAD_PINNED_STACK_DEFINE(sym, size) \
     551             :         Z_THREAD_STACK_DEFINE_IN(sym, size, __pinned_noinit)
     552             : #else
     553           1 : #define K_THREAD_PINNED_STACK_DEFINE(sym, size) \
     554             :         K_THREAD_STACK_DEFINE(sym, size)
     555             : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     556             : 
     557             : /**
     558             :  * @brief Calculate size of stacks to be allocated in a stack array
     559             :  *
     560             :  * This macro calculates the size to be allocated for the stacks
     561             :  * inside a stack array. It accepts the indicated "size" as a parameter
     562             :  * and if required, pads some extra bytes (e.g. for MPU scenarios). Refer
     563             :  * K_THREAD_STACK_ARRAY_DEFINE definition to see how this is used.
     564             :  * The returned size ensures each array member will be aligned to the
     565             :  * required stack base alignment.
     566             :  *
     567             :  * @param size Size of the stack memory region
     568             :  * @return Appropriate size for an array member
     569             :  */
     570           1 : #define K_THREAD_STACK_LEN(size) \
     571             :         ROUND_UP(Z_THREAD_STACK_SIZE_ADJUST(size), \
     572             :                  Z_THREAD_STACK_OBJ_ALIGN(size))
     573             : 
     574             : /**
     575             :  * @brief Define a toplevel array of thread stack memory regions
     576             :  *
     577             :  * Create an array of equally sized stacks. See K_THREAD_STACK_DEFINE
     578             :  * definition for additional details and constraints.
     579             :  *
     580             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     581             :  * and put in 'noinit' section so that it isn't zeroed at boot
     582             :  *
     583             :  * @param sym Thread stack symbol name
     584             :  * @param nmemb Number of stacks to define
     585             :  * @param size Size of the stack memory region
     586             :  */
     587           1 : #define K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     588             :         Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __stackmem)
     589             : 
     590             : /**
     591             :  * @brief Define a toplevel array of thread stack memory regions in pinned section
     592             :  *
     593             :  * Create an array of equally sized stacks. See K_THREAD_STACK_DEFINE
     594             :  * definition for additional details and constraints.
     595             :  *
     596             :  * This is the generic, historical definition. Align to Z_THREAD_STACK_OBJ_ALIGN
     597             :  * and put in 'noinit' section so that it isn't zeroed at boot
     598             :  *
     599             :  * This puts the stack into the pinned noinit linker section if
     600             :  * CONFIG_LINKER_USE_PINNED_SECTION is enabled, or else it would
     601             :  * put the stack into the same section as K_THREAD_STACK_DEFINE().
     602             :  *
     603             :  * @param sym Thread stack symbol name
     604             :  * @param nmemb Number of stacks to define
     605             :  * @param size Size of the stack memory region
     606             :  */
     607             : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
     608             : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     609             :         Z_THREAD_PINNED_STACK_DEFINE_IN(sym, nmemb, size, __pinned_noinit)
     610             : #else
     611           1 : #define K_THREAD_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
     612             :         K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size)
     613             : #endif /* CONFIG_LINKER_USE_PINNED_SECTION */
     614             : 
     615             : /** @} */
     616             : 
     617             : /**
     618             :  * @brief Get a pointer to the physical stack buffer
     619             :  *
     620             :  * Obtain a pointer to the non-reserved area of a stack object.
     621             :  * This is not guaranteed to be the beginning of the thread-writable region;
     622             :  * this does not account for any memory carved-out for MPU stack overflow
     623             :  * guards.
     624             :  *
     625             :  * Use with care. The true bounds of the stack buffer are available in the
     626             :  * stack_info member of its associated thread.
     627             :  *
     628             :  * @param sym defined stack symbol name
     629             :  * @return The buffer itself, a char *
     630             :  */
     631           1 : static inline char *K_THREAD_STACK_BUFFER(k_thread_stack_t *sym)
     632             : {
     633             :         return (char *)sym + K_THREAD_STACK_RESERVED;
     634             : }
     635             : 
     636             : #endif /* CONFIG_USERSPACE */
     637             : 
     638             : #ifdef __cplusplus
     639             : }
     640             : #endif
     641             : 
     642             : #endif /* _ASMLANGUAGE */
     643             : #endif /* ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H */

Generated by: LCOV version 1.14