x86: use kernel_stack_pointer() in dumpstack.c
authorH. Peter Anvin <hpa@zytor.com>
Mon, 12 Oct 2009 21:11:09 +0000 (14:11 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 12 Oct 2009 21:19:34 +0000 (14:19 -0700)
The way to obtain a kernel-mode stack pointer from a struct pt_regs in
32-bit mode is "subtle": the stack doesn't actually contain the stack
pointer, but rather the location where it would have been marks the
actual previous stack frame.  For clarity, use kernel_stack_pointer()
instead of coding this weirdness explicitly.

Furthermore, user_mode() is only valid when the process is known to
not run in V86 mode.  Use the safer user_mode_vm() instead.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/kernel/dumpstack.c

index 2d8a371d43396a61e2afb53f0478ba48634d87ad..b8ce165dde5dc42f4a4b0e8c9a1cc53ade630bfa 100644 (file)
@@ -268,11 +268,12 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
 
        show_registers(regs);
 #ifdef CONFIG_X86_32
-       sp = (unsigned long) (&regs->sp);
-       savesegment(ss, ss);
-       if (user_mode(regs)) {
+       if (user_mode_vm(regs)) {
                sp = regs->sp;
                ss = regs->ss & 0xffff;
+       } else {
+               sp = kernel_stack_pointer(regs);
+               savesegment(ss, ss);
        }
        printk(KERN_EMERG "EIP: [<%08lx>] ", regs->ip);
        print_symbol("%s", regs->ip);