Commit 1cc99544 authored by Ingo Molnar's avatar Ingo Molnar

x86, mm: fault.c, unify oops handling

Impact: add oops-recursion check to 32-bit

Unify the oops state-machine, to the 64-bit version. It is
slightly more careful in that it does a recursion check
in oops_begin(), and is thus more likely to show the relevant
oops.

It also means that 32-bit will print one more line at the
end of pagefault triggered oopses:

 	printk(KERN_EMERG "CR2: %016lx\n", address);

Which is generally good information to be seen in partial-dump
digital-camera jpegs ;-)

The downside is the somewhat more complex critical path. Both
variants have been tested well meanwhile by kernel developers
crashing their boxes so i dont think this is a practical worry.

This removes 3 ugly #ifdefs from no_context() and makes the
function a lot nicer read.

Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 8f766149
...@@ -659,11 +659,8 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -659,11 +659,8 @@ no_context(struct pt_regs *regs, unsigned long error_code,
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
unsigned long *stackend; unsigned long *stackend;
#ifdef CONFIG_X86_64
unsigned long flags; unsigned long flags;
int sig; int sig;
#endif
/* Are we prepared to handle this kernel fault? */ /* Are we prepared to handle this kernel fault? */
if (fixup_exception(regs)) if (fixup_exception(regs))
...@@ -690,11 +687,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -690,11 +687,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
* Oops. The kernel tried to access some bad page. We'll have to * Oops. The kernel tried to access some bad page. We'll have to
* terminate things with extreme prejudice: * terminate things with extreme prejudice:
*/ */
#ifdef CONFIG_X86_32
bust_spinlocks(1);
#else
flags = oops_begin(); flags = oops_begin();
#endif
show_fault_oops(regs, error_code, address); show_fault_oops(regs, error_code, address);
...@@ -702,15 +695,10 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -702,15 +695,10 @@ no_context(struct pt_regs *regs, unsigned long error_code,
if (*stackend != STACK_END_MAGIC) if (*stackend != STACK_END_MAGIC)
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
tsk->thread.cr2 = address; tsk->thread.cr2 = address;
tsk->thread.trap_no = 14; tsk->thread.trap_no = 14;
tsk->thread.error_code = error_code; tsk->thread.error_code = error_code;
#ifdef CONFIG_X86_32
die("Oops", regs, error_code);
bust_spinlocks(0);
do_exit(SIGKILL);
#else
sig = SIGKILL; sig = SIGKILL;
if (__die("Oops", regs, error_code)) if (__die("Oops", regs, error_code))
sig = 0; sig = 0;
...@@ -719,7 +707,6 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -719,7 +707,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
printk(KERN_EMERG "CR2: %016lx\n", address); printk(KERN_EMERG "CR2: %016lx\n", address);
oops_end(flags, regs, sig); oops_end(flags, regs, sig);
#endif
} }
/* /*
......
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