aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/dumpstack_64.c
diff options
context:
space:
mode:
authorAlexander van Heukelum <heukelum@fastmail.fm>2008-10-22 06:00:09 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-22 08:00:23 -0400
commit874d93d11823b2b861addac6a5dc31162e924ab2 (patch)
tree6d84df0b35ca810ea5871be766934b0b20ad70b7 /arch/x86/kernel/dumpstack_64.c
parentb4b8f87bf4958cbad620654efc0882ac46c19846 (diff)
x86, dumpstack: let signr=0 signal no do_exit
Change oops_end such that signr=0 signals that do_exit is not to be called. Currently, each use of __die is soon followed by a call to oops_end and 'regs' is set to NULL if oops_end is expected not to call do_exit. Change all such pairs to set signr=0 instead. On x86_64 oops_end is used 'bare' in die_nmi; use signr=0 instead of regs=NULL there, too. Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/dumpstack_64.c')
-rw-r--r--arch/x86/kernel/dumpstack_64.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c
index 96a5db7da8a..ffefea611ba 100644
--- a/arch/x86/kernel/dumpstack_64.c
+++ b/arch/x86/kernel/dumpstack_64.c
@@ -465,7 +465,7 @@ void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr)
465 /* Nest count reaches zero, release the lock. */ 465 /* Nest count reaches zero, release the lock. */
466 __raw_spin_unlock(&die_lock); 466 __raw_spin_unlock(&die_lock);
467 raw_local_irq_restore(flags); 467 raw_local_irq_restore(flags);
468 if (!regs) { 468 if (!signr) {
469 oops_exit(); 469 oops_exit();
470 return; 470 return;
471 } 471 }
@@ -509,13 +509,14 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)
509void die(const char *str, struct pt_regs *regs, long err) 509void die(const char *str, struct pt_regs *regs, long err)
510{ 510{
511 unsigned long flags = oops_begin(); 511 unsigned long flags = oops_begin();
512 int sig = SIGSEGV;
512 513
513 if (!user_mode(regs)) 514 if (!user_mode(regs))
514 report_bug(regs->ip, regs); 515 report_bug(regs->ip, regs);
515 516
516 if (__die(str, regs, err)) 517 if (__die(str, regs, err))
517 regs = NULL; 518 sig = 0;
518 oops_end(flags, regs, SIGSEGV); 519 oops_end(flags, regs, sig);
519} 520}
520 521
521notrace __kprobes void 522notrace __kprobes void
@@ -539,7 +540,7 @@ die_nmi(char *str, struct pt_regs *regs, int do_panic)
539 crash_kexec(regs); 540 crash_kexec(regs);
540 if (do_panic || panic_on_oops) 541 if (do_panic || panic_on_oops)
541 panic("Non maskable interrupt"); 542 panic("Non maskable interrupt");
542 oops_end(flags, NULL, SIGBUS); 543 oops_end(flags, regs, 0);
543 nmi_exit(); 544 nmi_exit();
544 local_irq_enable(); 545 local_irq_enable();
545 do_exit(SIGBUS); 546 do_exit(SIGBUS);