Messages in this thread | | | From | Guo Ren <> | Date | Tue, 29 Aug 2023 17:48:19 +0800 | Subject | Re: [PATCH v2] riscv: provide riscv-specific is_trap_insn() |
| |
Thx for the fix.
Reviewed-by: Guo Ren <guoren@kernel.org>
On Tue, Aug 29, 2023 at 4:37 PM Nam Cao <namcaov@gmail.com> wrote: > > uprobes expects is_trap_insn() to return true for any trap instructions, > not just the one used for installing uprobe. The current default > implementation only returns true for 16-bit c.ebreak if C extension is > enabled. This can confuse uprobes if a 32-bit ebreak generates a trap > exception from userspace: uprobes asks is_trap_insn() who says there is no > trap, so uprobes assume a probe was there before but has been removed, and > return to the trap instruction. This causes an infinite loop of entering > and exiting trap handler. > > Instead of using the default implementation, implement this function > speficially for riscv with checks for both ebreak and c.ebreak. > > Fixes: 74784081aac8 ("riscv: Add uprobes supported") > Signed-off-by: Nam Cao <namcaov@gmail.com> > Tested-by: Björn Töpel <bjorn@rivosinc.com> > --- > v2: remove #ifdef CONFIG_RISCV_ISA_C (Guo Ren) > > arch/riscv/kernel/probes/uprobes.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/arch/riscv/kernel/probes/uprobes.c b/arch/riscv/kernel/probes/uprobes.c > index 194f166b2cc4..4b3dc8beaf77 100644 > --- a/arch/riscv/kernel/probes/uprobes.c > +++ b/arch/riscv/kernel/probes/uprobes.c > @@ -3,6 +3,7 @@ > #include <linux/highmem.h> > #include <linux/ptrace.h> > #include <linux/uprobes.h> > +#include <asm/insn.h> > > #include "decode-insn.h" > > @@ -17,6 +18,11 @@ bool is_swbp_insn(uprobe_opcode_t *insn) > #endif > } > > +bool is_trap_insn(uprobe_opcode_t *insn) > +{ > + return riscv_insn_is_ebreak(*insn) || riscv_insn_is_c_ebreak(*insn); > +} > + > unsigned long uprobe_get_swbp_addr(struct pt_regs *regs) > { > return instruction_pointer(regs); > -- > 2.34.1 >
-- Best Regards Guo Ren
| |