Skip to contentSkip to conversation

csky: Fixup perf probe -x hungup

PATCH New [email protected] 1 participant 1 message Apr 14, 2020

Subsystems (4)
lore
Share & tools
lore

[email protected]

author maintainer
#0 lore raw

PATCH 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.

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
index b3a56c260e3e..1a9e0961b2b5 100644
@@ -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
index 21ac2608f205..5a82230bddf9 100644
@@ -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