diff options
author | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-02 11:50:06 +0100 |
---|---|---|
committer | kfraser@localhost.localdomain <kfraser@localhost.localdomain> | 2007-04-02 11:50:06 +0100 |
commit | 011623229a3113e12f6fcaf61a720d266368c1e7 (patch) | |
tree | 5730d04d9314c91c357f45b684965f85592b6669 | |
parent | 75ba97629bb0294ff16a8b690b2eff3f96c51707 (diff) | |
download | xen-011623229a3113e12f6fcaf61a720d266368c1e7.tar.gz xen-011623229a3113e12f6fcaf61a720d266368c1e7.tar.bz2 xen-011623229a3113e12f6fcaf61a720d266368c1e7.zip |
xen: Extra %esp tracing on double fault.
Signed-off-by: Keir Fraser <keir@xensource.com>
-rw-r--r-- | xen/arch/x86/traps.c | 17 | ||||
-rw-r--r-- | xen/arch/x86/x86_32/traps.c | 2 | ||||
-rw-r--r-- | xen/arch/x86/x86_64/traps.c | 2 | ||||
-rw-r--r-- | xen/include/asm-x86/processor.h | 2 |
4 files changed, 16 insertions, 7 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 99a332b874..45dbed485d 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -285,23 +285,32 @@ void show_xen_trace() show_trace(®s); } -void show_stack_overflow(unsigned long esp) +void show_stack_overflow(unsigned int cpu, unsigned long esp) { #ifdef MEMORY_GUARD - unsigned long esp_top; + unsigned long esp_top, esp_bottom; unsigned long *stack, addr; - esp_top = (esp | (STACK_SIZE - 1)) - (DEBUG_STACK_SIZE - 1); + esp_bottom = (esp | (STACK_SIZE - 1)) + 1; + esp_top = esp_bottom - DEBUG_STACK_SIZE; + + printk("Valid stack range: %p-%p, sp=%p, tss.esp0=%p\n", + (void *)esp_top, (void *)esp_bottom, (void *)esp, + (void *)init_tss[cpu].esp0); /* Trigger overflow trace if %esp is within 512 bytes of the guard page. */ if ( ((unsigned long)(esp - esp_top) > 512) && ((unsigned long)(esp_top - esp) > 512) ) + { + printk("No stack overflow detected. Skipping stack trace.\n"); return; + } if ( esp < esp_top ) esp = esp_top; - printk("Xen stack overflow:\n "); + printk("Xen stack overflow (dumping trace %p-%p):\n ", + (void *)esp, (void *)esp_bottom); stack = (unsigned long *)esp; while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 ) diff --git a/xen/arch/x86/x86_32/traps.c b/xen/arch/x86/x86_32/traps.c index da8ca6bf5c..c0f1473737 100644 --- a/xen/arch/x86/x86_32/traps.c +++ b/xen/arch/x86/x86_32/traps.c @@ -167,7 +167,7 @@ asmlinkage void do_double_fault(void) tss->esi, tss->edi, tss->ebp, tss->esp); printk("ds: %04x es: %04x fs: %04x gs: %04x ss: %04x\n", tss->ds, tss->es, tss->fs, tss->gs, tss->ss); - show_stack_overflow(tss->esp); + show_stack_overflow(cpu, tss->esp); panic("DOUBLE FAULT -- system shutdown\n"); } diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 9e4502e934..af1429ac56 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -171,7 +171,7 @@ asmlinkage void do_double_fault(struct cpu_user_regs *regs) printk("r12: %016lx r13: %016lx r14: %016lx\n", regs->r12, regs->r13, regs->r14); printk("r15: %016lx\n", regs->r15); - show_stack_overflow(regs->rsp); + show_stack_overflow(cpu, regs->rsp); panic("DOUBLE FAULT -- system shutdown\n"); } diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index a878d86303..4c28e48414 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -553,7 +553,7 @@ extern always_inline void prefetchw(const void *x) void show_stack(struct cpu_user_regs *regs); void show_xen_trace(void); -void show_stack_overflow(unsigned long esp); +void show_stack_overflow(unsigned int cpu, unsigned long esp); void show_registers(struct cpu_user_regs *regs); void show_execution_state(struct cpu_user_regs *regs); void show_page_walk(unsigned long addr); |