diff -r 14717dedba02 xen/arch/x86/x86_32/traps.c --- a/xen/arch/x86/x86_32/traps.c Sun May 21 19:15:58 2006 +++ b/xen/arch/x86/x86_32/traps.c Tue May 30 15:59:30 2006 @@ -173,6 +173,51 @@ 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); + + { +#define stack_words_per_line 8 + + unsigned long *stack, addr, *lstack; + int words; + + addr = tss->esp; + stack = (void*)addr; + printk("Xen stack trace from "__OP"sp=%p:\n ", stack); + + if ((addr & 0xfff) > 0xf00) { + printk("stack overflow fixup\n"); + while ((addr & 0xfff) > 0xf00) + addr += 4; + stack = (void*)addr; + printk("Xen stack trace from "__OP"sp=%p:\n ", stack); + } + + lstack = NULL; + for (;; stack++) { + if (((long)stack & (STACK_SIZE-BYTES_PER_LONG)) == 0) + break; + addr = *stack; + if (is_kernel_text(addr)) { + printk("\n stack %p, text %p <", stack, _p(addr)); + print_symbol("%s",addr); + printk(">"); + if (lstack) + printk(", frame %d", stack - lstack); + lstack = stack; + printk("\n"); + words = 0; + } else { + if (stack_words_per_line == words) { + printk("\n"); + words = 0; + } + printk(" %p", _p(addr)); + words++; + } + } + printk("\n"); + } + printk("************************************\n"); printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu); printk("System needs manual reset.\n");