aboutsummaryrefslogtreecommitdiff
path: root/arch/blackfin/kernel
diff options
context:
space:
mode:
authorRobin Getz2007-11-21 16:38:05 +0800
committerBryan Wu2007-11-21 16:38:05 +0800
commitfb322915a05804a3a153f714f2f08e4c32ce84c7 (patch)
tree019c4ff7e2e1593d3dfab1206386ecaf61e7fb72 /arch/blackfin/kernel
parent569a50ca3f56cd69199733580e7ca0e81029473a (diff)
Blackfin arch: fix bug when sending signals with the wrong PC, cause gdb get confused
We need to send signals with the proper PC, or gdb gets confused, and lots of tests fail. This should fix that. Signed-off-by: Robin Getz <robin.getz@analog.com> Signed-off-by: Bryan Wu <bryan.wu@analog.com>
Diffstat (limited to 'arch/blackfin/kernel')
-rw-r--r--arch/blackfin/kernel/traps.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c
index d88098c58bfa..910cdd43fe60 100644
--- a/arch/blackfin/kernel/traps.c
+++ b/arch/blackfin/kernel/traps.c
@@ -463,18 +463,20 @@ asmlinkage void trap_c(struct pt_regs *fp)
#endif
panic("Kernel exception");
}
-
- /* Ensure that bad return addresses don't end up in an infinite
- * loop, due to speculative loads/reads
- */
- if (trapnr == VEC_CPLB_I_M)
- fp->pc = SAFE_USER_INSTRUCTION;
}
+
info.si_signo = sig;
info.si_errno = 0;
info.si_addr = (void *)fp->pc;
force_sig_info(sig, &info, current);
+ /* Ensure that bad return addresses don't end up in an infinite
+ * loop, due to speculative loads/reads. This needs to be done after
+ * the signal has been sent.
+ */
+ if (trapnr == VEC_CPLB_I_M && sig != SIGTRAP)
+ fp->pc = SAFE_USER_INSTRUCTION;
+
trace_buffer_restore(j);
return;
}