aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/process.c
diff options
context:
space:
mode:
authorPaul Mundt <lethal@linux-sh.org>2006-12-13 03:40:05 -0500
committerPaul Mundt <lethal@linux-sh.org>2007-02-12 20:54:43 -0500
commitf413d0d9fa7abcecc40e115cf4aead372d164a75 (patch)
tree72146d33f19d338076c55b7597dc15ce3f357f2c /arch/sh/kernel/process.c
parentec2f9d1331f658433411c58077871e1eef4ee1b4 (diff)
sh: Use a jump call table for debug trap handlers.
This rips out most of the needlessly complicated sh_bios and kgdb trap handling, and forces it all through a common fast dispatch path. As more debug traps are inserted, it's important to keep them in sync for all of the parts, not just SH-3/4. As the SH-2 parts are unable to do traps in the >= 0x40 range, we restrict the debug traps to the 0x30-0x3f range on all parts, and also bump the kgdb breakpoint trap down in to this range (from 0xff to 0x3c) so it's possible to use for nommu. Optionally, this table can be padded out to catch spurious traps for SH-3/4, but we don't do that yet.. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/process.c')
-rw-r--r--arch/sh/kernel/process.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c
index 486c06e18033..cc8f306fd682 100644
--- a/arch/sh/kernel/process.c
+++ b/arch/sh/kernel/process.c
@@ -493,9 +493,27 @@ asmlinkage void break_point_trap(void)
493 force_sig(SIGTRAP, current); 493 force_sig(SIGTRAP, current);
494} 494}
495 495
496asmlinkage void break_point_trap_software(unsigned long r4, unsigned long r5, 496/*
497 unsigned long r6, unsigned long r7, 497 * Generic trap handler.
498 struct pt_regs __regs) 498 */
499asmlinkage void debug_trap_handler(unsigned long r4, unsigned long r5,
500 unsigned long r6, unsigned long r7,
501 struct pt_regs __regs)
502{
503 struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
504
505 /* Rewind */
506 regs->pc -= 2;
507
508 force_sig(SIGTRAP, current);
509}
510
511/*
512 * Special handler for BUG() traps.
513 */
514asmlinkage void bug_trap_handler(unsigned long r4, unsigned long r5,
515 unsigned long r6, unsigned long r7,
516 struct pt_regs __regs)
499{ 517{
500 struct pt_regs *regs = RELOC_HIDE(&__regs, 0); 518 struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
501 519