diff options
author | cl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk> | 2004-11-12 17:15:41 +0000 |
---|---|---|
committer | cl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk> | 2004-11-12 17:15:41 +0000 |
commit | 1b8bcd6f21cc91011cedfa9535625c5321aedd31 (patch) | |
tree | 79bb7f355a7ad6ba8a799a12705f158ec1837f94 | |
parent | 6e0ba034627530ed96f6ca20bd5f3e15bd2517f3 (diff) | |
download | xen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.tar.gz xen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.tar.bz2 xen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.zip |
bitkeeper revision 1.1159.172.5 (4194efbdtn0wkhatZ5h3AhSTCQkn2g)
Add hooks for debuggers.
-rw-r--r-- | .rootkeys | 1 | ||||
-rw-r--r-- | xen/arch/x86/traps.c | 30 | ||||
-rw-r--r-- | xen/include/xen/debugger_hooks.h | 37 |
3 files changed, 54 insertions, 14 deletions
@@ -762,6 +762,7 @@ 3ddb79c259jh8hE7vre_8NuE7nwNSA xen/include/xen/config.h 3eb165e0eawr3R-p2ZQtSdLWtLRN_A xen/include/xen/console.h 3ddb79c1V44RD26YqCUm-kqIupM37A xen/include/xen/ctype.h +4194efbdvxUXjCLobbopgLOojisO4Q xen/include/xen/debugger_hooks.h 3ddb79c05DdHQ0UxX_jKsXdR4QlMCA xen/include/xen/delay.h 3ddb79c2O729EttZTYu1c8LcsUO_GQ xen/include/xen/elf.h 3ddb79c0HIghfBF8zFUdmXhOU8i6hA xen/include/xen/errno.h diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index b15939d6cf..2026432ec0 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -51,6 +51,7 @@ #include <asm/uaccess.h> #include <asm/i387.h> #include <asm/pdb.h> +#include <xen/debugger_hooks.h> extern char opt_nmi[]; @@ -243,6 +244,9 @@ static inline void do_trap(int trapnr, char *str, return; } + if (debugger_trap(trapnr, regs)) + return; + show_registers(regs); panic("CPU%d FATAL TRAP: vector = %d (%s)\n" "[error_code=%08x]\n", @@ -280,10 +284,8 @@ asmlinkage void do_int3(struct xen_regs *regs, long error_code) struct guest_trap_bounce *gtb = guest_trap_bounce+smp_processor_id(); trap_info_t *ti; -#ifdef XEN_DEBUGGER - if ( pdb_initialized && pdb_handle_exception(3, regs) == 0 ) + if (debugger_trap(3, regs)) return; -#endif if ( (regs->cs & 3) != 3 ) { @@ -329,6 +331,8 @@ asmlinkage void do_double_fault(void) printk("System needs manual reset.\n"); printk("************************************\n"); + debugger_trap(8, NULL); + /* Lock up the console to prevent spurious output from other CPUs. */ console_force_lock(); @@ -406,6 +410,9 @@ asmlinkage void do_page_fault(struct xen_regs *regs, long error_code) return; } + if (debugger_trap(14, regs)) + return; + if ( addr >= PAGE_OFFSET ) { unsigned long page; @@ -423,17 +430,6 @@ asmlinkage void do_page_fault(struct xen_regs *regs, long error_code) #endif } -#ifdef XEN_DEBUGGER - if ( pdb_page_fault_possible ) - { - pdb_page_fault = 1; - /* make eax & edx valid to complete the instruction */ - regs->eax = (long)&pdb_page_fault_scratch; - regs->edx = (long)&pdb_page_fault_scratch; - return; - } -#endif - show_registers(regs); panic("CPU%d FATAL PAGE FAULT\n" "[error_code=%08x]\n" @@ -520,6 +516,9 @@ asmlinkage void do_general_protection(struct xen_regs *regs, long error_code) return; } + if (debugger_trap(13, regs)) + return; + die("general protection fault", regs, error_code); } @@ -565,6 +564,9 @@ asmlinkage void io_check_error(struct xen_regs *regs) static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs) { + if (debugger_trap(2, regs)) + return; + printk("Uhhuh. NMI received for unknown reason %02x.\n", reason); printk("Dazed and confused, but trying to continue\n"); printk("Do you have a strange power saving mode enabled?\n"); diff --git a/xen/include/xen/debugger_hooks.h b/xen/include/xen/debugger_hooks.h new file mode 100644 index 0000000000..4663b2b3bd --- /dev/null +++ b/xen/include/xen/debugger_hooks.h @@ -0,0 +1,37 @@ + +#ifndef __DEBUGGER_HOOKS_H__ +#define __DEBUGGER_HOOKS_H__ + +static inline int debugger_trap(int type, struct xen_regs *regs) +{ + int ret = 0; + +#ifdef XEN_DEBUGGER + switch (type) { + case 3: + if ( pdb_initialized && pdb_handle_exception(type, regs) == 0 ) + return 1; + break; + case 14: + if ( pdb_page_fault_possible ) + { + pdb_page_fault = 1; + /* make eax & edx valid to complete the instruction */ + regs->eax = (long)&pdb_page_fault_scratch; + regs->edx = (long)&pdb_page_fault_scratch; + return 1; + } + break; + } +#endif + +#if 0 + extern int kdb_trap(int, int, struct xen_regs *); + if ((ret = kdb_trap(type, 0, regs))) + return ret; +#endif + + return ret; +} + +#endif /* __DEBUGGER_HOOKS_H__ */ |