arm64: backtrace: Don't bother trying to unwind the userspace stack
Calling dump_backtrace() with a pt_regs argument corresponding to
userspace doesn't make any sense and our unwinder will simply print
"Call trace:" before unwinding the stack looking for user frames.
Rather than go through this song and dance, just return early if we're
passed a user register state.
Cc: <stable@vger.kernel.org>
Fixes: 1149aad10b
("arm64: Add dump_backtrace() in show_regs")
Reported-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
5a3ae7b314
commit
1e6f5440a6
|
@ -102,10 +102,16 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
|
||||||
void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
struct stackframe frame;
|
struct stackframe frame;
|
||||||
int skip;
|
int skip = 0;
|
||||||
|
|
||||||
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
|
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
|
||||||
|
|
||||||
|
if (regs) {
|
||||||
|
if (user_mode(regs))
|
||||||
|
return;
|
||||||
|
skip = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!tsk)
|
if (!tsk)
|
||||||
tsk = current;
|
tsk = current;
|
||||||
|
|
||||||
|
@ -126,7 +132,6 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||||
frame.graph = 0;
|
frame.graph = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
skip = !!regs;
|
|
||||||
printk("Call trace:\n");
|
printk("Call trace:\n");
|
||||||
do {
|
do {
|
||||||
/* skip until specified stack frame */
|
/* skip until specified stack frame */
|
||||||
|
@ -176,15 +181,13 @@ static int __die(const char *str, int err, struct pt_regs *regs)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
print_modules();
|
print_modules();
|
||||||
__show_regs(regs);
|
|
||||||
pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
|
pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
|
||||||
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
|
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
|
||||||
end_of_stack(tsk));
|
end_of_stack(tsk));
|
||||||
|
show_regs(regs);
|
||||||
|
|
||||||
if (!user_mode(regs)) {
|
if (!user_mode(regs))
|
||||||
dump_backtrace(regs, tsk);
|
|
||||||
dump_instr(KERN_EMERG, regs);
|
dump_instr(KERN_EMERG, regs);
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue