|
|
@@ -101,10 +101,16 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
|
|
|
void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
|
|
{
|
|
|
struct stackframe frame;
|
|
|
- int skip;
|
|
|
+ int skip = 0;
|
|
|
|
|
|
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
|
|
|
|
|
|
+ if (regs) {
|
|
|
+ if (user_mode(regs))
|
|
|
+ return;
|
|
|
+ skip = 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (!tsk)
|
|
|
tsk = current;
|
|
|
|
|
|
@@ -125,7 +131,6 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
|
|
frame.graph = tsk->curr_ret_stack;
|
|
|
#endif
|
|
|
|
|
|
- skip = !!regs;
|
|
|
printk("Call trace:\n");
|
|
|
do {
|
|
|
/* skip until specified stack frame */
|
|
|
@@ -175,15 +180,13 @@ static int __die(const char *str, int err, struct pt_regs *regs)
|
|
|
return ret;
|
|
|
|
|
|
print_modules();
|
|
|
- __show_regs(regs);
|
|
|
pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
|
|
|
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
|
|
|
end_of_stack(tsk));
|
|
|
+ show_regs(regs);
|
|
|
|
|
|
- if (!user_mode(regs)) {
|
|
|
- dump_backtrace(regs, tsk);
|
|
|
+ if (!user_mode(regs))
|
|
|
dump_instr(KERN_EMERG, regs);
|
|
|
- }
|
|
|
|
|
|
return ret;
|
|
|
}
|