21#ifndef ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
22#define ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
24#if !defined(_ASMLANGUAGE)
47struct __packed z_thread_stack_element {
69static inline char *z_stack_ptr_align(
char *ptr)
73#define Z_STACK_PTR_ALIGN(ptr) ((uintptr_t)z_stack_ptr_align((char *)(ptr)))
88#define Z_STACK_PTR_TO_FRAME(type, ptr) \
89 (type *)((ptr) - sizeof(type))
91#ifdef ARCH_KERNEL_STACK_RESERVED
92#define K_KERNEL_STACK_RESERVED ((size_t)ARCH_KERNEL_STACK_RESERVED)
94#define K_KERNEL_STACK_RESERVED ((size_t)0)
97#define Z_KERNEL_STACK_SIZE_ADJUST(size) (ROUND_UP(size, \
98 ARCH_STACK_PTR_ALIGN) + \
99 K_KERNEL_STACK_RESERVED)
101#ifdef ARCH_KERNEL_STACK_OBJ_ALIGN
102#define Z_KERNEL_STACK_OBJ_ALIGN ARCH_KERNEL_STACK_OBJ_ALIGN
104#define Z_KERNEL_STACK_OBJ_ALIGN ARCH_STACK_PTR_ALIGN
107#define K_KERNEL_STACK_LEN(size) \
108 ROUND_UP(Z_KERNEL_STACK_SIZE_ADJUST(size), Z_KERNEL_STACK_OBJ_ALIGN)
115#ifdef CONFIG_HW_SHADOW_STACK
123#define k_thread_hw_shadow_stack_t arch_thread_hw_shadow_stack_t
134#define K_THREAD_HW_SHADOW_STACK_SIZE(size_) \
135 ARCH_THREAD_HW_SHADOW_STACK_SIZE(size_)
146#define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size) \
147 ARCH_THREAD_HW_SHADOW_STACK_DECLARE(__ ## sym ## _shstk, size)
159#define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size) \
160 ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DECLARE(__ ## sym ## _shstk_arr, \
163struct _stack_to_hw_shadow_stack {
165 k_thread_hw_shadow_stack_t *shstk_addr;
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) = { \
186 .shstk_addr = __ ## sym ## _shstk, \
190struct _stack_to_hw_shadow_stack_arr {
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_), \
218 .shstk_addr = (uintptr_t)__ ## sym ## _shstk_arr, \
219 .shstk_size = K_THREAD_HW_SHADOW_STACK_SIZE(size_), \
230#define k_thread_hw_shadow_stack_attach arch_thread_hw_shadow_stack_attach
232struct _thread_hw_shadow_stack_static {
233 struct k_thread *thread;
234 k_thread_hw_shadow_stack_t *shstk_addr;
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) = { \
254 .shstk_addr = shstk_addr_, \
259#define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size)
260#define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size)
261#define K_THREAD_HW_SHADOW_STACK_DEFINE(sym, size)
262#define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size_)
274#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)]
289#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)]
313#define Z_KERNEL_STACK_DEFINE_IN(sym, size, lsect) \
314 struct z_thread_stack_element lsect \
315 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
316 sym[K_KERNEL_STACK_LEN(size)]
326#define Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
327 struct z_thread_stack_element lsect \
328 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
329 sym[nmemb][K_KERNEL_STACK_LEN(size)]
352#define K_KERNEL_STACK_DEFINE(sym, size) \
353 Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
354 K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
355 K_THREAD_HW_SHADOW_STACK_SIZE(size))
366#define K_KERNEL_STACK_ARRAY_DEFINE(sym, nmemb, size) \
367 Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
368 K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
379#define K_KERNEL_STACK_MEMBER(sym, size) \
380 Z_KERNEL_STACK_DEFINE_IN(sym, size,)
382#define K_KERNEL_STACK_SIZEOF(sym) (sizeof(sym) - K_KERNEL_STACK_RESERVED)
390#ifndef CONFIG_USERSPACE
391#define K_THREAD_STACK_RESERVED K_KERNEL_STACK_RESERVED
392#define K_THREAD_STACK_SIZEOF K_KERNEL_STACK_SIZEOF
393#define K_THREAD_STACK_LEN K_KERNEL_STACK_LEN
394#define K_THREAD_STACK_DEFINE K_KERNEL_STACK_DEFINE
395#define K_THREAD_STACK_ARRAY_DEFINE K_KERNEL_STACK_ARRAY_DEFINE
396#define K_THREAD_STACK_BUFFER K_KERNEL_STACK_BUFFER
397#define K_THREAD_STACK_DECLARE K_KERNEL_STACK_DECLARE
398#define K_THREAD_STACK_ARRAY_DECLARE K_KERNEL_STACK_ARRAY_DECLARE
415#ifdef ARCH_THREAD_STACK_RESERVED
416#define K_THREAD_STACK_RESERVED ((size_t)(ARCH_THREAD_STACK_RESERVED))
418#define K_THREAD_STACK_RESERVED ((size_t)0U)
446#if defined(ARCH_THREAD_STACK_OBJ_ALIGN)
447#define Z_THREAD_STACK_OBJ_ALIGN(size) \
448 ARCH_THREAD_STACK_OBJ_ALIGN(Z_THREAD_STACK_SIZE_ADJUST(size))
450#define Z_THREAD_STACK_OBJ_ALIGN(size) ARCH_STACK_PTR_ALIGN
479#if defined(ARCH_THREAD_STACK_SIZE_ADJUST)
480#define Z_THREAD_STACK_SIZE_ADJUST(size) \
481 ARCH_THREAD_STACK_SIZE_ADJUST((size) + K_THREAD_STACK_RESERVED)
483#define Z_THREAD_STACK_SIZE_ADJUST(size) \
484 (ROUND_UP((size), ARCH_STACK_PTR_ALIGN) + K_THREAD_STACK_RESERVED)
501#define K_THREAD_STACK_DECLARE(sym, size) \
502 extern struct z_thread_stack_element \
503 sym[K_THREAD_STACK_LEN(size)]
515#define K_THREAD_STACK_ARRAY_DECLARE(sym, nmemb, size) \
516 extern struct z_thread_stack_element \
517 sym[nmemb][K_THREAD_STACK_LEN(size)]
533#define K_THREAD_STACK_SIZEOF(sym) (sizeof(sym) - K_THREAD_STACK_RESERVED)
563#define Z_THREAD_STACK_DEFINE_IN(sym, size, lsect) \
564 struct z_thread_stack_element lsect \
565 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
566 sym[K_THREAD_STACK_LEN(size)]
582#define Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
583 struct z_thread_stack_element lsect \
584 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
585 sym[nmemb][K_THREAD_STACK_LEN(size)]
613#define K_THREAD_STACK_DEFINE(sym, size) \
614 Z_THREAD_STACK_DEFINE_IN(sym, size, __stackmem)
629#define K_THREAD_STACK_LEN(size) \
630 ROUND_UP(Z_THREAD_STACK_SIZE_ADJUST(size), \
631 Z_THREAD_STACK_OBJ_ALIGN(size))
646#define K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size) \
647 Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __stackmem)
struct z_thread_stack_element k_thread_stack_t
Typedef of struct z_thread_stack_element.
Definition arch_interface.h:46
#define ARCH_STACK_PTR_ALIGN
Required alignment of the CPU's stack pointer register value, dictated by hardware constraints and th...
Definition ztest.h:26
#define ROUND_DOWN(x, align)
Value of x rounded down to the previous multiple of align.
Definition util.h:325
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
#define K_THREAD_STACK_RESERVED
Indicate how much additional memory is reserved for stack objects.
Definition thread_stack.h:418
static char * K_THREAD_STACK_BUFFER(k_thread_stack_t *sym)
Get a pointer to the physical stack buffer.
Definition thread_stack.h:665
static char * K_KERNEL_STACK_BUFFER(k_thread_stack_t *sym)
Definition thread_stack.h:386
#define K_KERNEL_STACK_RESERVED
Definition thread_stack.h:94