on stack overflow.
Signed-off-by: Keir Fraser <keir@xensource.com>
show_trace(regs);
}
+void show_stack_overflow(unsigned long esp)
+{
+#ifdef MEMORY_GUARD
+ unsigned long esp_top = get_stack_bottom() & PAGE_MASK;
+ unsigned long *stack, addr;
+
+ /* Trigger overflow trace if %esp is within 100 bytes of the guard page. */
+ if ( ((esp - esp_top) > 100) && ((esp_top - esp) > 100) )
+ return;
+
+ if ( esp < esp_top )
+ esp = esp_top;
+
+ printk("Xen stack overflow:\n ");
+
+ stack = (unsigned long *)esp;
+ while ( ((long)stack & (STACK_SIZE-BYTES_PER_LONG)) != 0 )
+ {
+ addr = *stack++;
+ if ( is_kernel_text(addr) )
+ {
+ printk("%p: [<%p>]", stack, _p(addr));
+ print_symbol(" %s\n ", addr);
+ }
+ }
+
+ printk("\n");
+#endif
+}
+
/*
* This is called for faults at very unexpected times (e.g., when interrupts
* are disabled). In such situations we can't do much that is safe. We try to
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);
printk("************************************\n");
printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu);
printk("System needs manual reset.\n");
#include <public/callback.h>
-void show_registers(struct cpu_user_regs *regs)
+static void __show_registers(struct cpu_user_regs *regs)
{
struct cpu_user_regs fault_regs = *regs;
unsigned long fault_crs[8];
"ss: %04x cs: %04x\n",
fault_regs.ds, fault_regs.es, fault_regs.fs,
fault_regs.gs, fault_regs.ss, fault_regs.cs);
+}
+void show_registers(struct cpu_user_regs *regs)
+{
+ __show_registers(regs);
show_stack(regs);
}
/* Find information saved during fault and dump it to the console. */
printk("************************************\n");
- show_registers(regs);
+ __show_registers(regs);
+ show_stack_overflow(regs->rsp);
printk("************************************\n");
printk("CPU%d DOUBLE FAULT -- system shutdown\n", smp_processor_id());
printk("System needs manual reset.\n");
#endif
void show_stack(struct cpu_user_regs *regs);
+void show_stack_overflow(unsigned long esp);
void show_registers(struct cpu_user_regs *regs);
void show_page_walk(unsigned long addr);
asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs);