# HG changeset patch # User Ian.Campbell@xensource.com # Date 1137171369 0 # Node ID 3f702887d4a62931182392c07436dcdba93a77ea # Parent c1840ac1f05d32fb6c4b39253b53c301167c2e75 Correctly handle dumping a VM86 guest's stack. If the guest context is VM86 then we need to treat ss:sp as 16 bit segment:offset rather than 32 bit selector:offset. Signed-off-by: Ian Campbell diff -r c1840ac1f05d -r 3f702887d4a6 xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Fri Jan 13 16:44:04 2006 +0100 +++ b/xen/arch/x86/traps.c Fri Jan 13 16:56:09 2006 +0000 @@ -130,9 +130,19 @@ unsigned long kernel_text_end(void) static void show_guest_stack(struct cpu_user_regs *regs) { int i; - unsigned long *stack = (unsigned long *)regs->esp, addr; + unsigned long *stack, addr; - printk("Guest stack trace from "__OP"sp=%p:\n ", stack); + if ( VM86_MODE(regs) ) + { + stack = (unsigned long *)((regs->ss << 4) + (regs->esp & 0xffff)); + printk("Guest stack trace from ss:sp = %04x:%04x (VM86)\n ", + regs->ss, (uint16_t)(regs->esp & 0xffff)); + } + else + { + stack = (unsigned long *)regs->esp; + printk("Guest stack trace from "__OP"sp=%p:\n ", stack); + } for ( i = 0; i < (debug_stack_lines*stack_words_per_line); i++ ) {