2025-03-14T14:39:42-07:00, Deepak Gupta <debug@xxxxxxxxxxxx>: > This commit adds a kernel command line option using which user cfi can be > disabled. > > Signed-off-by: Deepak Gupta <debug@xxxxxxxxxxxx> > --- > arch/riscv/kernel/usercfi.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/arch/riscv/kernel/usercfi.c b/arch/riscv/kernel/usercfi.c > index d31d89618763..813162ce4f15 100644 > --- a/arch/riscv/kernel/usercfi.c > +++ b/arch/riscv/kernel/usercfi.c > @@ -17,6 +17,8 @@ > #include <asm/csr.h> > #include <asm/usercfi.h> > > +bool disable_riscv_usercfi; > + > #define SHSTK_ENTRY_SIZE sizeof(void *) > > bool is_shstk_enabled(struct task_struct *task) > @@ -396,6 +398,9 @@ int arch_set_shadow_stack_status(struct task_struct *t, unsigned long status) > unsigned long size = 0, addr = 0; > bool enable_shstk = false; > > + if (disable_riscv_usercfi) > + return 0; > + > if (!cpu_supports_shadow_stack()) > return -EINVAL; > > @@ -475,6 +480,9 @@ int arch_set_indir_br_lp_status(struct task_struct *t, unsigned long status) > { > bool enable_indir_lp = false; > > + if (disable_riscv_usercfi) > + return 0; > + > if (!cpu_supports_indirect_br_lp_instr()) > return -EINVAL; > > @@ -507,3 +515,16 @@ int arch_lock_indir_br_lp_status(struct task_struct *task, > > return 0; > } > + > +static int __init setup_global_riscv_enable(char *str) > +{ > + if (strcmp(str, "true") == 0) > + disable_riscv_usercfi = true; > + > + pr_info("Setting riscv usercfi to be %s\n", > + (disable_riscv_usercfi ? "disabled" : "enabled")); > + > + return 1; > +} > + > +__setup("disable_riscv_usercfi=", setup_global_riscv_enable); I'd prefer two command line options instead. In any case, I think we still document params in kernel-parameters.txt.