23#ifndef ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
24#define ZEPHYR_INCLUDE_KERNEL_THREAD_STACK_H
26#if !defined(_ASMLANGUAGE)
49struct __packed z_thread_stack_element {
71static inline char *z_stack_ptr_align(
char *ptr)
75#define Z_STACK_PTR_ALIGN(ptr) ((uintptr_t)z_stack_ptr_align((char *)(ptr)))
90#define Z_STACK_PTR_TO_FRAME(type, ptr) \
91 (type *)((ptr) - sizeof(type))
93#ifdef ARCH_KERNEL_STACK_RESERVED
94#define K_KERNEL_STACK_RESERVED ((size_t)ARCH_KERNEL_STACK_RESERVED)
96#define K_KERNEL_STACK_RESERVED ((size_t)0)
99#define Z_KERNEL_STACK_SIZE_ADJUST(size) (ROUND_UP(size, \
100 ARCH_STACK_PTR_ALIGN) + \
101 K_KERNEL_STACK_RESERVED)
103#ifdef ARCH_KERNEL_STACK_OBJ_ALIGN
104#define Z_KERNEL_STACK_OBJ_ALIGN ARCH_KERNEL_STACK_OBJ_ALIGN
106#define Z_KERNEL_STACK_OBJ_ALIGN ARCH_STACK_PTR_ALIGN
109#define K_KERNEL_STACK_LEN(size) \
110 ROUND_UP(Z_KERNEL_STACK_SIZE_ADJUST(size), Z_KERNEL_STACK_OBJ_ALIGN)
117#ifdef CONFIG_HW_SHADOW_STACK
125#define k_thread_hw_shadow_stack_t arch_thread_hw_shadow_stack_t
136#define K_THREAD_HW_SHADOW_STACK_SIZE(size_) \
137 ARCH_THREAD_HW_SHADOW_STACK_SIZE(size_)
148#define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size) \
149 ARCH_THREAD_HW_SHADOW_STACK_DECLARE(__ ## sym ## _shstk, size)
161#define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size) \
162 ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DECLARE(__ ## sym ## _shstk_arr, \
165struct _stack_to_hw_shadow_stack {
167 k_thread_hw_shadow_stack_t *shstk_addr;
183#define K_THREAD_HW_SHADOW_STACK_DEFINE(sym, size_) \
184 ARCH_THREAD_HW_SHADOW_STACK_DEFINE(__ ## sym ## _shstk, size_); \
185 static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack, \
186 sym ## _stack_to_shstk_attach) = { \
188 .shstk_addr = __ ## sym ## _shstk, \
192struct _stack_to_hw_shadow_stack_arr {
212#define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb_, size_) \
213 ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(__ ## sym ## _shstk_arr, nmemb_, \
214 K_THREAD_HW_SHADOW_STACK_SIZE(size_)); \
215 static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack_arr, \
216 sym ## _stack_to_shstk_attach) = { \
217 .stack_addr = (uintptr_t)sym, \
218 .stack_size = K_KERNEL_STACK_LEN(size_), \
220 .shstk_addr = (uintptr_t)__ ## sym ## _shstk_arr, \
221 .shstk_size = K_THREAD_HW_SHADOW_STACK_SIZE(size_), \
232#define k_thread_hw_shadow_stack_attach arch_thread_hw_shadow_stack_attach
234struct _thread_hw_shadow_stack_static {
235 struct k_thread *thread;
236 k_thread_hw_shadow_stack_t *shstk_addr;
252#define K_THREAD_HW_SHADOW_STACK_ATTACH(thread_, shstk_addr_, size_) \
253 static const STRUCT_SECTION_ITERABLE(_thread_hw_shadow_stack_static, \
254 thread ## _shstk_attach_static) = { \
256 .shstk_addr = shstk_addr_, \
261#define K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, size)
262#define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size)
263#define K_THREAD_HW_SHADOW_STACK_DEFINE(sym, size)
264#define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size_)
276#define K_KERNEL_STACK_DECLARE(sym, size) \
277 K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
278 extern struct z_thread_stack_element \
279 sym[K_KERNEL_STACK_LEN(size)]
291#define K_KERNEL_STACK_ARRAY_DECLARE(sym, nmemb, size) \
292 K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
293 extern struct z_thread_stack_element \
294 sym[nmemb][K_KERNEL_STACK_LEN(size)]
315#define Z_KERNEL_STACK_DEFINE_IN(sym, size, lsect) \
316 struct z_thread_stack_element lsect \
317 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
318 sym[K_KERNEL_STACK_LEN(size)]
328#define Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
329 struct z_thread_stack_element lsect \
330 __aligned(Z_KERNEL_STACK_OBJ_ALIGN) \
331 sym[nmemb][K_KERNEL_STACK_LEN(size)]
354#define K_KERNEL_STACK_DEFINE(sym, size) \
355 Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
356 K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
357 K_THREAD_HW_SHADOW_STACK_SIZE(size))
368#define K_KERNEL_STACK_ARRAY_DEFINE(sym, nmemb, size) \
369 Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
370 K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
381#define K_KERNEL_STACK_MEMBER(sym, size) \
382 Z_KERNEL_STACK_DEFINE_IN(sym, size,)
384#define K_KERNEL_STACK_SIZEOF(sym) (sizeof(sym) - K_KERNEL_STACK_RESERVED)
392#ifndef CONFIG_USERSPACE
393#define K_THREAD_STACK_RESERVED K_KERNEL_STACK_RESERVED
394#define K_THREAD_STACK_SIZEOF K_KERNEL_STACK_SIZEOF
395#define K_THREAD_STACK_LEN K_KERNEL_STACK_LEN
396#define K_THREAD_STACK_DEFINE K_KERNEL_STACK_DEFINE
397#define K_THREAD_STACK_ARRAY_DEFINE K_KERNEL_STACK_ARRAY_DEFINE
398#define K_THREAD_STACK_BUFFER K_KERNEL_STACK_BUFFER
399#define K_THREAD_STACK_DECLARE K_KERNEL_STACK_DECLARE
400#define K_THREAD_STACK_ARRAY_DECLARE K_KERNEL_STACK_ARRAY_DECLARE
417#ifdef ARCH_THREAD_STACK_RESERVED
418#define K_THREAD_STACK_RESERVED ((size_t)(ARCH_THREAD_STACK_RESERVED))
420#define K_THREAD_STACK_RESERVED ((size_t)0U)
448#if defined(ARCH_THREAD_STACK_OBJ_ALIGN)
449#define Z_THREAD_STACK_OBJ_ALIGN(size) \
450 ARCH_THREAD_STACK_OBJ_ALIGN(Z_THREAD_STACK_SIZE_ADJUST(size))
452#define Z_THREAD_STACK_OBJ_ALIGN(size) ARCH_STACK_PTR_ALIGN
481#if defined(ARCH_THREAD_STACK_SIZE_ADJUST)
482#define Z_THREAD_STACK_SIZE_ADJUST(size) \
483 ARCH_THREAD_STACK_SIZE_ADJUST((size) + K_THREAD_STACK_RESERVED)
485#define Z_THREAD_STACK_SIZE_ADJUST(size) \
486 (ROUND_UP((size), ARCH_STACK_PTR_ALIGN) + K_THREAD_STACK_RESERVED)
503#define K_THREAD_STACK_DECLARE(sym, size) \
504 extern struct z_thread_stack_element \
505 sym[K_THREAD_STACK_LEN(size)]
517#define K_THREAD_STACK_ARRAY_DECLARE(sym, nmemb, size) \
518 extern struct z_thread_stack_element \
519 sym[nmemb][K_THREAD_STACK_LEN(size)]
535#define K_THREAD_STACK_SIZEOF(sym) (sizeof(sym) - K_THREAD_STACK_RESERVED)
565#define Z_THREAD_STACK_DEFINE_IN(sym, size, lsect) \
566 struct z_thread_stack_element lsect \
567 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
568 sym[K_THREAD_STACK_LEN(size)]
584#define Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, lsect) \
585 struct z_thread_stack_element lsect \
586 __aligned(Z_THREAD_STACK_OBJ_ALIGN(size)) \
587 sym[nmemb][K_THREAD_STACK_LEN(size)]
615#define K_THREAD_STACK_DEFINE(sym, size) \
616 Z_THREAD_STACK_DEFINE_IN(sym, size, __stackmem)
631#define K_THREAD_STACK_LEN(size) \
632 ROUND_UP(Z_THREAD_STACK_SIZE_ADJUST(size), \
633 Z_THREAD_STACK_OBJ_ALIGN(size))
648#define K_THREAD_STACK_ARRAY_DEFINE(sym, nmemb, size) \
649 Z_THREAD_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __stackmem)
#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:325
#define K_THREAD_STACK_RESERVED
Indicate how much additional memory is reserved for stack objects.
Definition thread_stack.h:420
static char * K_THREAD_STACK_BUFFER(k_thread_stack_t *sym)
Get a pointer to the physical stack buffer.
Definition thread_stack.h:667
static char * K_KERNEL_STACK_BUFFER(k_thread_stack_t *sym)
Definition thread_stack.h:388
#define K_KERNEL_STACK_RESERVED
Definition thread_stack.h:96
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105