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)]
304#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)]
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)]
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)]
367#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))
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))
390#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))
405#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)
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)
428#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)
442#define K_KERNEL_STACK_MEMBER(sym, size) \
443 Z_KERNEL_STACK_DEFINE_IN(sym, size,)
445#define K_KERNEL_STACK_SIZEOF(sym) (sizeof(sym) - K_KERNEL_STACK_RESERVED)
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
481#ifdef ARCH_THREAD_STACK_RESERVED
482#define K_THREAD_STACK_RESERVED ((size_t)(ARCH_THREAD_STACK_RESERVED))
484#define K_THREAD_STACK_RESERVED ((size_t)0U)
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))
516#define Z_THREAD_STACK_OBJ_ALIGN(size) ARCH_STACK_PTR_ALIGN
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)
549#define Z_THREAD_STACK_SIZE_ADJUST(size) \
550 (ROUND_UP((size), ARCH_STACK_PTR_ALIGN) + K_THREAD_STACK_RESERVED)
567#define K_THREAD_STACK_DECLARE(sym, size) \
568 extern struct z_thread_stack_element \
569 sym[K_THREAD_STACK_LEN(size)]
581#define K_THREAD_STACK_ARRAY_DECLARE(sym, nmemb, size) \
582 extern struct z_thread_stack_element \
583 sym[nmemb][K_THREAD_STACK_LEN(size)]
599#define K_THREAD_STACK_SIZEOF(sym) (sizeof(sym) - K_THREAD_STACK_RESERVED)
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)]
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)]
679#define K_THREAD_STACK_DEFINE(sym, size) \
680 Z_THREAD_STACK_DEFINE_IN(sym, size, __stackmem)
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)
716#define K_THREAD_PINNED_STACK_DEFINE(sym, size) \
717 K_THREAD_STACK_DEFINE(sym, size)
733#define K_THREAD_STACK_LEN(size) \
734 ROUND_UP(Z_THREAD_STACK_SIZE_ADJUST(size), \
735 Z_THREAD_STACK_OBJ_ALIGN(size))
750#define K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size) \
751 Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __stackmem)
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)
774#define K_THREAD_PINNED_STACK_ARRAY_DEFINE(sym, nmemb, size) \
775 K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size)
#define ARCH_STACK_PTR_ALIGN
Definition arch.h:98
struct z_thread_stack_element k_thread_stack_t
Typedef of struct z_thread_stack_element.
Definition arch_interface.h:46
#define ROUND_DOWN(x, align)
Value of x rounded down to the previous multiple of align.
Definition util.h:330
#define K_THREAD_STACK_RESERVED
Indicate how much additional memory is reserved for stack objects.
Definition thread_stack.h:484
static char * K_THREAD_STACK_BUFFER(k_thread_stack_t *sym)
Get a pointer to the physical stack buffer.
Definition thread_stack.h:794
static char * K_KERNEL_STACK_BUFFER(k_thread_stack_t *sym)
Definition thread_stack.h:449
#define K_KERNEL_STACK_RESERVED
Definition thread_stack.h:94
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105