From: Ian.Campbell@xensource.com Date: Fri, 13 Jan 2006 16:56:09 +0000 (+0000) Subject: Correctly handle dumping a VM86 guest's stack. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16541^2~41 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=0828aa84f798e1553348322962f73a843ecdfb8c;p=xen.git 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 --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 93b11e36c1..0a7280fb70 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -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++ ) {