csky: Fixup perf probe -x hungup
[email protected]
maintainerPATCH 1/1 csky: Fixup perf probe -x hungup
From: Guo Ren <[email protected]>
case:
# perf probe -x /lib/libc-2.28.9000.so memcpy # perf record -e probe_libc:memcpy -aR sleep 1
System hangup and cpu get in trap_c loop, because our hardware singlestep state could still get interrupt signal. When we get in uprobe_xol singlestep slot, we should disable irq in pt_regs->psr.
And is_swbp_insn() need a csky arch implementation with a low 16bit mask.
Signed-off-by Guo Ren <[email protected]>
Cc Steven Rostedt (VMware) <[email protected]>
--- arch/csky/kernel/probes/uprobes.c | 5 +++++ arch/csky/kernel/ptrace.c | 6 ++++++ 2 files changed, 11 insertions(+)
arch/csky/kernel/probes/uprobes.c +5 -0
@@ -11,6 +11,11 @@#define UPROBE_TRAP_NR UINT_MAX +bool is_swbp_insn (uprobe_opcode_t *insn) +{ +return (*insn &0xffff ) ==UPROBE_SWBP_INSN ; +} +unsigned long uprobe_get_swbp_addr (struct pt_regs *regs) {return instruction_pointer (regs);
arch/csky/kernel/ptrace.c +6 -0
@@ -41,6 +41,9 @@ static void singlestep_disable(struct task_struct *tsk) regs =task_pt_regs (tsk); regs->sr = (regs->sr &TRACE_MODE_MASK ) |TRACE_MODE_RUN ; + +/* Enable irq */ + regs->sr |=BIT (6 ); }static void singlestep_enable (struct task_struct *tsk)
@@ -49,6 +52,9 @@ static void singlestep_enable(struct task_struct *tsk) regs =task_pt_regs (tsk); regs->sr = (regs->sr &TRACE_MODE_MASK ) |TRACE_MODE_SI ; + +/* Disable irq */ + regs->sr &= ~BIT (6 ); }/*
Signature · 1 line
2.17.0