csky: Fixup perf probe -x hungup
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 <guoren@linux.alibaba.com> Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
bd11aabd35
commit
c2e59d1f4d
|
@ -11,6 +11,11 @@
|
||||||
|
|
||||||
#define UPROBE_TRAP_NR UINT_MAX
|
#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)
|
unsigned long uprobe_get_swbp_addr(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
return instruction_pointer(regs);
|
return instruction_pointer(regs);
|
||||||
|
|
|
@ -41,6 +41,9 @@ static void singlestep_disable(struct task_struct *tsk)
|
||||||
|
|
||||||
regs = task_pt_regs(tsk);
|
regs = task_pt_regs(tsk);
|
||||||
regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_RUN;
|
regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_RUN;
|
||||||
|
|
||||||
|
/* Enable irq */
|
||||||
|
regs->sr |= BIT(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void singlestep_enable(struct task_struct *tsk)
|
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 = task_pt_regs(tsk);
|
||||||
regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_SI;
|
regs->sr = (regs->sr & TRACE_MODE_MASK) | TRACE_MODE_SI;
|
||||||
|
|
||||||
|
/* Disable irq */
|
||||||
|
regs->sr &= ~BIT(6);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue