8#ifndef ZEPHYR_INCLUDE_ARCH_X86_CET_H_
9#define ZEPHYR_INCLUDE_ARCH_X86_CET_H_
13#ifdef CONFIG_HW_SHADOW_STACK
16 void *p1,
void *p2,
void *p3);
18typedef uintptr_t arch_thread_hw_shadow_stack_t;
20#define ARCH_THREAD_HW_SHADOW_STACK_SIZE(size_) \
21 MAX(ROUND_UP((CONFIG_HW_SHADOW_STACK_PERCENTAGE_SIZE * (size_) / 100), \
22 CONFIG_X86_CET_SHADOW_STACK_ALIGNMENT), \
23 CONFIG_HW_SHADOW_STACK_MIN_SIZE)
25#define ARCH_THREAD_HW_SHADOW_STACK_DECLARE(sym, size) \
26 extern arch_thread_hw_shadow_stack_t sym[size / sizeof(arch_thread_hw_shadow_stack_t)]
28#define ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, size) \
29 extern arch_thread_hw_shadow_stack_t \
30 sym[nmemb][size / sizeof(arch_thread_hw_shadow_stack_t)]
32#define ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(name, nmemb, size) \
33 arch_thread_hw_shadow_stack_t Z_GENERIC_SECTION(.x86shadowstack.arr_ ##name) \
34 __aligned(CONFIG_X86_CET_SHADOW_STACK_ALIGNMENT) \
35 name[MAX(nmemb, 1)][size / sizeof(arch_thread_hw_shadow_stack_t)] = \
41#define ARCH_THREAD_HW_SHADOW_STACK_DEFINE(name, size) \
42 arch_thread_hw_shadow_stack_t Z_GENERIC_SECTION(.x86shadowstack) \
43 __aligned(CONFIG_X86_CET_SHADOW_STACK_ALIGNMENT) \
44 name[size / sizeof(arch_thread_hw_shadow_stack_t)] = \
45 { [size / sizeof(arch_thread_hw_shadow_stack_t) - 5] = \
46 (uintptr_t)name + size - 4 * sizeof(arch_thread_hw_shadow_stack_t) + 1, \
47 [size / sizeof(arch_thread_hw_shadow_stack_t) - 4] = \
48 (uintptr_t)name + size - 1 * sizeof(arch_thread_hw_shadow_stack_t), \
49 [size / sizeof(arch_thread_hw_shadow_stack_t) - 3] = \
50 (uintptr_t)z_thread_entry, \
51 [size / sizeof(arch_thread_hw_shadow_stack_t) - 2] = \
52 (uintptr_t)X86_KERNEL_CS }
56#ifdef CONFIG_X86_DEBUG_INFO
58 void *p1,
void *p2,
void *p3);
59#define ___x86_entry_point z_x86_thread_entry_wrapper
61#define ___x86_entry_point z_thread_entry
64#define ARCH_THREAD_HW_SHADOW_STACK_DEFINE(name, size) \
65 arch_thread_hw_shadow_stack_t Z_GENERIC_SECTION(.x86shadowstack) \
66 __aligned(CONFIG_X86_CET_SHADOW_STACK_ALIGNMENT) \
67 name[size / sizeof(arch_thread_hw_shadow_stack_t)] = \
68 { [size / sizeof(arch_thread_hw_shadow_stack_t) - 4] = \
69 (uintptr_t)name + size - 2 * sizeof(arch_thread_hw_shadow_stack_t), \
70 [size / sizeof(arch_thread_hw_shadow_stack_t) - 3] = 0, \
71 [size / sizeof(arch_thread_hw_shadow_stack_t) - 2] = \
72 (uintptr_t)___x86_entry_point, \
76int arch_thread_hw_shadow_stack_attach(
struct k_thread *thread,
77 arch_thread_hw_shadow_stack_t *stack,
void(* k_thread_entry_t)(void *p1, void *p2, void *p3)
Thread entry point function type.
Definition arch_interface.h:48
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
Thread Structure.
Definition thread.h:262