Message ID | 20250314-v5_user_cfi_series-v12-23-e51202b53138@rivosinc.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | riscv control-flow integrity for usermode | expand |
Context | Check | Description |
---|---|---|
bjorn/pre-ci_am | success | Success |
bjorn/build-rv32-defconfig | success | build-rv32-defconfig |
bjorn/build-rv64-clang-allmodconfig | success | build-rv64-clang-allmodconfig |
bjorn/build-rv64-gcc-allmodconfig | success | build-rv64-gcc-allmodconfig |
bjorn/build-rv64-nommu-k210-defconfig | fail | build-rv64-nommu-k210-defconfig |
bjorn/build-rv64-nommu-k210-virt | fail | build-rv64-nommu-k210-virt |
bjorn/checkpatch | warning | checkpatch |
bjorn/dtb-warn-rv64 | success | dtb-warn-rv64 |
bjorn/header-inline | success | header-inline |
bjorn/kdoc | success | kdoc |
bjorn/module-param | success | module-param |
bjorn/verify-fixes | success | verify-fixes |
bjorn/verify-signedoff | success | verify-signedoff |
2025-03-14T14:39:42-07:00, Deepak Gupta <debug@rivosinc.com>: > This commit adds a kernel command line option using which user cfi can be > disabled. > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > --- > 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.
On Thu, Mar 20, 2025 at 2:35 PM Radim Krčmář <rkrcmar@ventanamicro.com> wrote: > > 2025-03-14T14:39:42-07:00, Deepak Gupta <debug@rivosinc.com>: > > This commit adds a kernel command line option using which user cfi can be > > disabled. > > > > Signed-off-by: Deepak Gupta <debug@rivosinc.com> > > --- > > 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. One for zicfilp and one for zicfiss ? > > In any case, I think we still document params in kernel-parameters.txt. Noted, will do that.
2025-03-20T15:31:09-07:00, Deepak Gupta <debug@rivosinc.com>: > On Thu, Mar 20, 2025 at 2:35 PM Radim Krčmář <rkrcmar@ventanamicro.com> wrote: >> 2025-03-14T14:39:42-07:00, Deepak Gupta <debug@rivosinc.com>: >> > +__setup("disable_riscv_usercfi=", setup_global_riscv_enable); >> >> I'd prefer two command line options instead. > > One for zicfilp and one for zicfiss ? Yes. I don't want to suggest the naming, because I would have used "nousercfi" without an argument for the current one.
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);
This commit adds a kernel command line option using which user cfi can be disabled. Signed-off-by: Deepak Gupta <debug@rivosinc.com> --- arch/riscv/kernel/usercfi.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)