xref: /linux/arch/riscv/include/asm/usercfi.h (revision d30c1683aaecb93d2ab95685dc4300a33d3cea7a)
1 /* SPDX-License-Identifier: GPL-2.0
2  * Copyright (C) 2024 Rivos, Inc.
3  * Deepak Gupta <debug@rivosinc.com>
4  */
5 #ifndef _ASM_RISCV_USERCFI_H
6 #define _ASM_RISCV_USERCFI_H
7 
8 #define CMDLINE_DISABLE_RISCV_USERCFI_FCFI	1
9 #define CMDLINE_DISABLE_RISCV_USERCFI_BCFI	2
10 #define CMDLINE_DISABLE_RISCV_USERCFI		3
11 
12 #ifndef __ASSEMBLER__
13 #include <linux/types.h>
14 #include <linux/prctl.h>
15 #include <linux/errno.h>
16 
17 struct task_struct;
18 struct kernel_clone_args;
19 
20 extern unsigned long riscv_nousercfi;
21 
22 #ifdef CONFIG_RISCV_USER_CFI
23 struct cfi_state {
24 	unsigned long ubcfi_en : 1; /* Enable for backward cfi. */
25 	unsigned long ubcfi_locked : 1;
26 	unsigned long ufcfi_en : 1; /* Enable for forward cfi. Note that ELP goes in sstatus */
27 	unsigned long ufcfi_locked : 1;
28 	unsigned long user_shdw_stk; /* Current user shadow stack pointer */
29 	unsigned long shdw_stk_base; /* Base address of shadow stack */
30 	unsigned long shdw_stk_size; /* size of shadow stack */
31 };
32 
33 unsigned long shstk_alloc_thread_stack(struct task_struct *tsk,
34 				       const struct kernel_clone_args *args);
35 void shstk_release(struct task_struct *tsk);
36 void set_shstk_base(struct task_struct *task, unsigned long shstk_addr, unsigned long size);
37 unsigned long get_shstk_base(struct task_struct *task, unsigned long *size);
38 void set_active_shstk(struct task_struct *task, unsigned long shstk_addr);
39 bool is_shstk_enabled(struct task_struct *task);
40 bool is_shstk_locked(struct task_struct *task);
41 bool is_shstk_allocated(struct task_struct *task);
42 void set_shstk_lock(struct task_struct *task);
43 void set_shstk_status(struct task_struct *task, bool enable);
44 unsigned long get_active_shstk(struct task_struct *task);
45 int restore_user_shstk(struct task_struct *tsk, unsigned long shstk_ptr);
46 int save_user_shstk(struct task_struct *tsk, unsigned long *saved_shstk_ptr);
47 bool is_indir_lp_enabled(struct task_struct *task);
48 bool is_indir_lp_locked(struct task_struct *task);
49 void set_indir_lp_status(struct task_struct *task, bool enable);
50 void set_indir_lp_lock(struct task_struct *task);
51 
52 #define PR_SHADOW_STACK_SUPPORTED_STATUS_MASK (PR_SHADOW_STACK_ENABLE)
53 
54 #else
55 
56 #define shstk_alloc_thread_stack(tsk, args) 0
57 
58 #define shstk_release(tsk)
59 
60 #define get_shstk_base(task, size) 0UL
61 
62 #define set_shstk_base(task, shstk_addr, size) do {} while (0)
63 
64 #define set_active_shstk(task, shstk_addr) do {} while (0)
65 
66 #define is_shstk_enabled(task) false
67 
68 #define is_shstk_locked(task) false
69 
70 #define is_shstk_allocated(task) false
71 
72 #define set_shstk_lock(task) do {} while (0)
73 
74 #define set_shstk_status(task, enable) do {} while (0)
75 
76 #define is_indir_lp_enabled(task) false
77 
78 #define is_indir_lp_locked(task) false
79 
80 #define set_indir_lp_status(task, enable) do {} while (0)
81 
82 #define set_indir_lp_lock(task) do {} while (0)
83 
84 #define restore_user_shstk(tsk, shstk_ptr) -EINVAL
85 
86 #define save_user_shstk(tsk, saved_shstk_ptr) -EINVAL
87 
88 #define get_active_shstk(task) 0UL
89 
90 #endif /* CONFIG_RISCV_USER_CFI */
91 
92 bool is_user_shstk_enabled(void);
93 bool is_user_lpad_enabled(void);
94 
95 #endif /* __ASSEMBLER__ */
96 
97 #endif /* _ASM_RISCV_USERCFI_H */
98