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: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
parent
def3c5d0a3
commit
a343c75d33
|
@ -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) (®s->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);
|
||||||
|
|
Loading…
Reference in New Issue