diff options
author | Alexander van Heukelum <heukelum@fastmail.fm> | 2008-10-22 06:00:09 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-22 08:00:23 -0400 |
commit | 874d93d11823b2b861addac6a5dc31162e924ab2 (patch) | |
tree | 6d84df0b35ca810ea5871be766934b0b20ad70b7 /arch/x86/kernel/dumpstack_64.c | |
parent | b4b8f87bf4958cbad620654efc0882ac46c19846 (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.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 96a5db7da8a7..ffefea611ba3 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) | |||
509 | void die(const char *str, struct pt_regs *regs, long err) | 509 | void 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 | ||
521 | notrace __kprobes void | 522 | notrace __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); |