[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Manual merge.
ChangeSet 1.1719, 2005/06/10 15:38:22+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx Manual merge. traps.c | 1182 +++++++++++++++++++++++++++++++++++++++------------------------- 1 files changed, 732 insertions(+), 450 deletions(-) diff -Nru a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c 2005-06-10 11:03:47 -04:00 +++ b/xen/arch/x86/traps.c 2005-06-10 11:03:47 -04:00 @@ -1,5 +1,5 @@ /****************************************************************************** - * arch/i386/traps.c + * arch/x86/traps.c * * Modifications to Linux original are copyright (c) 2002-2004, K A Fraser * @@ -39,8 +39,8 @@ #include <xen/irq.h> #include <xen/perfc.h> #include <xen/softirq.h> +#include <xen/domain_page.h> #include <asm/shadow.h> -#include <asm/domain_page.h> #include <asm/system.h> #include <asm/io.h> #include <asm/atomic.h> @@ -51,6 +51,8 @@ #include <asm/uaccess.h> #include <asm/i387.h> #include <asm/debugger.h> +#include <asm/msr.h> +#include <asm/x86_emulate.h> /* * opt_nmi: one of 'ignore', 'dom0', or 'fatal'. @@ -65,45 +67,39 @@ #endif string_param("nmi", opt_nmi); -#if defined(__i386__) - -#define GUEST_FAULT(_r) (likely(VM86_MODE(_r) || !RING_0(_r))) - -#define DOUBLEFAULT_STACK_SIZE 1024 -static struct tss_struct doublefault_tss; -static unsigned char doublefault_stack[DOUBLEFAULT_STACK_SIZE]; +/* Master table, used by all CPUs on x86/64, and by CPU0 on x86/32.*/ +idt_entry_t idt_table[IDT_ENTRIES]; -asmlinkage int hypercall(void); +#define DECLARE_TRAP_HANDLER(_name) \ +asmlinkage void _name(void); \ +asmlinkage int do_ ## _name(struct cpu_user_regs *regs) -/* Master table, and the one used by CPU0. */ -struct desc_struct idt_table[256] = { {0, 0}, }; -/* All other CPUs have their own copy. */ -struct desc_struct *idt_tables[NR_CPUS] = { 0 }; - -asmlinkage void divide_error(void); -asmlinkage void debug(void); asmlinkage void nmi(void); -asmlinkage void int3(void); -asmlinkage void overflow(void); -asmlinkage void bounds(void); -asmlinkage void invalid_op(void); -asmlinkage void device_not_available(void); -asmlinkage void coprocessor_segment_overrun(void); -asmlinkage void invalid_TSS(void); -asmlinkage void segment_not_present(void); -asmlinkage void stack_segment(void); -asmlinkage void general_protection(void); -asmlinkage void page_fault(void); -asmlinkage void coprocessor_error(void); -asmlinkage void simd_coprocessor_error(void); -asmlinkage void alignment_check(void); -asmlinkage void spurious_interrupt_bug(void); -asmlinkage void machine_check(void); +DECLARE_TRAP_HANDLER(divide_error); +DECLARE_TRAP_HANDLER(debug); +DECLARE_TRAP_HANDLER(int3); +DECLARE_TRAP_HANDLER(overflow); +DECLARE_TRAP_HANDLER(bounds); +DECLARE_TRAP_HANDLER(invalid_op); +DECLARE_TRAP_HANDLER(device_not_available); +DECLARE_TRAP_HANDLER(coprocessor_segment_overrun); +DECLARE_TRAP_HANDLER(invalid_TSS); +DECLARE_TRAP_HANDLER(segment_not_present); +DECLARE_TRAP_HANDLER(stack_segment); +DECLARE_TRAP_HANDLER(general_protection); +DECLARE_TRAP_HANDLER(page_fault); +DECLARE_TRAP_HANDLER(coprocessor_error); +DECLARE_TRAP_HANDLER(simd_coprocessor_error); +DECLARE_TRAP_HANDLER(alignment_check); +DECLARE_TRAP_HANDLER(spurious_interrupt_bug); +DECLARE_TRAP_HANDLER(machine_check); -int kstack_depth_to_print = 8*20; +static int debug_stack_lines = 20; +integer_param("debug_stack_lines", debug_stack_lines); static inline int kernel_text_address(unsigned long addr) { + extern char _stext, _etext; if (addr >= (unsigned long) &_stext && addr <= (unsigned long) &_etext) return 1; @@ -111,111 +107,91 @@ } -void show_guest_stack() +void show_guest_stack(void) { int i; - execution_context_t *ec = get_execution_context(); - unsigned long *stack = (unsigned long *)ec->esp; - printk("Guest EIP is %lx\n",ec->eip); + struct cpu_user_regs *regs = guest_cpu_user_regs(); + unsigned long *stack = (unsigned long *)regs->esp, addr; + + printk("Guest stack trace from "__OP"sp=%p:\n ", stack); - for ( i = 0; i < kstack_depth_to_print; i++ ) + for ( i = 0; i < (debug_stack_lines*8); i++ ) { if ( ((long)stack & (STACK_SIZE-1)) == 0 ) break; - if ( i && ((i % 8) == 0) ) - printk("\n "); - printk("%08lx ", *stack++); + if ( get_user(addr, stack) ) + { + if ( i != 0 ) + printk("\n "); + printk("Fault while accessing guest memory."); + i = 1; + break; + } + if ( (i != 0) && ((i % 8) == 0) ) + printk("\n "); + printk("%p ", _p(addr)); + stack++; } + if ( i == 0 ) + printk("Stack empty."); printk("\n"); - } void show_trace(unsigned long *esp) { - unsigned long *stack, addr; - int i; + unsigned long *stack = esp, addr; + int i = 0; + + printk("Xen call trace from "__OP"sp=%p:\n ", stack); - printk("Call Trace from ESP=%p: ", esp); - stack = esp; - i = 0; - while (((long) stack & (STACK_SIZE-1)) != 0) { + while ( ((long) stack & (STACK_SIZE-1)) != 0 ) + { addr = *stack++; - if (kernel_text_address(addr)) { - if (i && ((i % 6) == 0)) + if ( kernel_text_address(addr) ) + { + if ( (i != 0) && ((i % 6) == 0) ) printk("\n "); - printk("[<%08lx>] ", addr); + printk("[<%p>] ", _p(addr)); i++; } } + if ( i == 0 ) + printk("Trace empty."); printk("\n"); } void show_stack(unsigned long *esp) { - unsigned long *stack; + unsigned long *stack = esp, addr; int i; - printk("Stack trace from ESP=%p:\n", esp); + printk("Xen stack trace from "__OP"sp=%p:\n ", stack); - stack = esp; - for ( i = 0; i < kstack_depth_to_print; i++ ) + for ( i = 0; i < (debug_stack_lines*8); i++ ) { if ( ((long)stack & (STACK_SIZE-1)) == 0 ) break; - if ( i && ((i % 8) == 0) ) - printk("\n "); - if ( kernel_text_address(*stack) ) - printk("[%08lx] ", *stack++); + if ( (i != 0) && ((i % 8) == 0) ) + printk("\n "); + addr = *stack++; + if ( kernel_text_address(addr) ) + printk("[%p] ", _p(addr)); else - printk("%08lx ", *stack++); + printk("%p ", _p(addr)); } + if ( i == 0 ) + printk("Stack empty."); printk("\n"); - show_trace( esp ); + show_trace(esp); } -void show_registers(struct xen_regs *regs) -{ - unsigned long esp; - unsigned short ss, ds, es, fs, gs; - - if ( GUEST_FAULT(regs) ) - { - esp = regs->esp; - ss = regs->ss & 0xffff; - ds = regs->ds & 0xffff; - es = regs->es & 0xffff; - fs = regs->fs & 0xffff; - gs = regs->gs & 0xffff; - } - else - { - esp = (unsigned long)(®s->esp); - ss = __HYPERVISOR_DS; - ds = __HYPERVISOR_DS; - es = __HYPERVISOR_DS; - fs = __HYPERVISOR_DS; - gs = __HYPERVISOR_DS; - } - - printk("CPU: %d\nEIP: %04x:[<%08x>] \nEFLAGS: %08x\n", - smp_processor_id(), 0xffff & regs->cs, regs->eip, regs->eflags); - printk("eax: %08x ebx: %08x ecx: %08x edx: %08x\n", - regs->eax, regs->ebx, regs->ecx, regs->edx); - printk("esi: %08x edi: %08x ebp: %08x esp: %08lx\n", - regs->esi, regs->edi, regs->ebp, esp); - printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", - ds, es, fs, gs, ss); - - show_stack((unsigned long *)®s->esp); -} - /* * This is called for faults at very unexpected times (e.g., when interrupts _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |