x86: use kernel_stack_pointer() in kgdb.c
authorH. Peter Anvin <hpa@zytor.com>
Mon, 12 Oct 2009 21:12:18 +0000 (14:12 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 12 Oct 2009 21:19:35 +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.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: Jason Wessel <jason.wessel@windriver.com>
arch/x86/kernel/kgdb.c

index 8d82a77a3f3b96ea3c0dc37e91551dddc7e10b51..3310d849abd2989d4f5e1199c7f77e1d94ec4882 100644 (file)
@@ -88,7 +88,6 @@ void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
        gdb_regs[GDB_SS]        = __KERNEL_DS;
        gdb_regs[GDB_FS]        = 0xFFFF;
        gdb_regs[GDB_GS]        = 0xFFFF;
-       gdb_regs[GDB_SP]        = (int)&regs->sp;
 #else
        gdb_regs[GDB_R8]        = regs->r8;
        gdb_regs[GDB_R9]        = regs->r9;
@@ -101,8 +100,8 @@ void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
        gdb_regs32[GDB_PS]      = regs->flags;
        gdb_regs32[GDB_CS]      = regs->cs;
        gdb_regs32[GDB_SS]      = regs->ss;
-       gdb_regs[GDB_SP]        = regs->sp;
 #endif
+       gdb_regs[GDB_SP]        = kernel_stack_pointer(regs);
 }
 
 /**