@@ -112,6 +112,79 @@ static inline char *z_stack_ptr_align(char *ptr)
112
112
* @{
113
113
*/
114
114
115
+ #ifdef CONFIG_HW_SHADOW_STACK
116
+ #define k_thread_hw_shadow_stack_t arch_thread_hw_shadow_stack_t
117
+
118
+ #define K_THREAD_HW_SHADOW_STACK_SIZE (size_ ) \
119
+ MAX(ROUND_UP((CONFIG_HW_SHADOW_STACK_PERCENTAGE_SIZE * (size_) / 100), \
120
+ CONFIG_X86_CET_SHADOW_STACK_ALIGNMENT), \
121
+ CONFIG_HW_SHADOW_STACK_MIN_SIZE)
122
+
123
+ #define K_KERNEL_HW_SHADOW_STACK_DECLARE (sym , size ) \
124
+ ARCH_THREAD_HW_SHADOW_STACK_DECLARE(__ ## sym ## _shstk, size)
125
+
126
+ #define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE (sym , nmemb , size ) \
127
+ ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DECLARE(__ ## sym ## _shstk_arr, \
128
+ nmemb, size)
129
+
130
+ struct _stack_to_hw_shadow_stack {
131
+ k_thread_stack_t * stack ;
132
+ k_thread_hw_shadow_stack_t * shstk_addr ;
133
+ size_t size ;
134
+ };
135
+
136
+ #define K_THREAD_HW_SHADOW_STACK_DEFINE (sym , size_ ) \
137
+ ARCH_THREAD_HW_SHADOW_STACK_DEFINE(__ ## sym ## _shstk, size_); \
138
+ static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack, \
139
+ sym ## _stack_to_shstk_attach) = { \
140
+ .stack = sym, \
141
+ .shstk_addr = __ ## sym ## _shstk, \
142
+ .size = size_, \
143
+ }
144
+
145
+ struct _stack_to_hw_shadow_stack_arr {
146
+ uintptr_t stack_addr ;
147
+ uintptr_t shstk_addr ;
148
+ size_t stack_size ;
149
+ size_t shstk_size ;
150
+ size_t nmemb ;
151
+ };
152
+
153
+ #define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE (sym , nmemb_ , size_ ) \
154
+ ARCH_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(__ ## sym ## _shstk_arr, nmemb_, \
155
+ K_THREAD_HW_SHADOW_STACK_SIZE(size_)); \
156
+ static const STRUCT_SECTION_ITERABLE(_stack_to_hw_shadow_stack_arr, \
157
+ sym ## _stack_to_shstk_attach) = { \
158
+ .stack_addr = (uintptr_t)sym, \
159
+ .stack_size = K_KERNEL_STACK_LEN(size_), \
160
+ .nmemb = nmemb_, \
161
+ .shstk_addr = (uintptr_t)__ ## sym ## _shstk_arr, \
162
+ .shstk_size = K_THREAD_HW_SHADOW_STACK_SIZE(size_), \
163
+ }
164
+
165
+ #define k_thread_hw_shadow_stack_attach arch_thread_hw_shadow_stack_attach
166
+
167
+ struct _thread_hw_shadow_stack_static {
168
+ struct k_thread * thread ;
169
+ k_thread_hw_shadow_stack_t * shstk_addr ;
170
+ size_t size ;
171
+ };
172
+
173
+ #define K_THREAD_HW_SHADOW_STACK_ATTACH (thread_ , shstk_addr_ , size_ ) \
174
+ static const STRUCT_SECTION_ITERABLE(_thread_hw_shadow_stack_static, \
175
+ thread ## _shstk_attach_static) = { \
176
+ .thread = thread_, \
177
+ .shstk_addr = shstk_addr_, \
178
+ .size = size_, \
179
+ }
180
+
181
+ #else
182
+ #define K_KERNEL_HW_SHADOW_STACK_DECLARE (sym , size )
183
+ #define K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE (sym , nmemb , size )
184
+ #define K_THREAD_HW_SHADOW_STACK_DEFINE (sym , size )
185
+ #define K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE (sym , nmemb , size_ )
186
+ #endif
187
+
115
188
/**
116
189
* @brief Declare a reference to a thread stack
117
190
*
@@ -122,6 +195,7 @@ static inline char *z_stack_ptr_align(char *ptr)
122
195
* @param size Size of the stack memory region
123
196
*/
124
197
#define K_KERNEL_STACK_DECLARE (sym , size ) \
198
+ K_KERNEL_HW_SHADOW_STACK_DECLARE(sym, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
125
199
extern struct z_thread_stack_element \
126
200
sym[K_KERNEL_STACK_LEN(size)]
127
201
@@ -136,6 +210,7 @@ static inline char *z_stack_ptr_align(char *ptr)
136
210
* @param size Size of the stack memory region
137
211
*/
138
212
#define K_KERNEL_STACK_ARRAY_DECLARE (sym , nmemb , size ) \
213
+ K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
139
214
extern struct z_thread_stack_element \
140
215
sym[nmemb][K_KERNEL_STACK_LEN(size)]
141
216
@@ -150,6 +225,7 @@ static inline char *z_stack_ptr_align(char *ptr)
150
225
* @param size Size of the stack memory region
151
226
*/
152
227
#define K_KERNEL_PINNED_STACK_ARRAY_DECLARE (sym , nmemb , size ) \
228
+ K_KERNEL_HW_SHADOW_STACK_ARRAY_DECLARE(sym, nmemb, K_THREAD_HW_SHADOW_STACK_SIZE(size)); \
153
229
extern struct z_thread_stack_element \
154
230
sym[nmemb][K_KERNEL_STACK_LEN(size)]
155
231
@@ -212,7 +288,9 @@ static inline char *z_stack_ptr_align(char *ptr)
212
288
* @param size Size of the stack memory region
213
289
*/
214
290
#define K_KERNEL_STACK_DEFINE (sym , size ) \
215
- Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem)
291
+ Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
292
+ K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
293
+ K_THREAD_HW_SHADOW_STACK_SIZE(size))
216
294
217
295
/**
218
296
* @brief Define a toplevel kernel stack memory region in pinned section
@@ -228,10 +306,14 @@ static inline char *z_stack_ptr_align(char *ptr)
228
306
*/
229
307
#if defined(CONFIG_LINKER_USE_PINNED_SECTION )
230
308
#define K_KERNEL_PINNED_STACK_DEFINE (sym , size ) \
231
- Z_KERNEL_STACK_DEFINE_IN(sym, size, __pinned_noinit)
309
+ Z_KERNEL_STACK_DEFINE_IN(sym, size, __pinned_noinit); \
310
+ K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
311
+ K_THREAD_HW_SHADOW_STACK_SIZE(size))
232
312
#else
233
313
#define K_KERNEL_PINNED_STACK_DEFINE (sym , size ) \
234
- Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem)
314
+ Z_KERNEL_STACK_DEFINE_IN(sym, size, __kstackmem); \
315
+ K_THREAD_HW_SHADOW_STACK_DEFINE(sym, \
316
+ K_THREAD_HW_SHADOW_STACK_SIZE(size))
235
317
#endif /* CONFIG_LINKER_USE_PINNED_SECTION */
236
318
237
319
/**
@@ -244,7 +326,9 @@ static inline char *z_stack_ptr_align(char *ptr)
244
326
* @param size Size of the stack memory region
245
327
*/
246
328
#define K_KERNEL_STACK_ARRAY_DEFINE (sym , nmemb , size ) \
247
- Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem)
329
+ Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
330
+ K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
331
+
248
332
249
333
/**
250
334
* @brief Define a toplevel array of kernel stack memory regions in pinned section
@@ -261,10 +345,12 @@ static inline char *z_stack_ptr_align(char *ptr)
261
345
*/
262
346
#if defined(CONFIG_LINKER_USE_PINNED_SECTION )
263
347
#define K_KERNEL_PINNED_STACK_ARRAY_DEFINE (sym , nmemb , size ) \
264
- Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __pinned_noinit)
348
+ Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __pinned_noinit); \
349
+ K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
265
350
#else
266
351
#define K_KERNEL_PINNED_STACK_ARRAY_DEFINE (sym , nmemb , size ) \
267
- Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem)
352
+ Z_KERNEL_STACK_ARRAY_DEFINE_IN(sym, nmemb, size, __kstackmem); \
353
+ K_THREAD_HW_SHADOW_STACK_ARRAY_DEFINE(sym, nmemb, size)
268
354
#endif /* CONFIG_LINKER_USE_PINNED_SECTION */
269
355
270
356
/**
@@ -283,14 +369,6 @@ static inline char *z_stack_ptr_align(char *ptr)
283
369
284
370
/** @} */
285
371
286
- #ifdef CONFIG_HW_SHADOW_STACK
287
- #define K_THREAD_HW_SHADOW_STACK_DEFINE ARCH_THREAD_HW_SHADOW_STACK_DEFINE
288
-
289
- #define k_thread_hw_shadow_stack_t arch_thread_hw_shadow_stack_t
290
-
291
- #define k_thread_hw_shadow_stack_attach arch_thread_hw_shadow_stack_attach
292
- #endif
293
-
294
372
static inline char * K_KERNEL_STACK_BUFFER (k_thread_stack_t * sym )
295
373
{
296
374
return (char * )sym + K_KERNEL_STACK_RESERVED ;
0 commit comments