|
@@ -365,6 +365,9 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|
|
|
|
|
if (++die.lock_owner_depth < 3) {
|
|
if (++die.lock_owner_depth < 3) {
|
|
int nl = 0;
|
|
int nl = 0;
|
|
|
|
+ unsigned long esp;
|
|
|
|
+ unsigned short ss;
|
|
|
|
+
|
|
handle_BUG(regs);
|
|
handle_BUG(regs);
|
|
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
|
|
printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
|
|
#ifdef CONFIG_PREEMPT
|
|
#ifdef CONFIG_PREEMPT
|
|
@@ -387,8 +390,19 @@ void die(const char * str, struct pt_regs * regs, long err)
|
|
printk("\n");
|
|
printk("\n");
|
|
if (notify_die(DIE_OOPS, str, regs, err,
|
|
if (notify_die(DIE_OOPS, str, regs, err,
|
|
current->thread.trap_no, SIGSEGV) !=
|
|
current->thread.trap_no, SIGSEGV) !=
|
|
- NOTIFY_STOP)
|
|
|
|
|
|
+ NOTIFY_STOP) {
|
|
show_registers(regs);
|
|
show_registers(regs);
|
|
|
|
+ /* Executive summary in case the oops scrolled away */
|
|
|
|
+ esp = (unsigned long) (®s->esp);
|
|
|
|
+ savesegment(ss, ss);
|
|
|
|
+ if (user_mode(regs)) {
|
|
|
|
+ esp = regs->esp;
|
|
|
|
+ ss = regs->xss & 0xffff;
|
|
|
|
+ }
|
|
|
|
+ printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
|
|
|
|
+ print_symbol("%s", regs->eip);
|
|
|
|
+ printk(" SS:ESP %04x:%08lx\n", ss, esp);
|
|
|
|
+ }
|
|
else
|
|
else
|
|
regs = NULL;
|
|
regs = NULL;
|
|
} else
|
|
} else
|