| 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | #ifndef _ASM_X86_SHSTK_H |
| 3 | #define _ASM_X86_SHSTK_H |
| 4 | |
| 5 | #ifndef __ASSEMBLER__ |
| 6 | #include <linux/types.h> |
| 7 | |
| 8 | struct task_struct; |
| 9 | struct ksignal; |
| 10 | |
| 11 | #ifdef CONFIG_X86_USER_SHADOW_STACK |
| 12 | struct thread_shstk { |
| 13 | u64 base; |
| 14 | u64 size; |
| 15 | }; |
| 16 | |
| 17 | long shstk_prctl(struct task_struct *task, int option, unsigned long arg2); |
| 18 | void reset_thread_features(void); |
| 19 | unsigned long shstk_alloc_thread_stack(struct task_struct *p, u64 clone_flags, |
| 20 | unsigned long stack_size); |
| 21 | void shstk_free(struct task_struct *p); |
| 22 | int setup_signal_shadow_stack(struct ksignal *ksig); |
| 23 | int restore_signal_shadow_stack(void); |
| 24 | int shstk_update_last_frame(unsigned long val); |
| 25 | bool shstk_is_enabled(void); |
| 26 | int shstk_pop(u64 *val); |
| 27 | int shstk_push(u64 val); |
| 28 | #else |
| 29 | static inline long shstk_prctl(struct task_struct *task, int option, |
| 30 | unsigned long arg2) { return -EINVAL; } |
| 31 | static inline void reset_thread_features(void) {} |
| 32 | static inline unsigned long shstk_alloc_thread_stack(struct task_struct *p, |
| 33 | u64 clone_flags, |
| 34 | unsigned long stack_size) { return 0; } |
| 35 | static inline void shstk_free(struct task_struct *p) {} |
| 36 | static inline int setup_signal_shadow_stack(struct ksignal *ksig) { return 0; } |
| 37 | static inline int restore_signal_shadow_stack(void) { return 0; } |
| 38 | static inline int shstk_update_last_frame(unsigned long val) { return 0; } |
| 39 | static inline bool shstk_is_enabled(void) { return false; } |
| 40 | static inline int shstk_pop(u64 *val) { return -ENOTSUPP; } |
| 41 | static inline int shstk_push(u64 val) { return -ENOTSUPP; } |
| 42 | #endif /* CONFIG_X86_USER_SHADOW_STACK */ |
| 43 | |
| 44 | #endif /* __ASSEMBLER__ */ |
| 45 | |
| 46 | #endif /* _ASM_X86_SHSTK_H */ |
| 47 | |