Commit a343c75d authored by H. Peter Anvin's avatar H. Peter Anvin

x86: use kernel_stack_pointer() in dumpstack.c

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: default avatarH. Peter Anvin <hpa@zytor.com>
parent def3c5d0
...@@ -268,11 +268,12 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err) ...@@ -268,11 +268,12 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
show_registers(regs); show_registers(regs);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
sp = (unsigned long) (&regs->sp); if (user_mode_vm(regs)) {
savesegment(ss, ss);
if (user_mode(regs)) {
sp = regs->sp; sp = regs->sp;
ss = regs->ss & 0xffff; ss = regs->ss & 0xffff;
} else {
sp = kernel_stack_pointer(regs);
savesegment(ss, ss);
} }
printk(KERN_EMERG "EIP: [<%08lx>] ", regs->ip); printk(KERN_EMERG "EIP: [<%08lx>] ", regs->ip);
print_symbol("%s", regs->ip); print_symbol("%s", regs->ip);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment