diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-03-25 13:46:20 +0000 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-03-25 13:46:20 +0000 |
commit | a4c76ef233839681c107a29073ee3815fc9829f8 (patch) | |
tree | 3507111551c071fca504b4975e930bec1c3ce172 /xen/include/asm-x86/debugger.h | |
parent | 8dc1edbaf79cf9df4fc1275203909caf91cc503e (diff) | |
download | xen-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.h | 76 |
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 |