aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/debugger.h
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-03-25 13:46:20 +0000
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-03-25 13:46:20 +0000
commita4c76ef233839681c107a29073ee3815fc9829f8 (patch)
tree3507111551c071fca504b4975e930bec1c3ce172 /xen/include/asm-x86/debugger.h
parent8dc1edbaf79cf9df4fc1275203909caf91cc503e (diff)
downloadxen-a4c76ef233839681c107a29073ee3815fc9829f8.tar.gz
xen-a4c76ef233839681c107a29073ee3815fc9829f8.tar.bz2
xen-a4c76ef233839681c107a29073ee3815fc9829f8.zip
bitkeeper revision 1.1236.46.1 (4244162c_azRsnO5-xqJ_Q-kWnMqMQ)
No direct entry to __enter_scheduler allowed. Must always pass through softirq handler. Also domain_crash() now returns and defers descehduling from local CPU: old behaviour is still provided by domain_crash_synchronous(). Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/include/asm-x86/debugger.h')
-rw-r--r--xen/include/asm-x86/debugger.h76
1 files changed, 19 insertions, 57 deletions
diff --git a/xen/include/asm-x86/debugger.h b/xen/include/asm-x86/debugger.h
index d09a1264fc..fc65736e60 100644
--- a/xen/include/asm-x86/debugger.h
+++ b/xen/include/asm-x86/debugger.h
@@ -30,6 +30,7 @@
#ifndef __X86_DEBUGGER_H__
#define __X86_DEBUGGER_H__
+#include <xen/softirq.h>
#include <asm/processor.h>
/* The main trap handlers use these helper macros which include early bail. */
@@ -40,77 +41,38 @@
int call_with_registers(int (*f)(struct xen_regs *r));
-#ifdef XEN_DEBUGGER
+#if defined(CRASH_DEBUG)
-#include <asm/pdb.h>
+extern int __trap_to_cdb(struct xen_regs *r);
+#define debugger_trap_entry(_v, _r) (0)
+#define debugger_trap_fatal(_v, _r) __trap_to_cdb(_r)
+#define debugger_trap_immediate() call_with_registers(__trap_to_cdb)
+
+#elif defined(DOMU_DEBUG)
static inline int debugger_trap_entry(
unsigned int vector, struct xen_regs *regs)
{
- int ret = 0;
+ struct exec_domain *ed = current;
+ if ( !KERNEL_MODE(ed, regs) || (ed->domain->id == 0) )
+ return 0;
+
switch ( vector )
{
- case TRAP_debug:
- if ( pdb_initialized )
- {
- pdb_handle_debug_trap(regs, regs->error_code);
- ret = 1; /* early exit */
- }
- break;
-
case TRAP_int3:
- if ( pdb_initialized && (pdb_handle_exception(vector, regs) == 0) )
- ret = 1; /* early exit */
- break;
-
- case TRAP_gp_fault:
- if ( (VM86_MODE(regs) || !RING_0(regs)) &&
- ((regs->error_code & 3) == 2) &&
- pdb_initialized && (pdb_ctx.system_call != 0) )
- {
- unsigned long cr3 = read_cr3();
- if ( cr3 == pdb_ctx.ptbr )
- pdb_linux_syscall_enter_bkpt(
- regs, regs->error_code,
- current->thread.traps + (regs->error_code>>3));
- }
- break;
- }
-
- return ret;
-}
-
-static inline int debugger_trap_fatal(
- unsigned int vector, struct xen_regs *regs)
-{
- int ret = 0;
-
- switch ( vector )
- {
- case TRAP_page_fault:
- 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;
- ret = 1; /* exit - do not crash! */
- }
- break;
+ case TRAP_debug:
+ set_bit(EDF_CTRLPAUSE, &ed->ed_flags);
+ raise_softirq(SCHEDULE_SOFTIRQ);
+ return 1;
}
- return ret;
+ return 0;
}
-#define debugger_trap_immediate() ()
-
-#elif defined(CRASH_DEBUG)
+#define debugger_trap_fatal(_v, _r) (0)
+#define debugger_trap_immediate()
-extern int __trap_to_cdb(struct xen_regs *r);
-#define debugger_trap_entry(_v, _r) (0)
-#define debugger_trap_fatal(_v, _r) __trap_to_cdb(_r)
-#define debugger_trap_immediate() call_with_registers(__trap_to_cdb)
#elif 0