Commit 2538c2d0 authored by K.Prasad's avatar K.Prasad Committed by Paul Mackerras

powerpc, hw_breakpoint: Handle concurrent alignment interrupts

If an alignment interrupt occurs on an instruction that is being
single-stepped, the alignment interrupt handler currently handles
the single-step condition by unconditionally sending a SIGTRAP to
the process.  Other synchronous interrupts that result in the
instruction being emulated do likewise.

With hw_breakpoint support, the hw_breakpoint code needs to be able
to intercept these single-step events as well as those where the
instruction executes normally and a trace interrupt happens.

Fix this by making emulate_single_step() use the existing
single_step_exception() function instead of calling _exception()
directly.  We then make single_step_exception() use the abstracted
clear_single_step() rather than clearing bits in the MSR image
directly so that emulate_single_step() will continue to work
correctly on Book 3E processors.
Signed-off-by: default avatarK.Prasad <prasad@linux.vnet.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 5aae8a53
...@@ -688,7 +688,7 @@ void RunModeException(struct pt_regs *regs) ...@@ -688,7 +688,7 @@ void RunModeException(struct pt_regs *regs)
void __kprobes single_step_exception(struct pt_regs *regs) void __kprobes single_step_exception(struct pt_regs *regs)
{ {
regs->msr &= ~(MSR_SE | MSR_BE); /* Turn off 'trace' bits */ clear_single_step(regs);
if (notify_die(DIE_SSTEP, "single_step", regs, 5, if (notify_die(DIE_SSTEP, "single_step", regs, 5,
5, SIGTRAP) == NOTIFY_STOP) 5, SIGTRAP) == NOTIFY_STOP)
...@@ -707,10 +707,8 @@ void __kprobes single_step_exception(struct pt_regs *regs) ...@@ -707,10 +707,8 @@ void __kprobes single_step_exception(struct pt_regs *regs)
*/ */
static void emulate_single_step(struct pt_regs *regs) static void emulate_single_step(struct pt_regs *regs)
{ {
if (single_stepping(regs)) { if (single_stepping(regs))
clear_single_step(regs); single_step_exception(regs);
_exception(SIGTRAP, regs, TRAP_TRACE, 0);
}
} }
static inline int __parse_fpscr(unsigned long fpscr) static inline int __parse_fpscr(unsigned long fpscr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment