aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>2004-11-12 17:15:41 +0000
committercl349@freefall.cl.cam.ac.uk <cl349@freefall.cl.cam.ac.uk>2004-11-12 17:15:41 +0000
commit1b8bcd6f21cc91011cedfa9535625c5321aedd31 (patch)
tree79bb7f355a7ad6ba8a799a12705f158ec1837f94
parent6e0ba034627530ed96f6ca20bd5f3e15bd2517f3 (diff)
downloadxen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.tar.gz
xen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.tar.bz2
xen-1b8bcd6f21cc91011cedfa9535625c5321aedd31.zip
bitkeeper revision 1.1159.172.5 (4194efbdtn0wkhatZ5h3AhSTCQkn2g)
Add hooks for debuggers.
-rw-r--r--.rootkeys1
-rw-r--r--xen/arch/x86/traps.c30
-rw-r--r--xen/include/xen/debugger_hooks.h37
3 files changed, 54 insertions, 14 deletions
diff --git a/.rootkeys b/.rootkeys
index 2a93a73cac..b3c7cea0c4 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -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__ */