diff options
author | Alexander van Heukelum <heukelum@fastmail.fm> | 2008-07-10 15:14:52 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-18 10:21:17 -0400 |
commit | 78cbac65fd77242f3e5d77f4d7a71e8bc869fe4d (patch) | |
tree | 8ada810cc1f2f1f26644f6517b7f131fdb130c5d | |
parent | 5b664cb235e97afbf34db9c4d77f08ebd725335e (diff) |
x86: traps_xx: refactor die() like in x86_64
Make the diff between the traps_32.c and traps_64.c a bit smaller.
Change traps_32.c to look more like traps_64.c:
- move lock information to file scope
- split out oops_begin() and oops_end() from die()
- increment nest counter in oops_begin
Only whitespace change in traps_64.c
No functional changes intended.
Signed-off-by: Alexander van Heukelum <heukelum@fastmail.fm>
Acked-by: Cyrill Gorcunov <gorcunov@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/kernel/traps_32.c | 95 | ||||
-rw-r--r-- | arch/x86/kernel/traps_64.c | 2 |
2 files changed, 52 insertions, 45 deletions
diff --git a/arch/x86/kernel/traps_32.c b/arch/x86/kernel/traps_32.c index 8a768973c4f0..51cccde376a5 100644 --- a/arch/x86/kernel/traps_32.c +++ b/arch/x86/kernel/traps_32.c | |||
@@ -383,6 +383,54 @@ int is_valid_bugaddr(unsigned long ip) | |||
383 | return ud2 == 0x0b0f; | 383 | return ud2 == 0x0b0f; |
384 | } | 384 | } |
385 | 385 | ||
386 | static raw_spinlock_t die_lock = __RAW_SPIN_LOCK_UNLOCKED; | ||
387 | static int die_owner = -1; | ||
388 | static unsigned int die_nest_count; | ||
389 | |||
390 | unsigned __kprobes long oops_begin(void) | ||
391 | { | ||
392 | unsigned long flags; | ||
393 | |||
394 | oops_enter(); | ||
395 | |||
396 | if (die_owner != raw_smp_processor_id()) { | ||
397 | console_verbose(); | ||
398 | raw_local_irq_save(flags); | ||
399 | __raw_spin_lock(&die_lock); | ||
400 | die_owner = smp_processor_id(); | ||
401 | die_nest_count = 0; | ||
402 | bust_spinlocks(1); | ||
403 | } else { | ||
404 | raw_local_irq_save(flags); | ||
405 | } | ||
406 | die_nest_count++; | ||
407 | return flags; | ||
408 | } | ||
409 | |||
410 | void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr) | ||
411 | { | ||
412 | bust_spinlocks(0); | ||
413 | die_owner = -1; | ||
414 | add_taint(TAINT_DIE); | ||
415 | __raw_spin_unlock(&die_lock); | ||
416 | raw_local_irq_restore(flags); | ||
417 | |||
418 | if (!regs) | ||
419 | return; | ||
420 | |||
421 | if (kexec_should_crash(current)) | ||
422 | crash_kexec(regs); | ||
423 | |||
424 | if (in_interrupt()) | ||
425 | panic("Fatal exception in interrupt"); | ||
426 | |||
427 | if (panic_on_oops) | ||
428 | panic("Fatal exception"); | ||
429 | |||
430 | oops_exit(); | ||
431 | do_exit(signr); | ||
432 | } | ||
433 | |||
386 | int __kprobes __die(const char *str, struct pt_regs *regs, long err) | 434 | int __kprobes __die(const char *str, struct pt_regs *regs, long err) |
387 | { | 435 | { |
388 | unsigned short ss; | 436 | unsigned short ss; |
@@ -423,31 +471,9 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err) | |||
423 | */ | 471 | */ |
424 | void die(const char *str, struct pt_regs *regs, long err) | 472 | void die(const char *str, struct pt_regs *regs, long err) |
425 | { | 473 | { |
426 | static struct { | 474 | unsigned long flags = oops_begin(); |
427 | raw_spinlock_t lock; | ||
428 | u32 lock_owner; | ||
429 | int lock_owner_depth; | ||
430 | } die = { | ||
431 | .lock = __RAW_SPIN_LOCK_UNLOCKED, | ||
432 | .lock_owner = -1, | ||
433 | .lock_owner_depth = 0 | ||
434 | }; | ||
435 | unsigned long flags; | ||
436 | |||
437 | oops_enter(); | ||
438 | |||
439 | if (die.lock_owner != raw_smp_processor_id()) { | ||
440 | console_verbose(); | ||
441 | raw_local_irq_save(flags); | ||
442 | __raw_spin_lock(&die.lock); | ||
443 | die.lock_owner = smp_processor_id(); | ||
444 | die.lock_owner_depth = 0; | ||
445 | bust_spinlocks(1); | ||
446 | } else { | ||
447 | raw_local_irq_save(flags); | ||
448 | } | ||
449 | 475 | ||
450 | if (++die.lock_owner_depth < 3) { | 476 | if (die_nest_count < 3) { |
451 | report_bug(regs->ip, regs); | 477 | report_bug(regs->ip, regs); |
452 | 478 | ||
453 | if (__die(str, regs, err)) | 479 | if (__die(str, regs, err)) |
@@ -456,26 +482,7 @@ void die(const char *str, struct pt_regs *regs, long err) | |||
456 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); | 482 | printk(KERN_EMERG "Recursive die() failure, output suppressed\n"); |
457 | } | 483 | } |
458 | 484 | ||
459 | bust_spinlocks(0); | 485 | oops_end(flags, regs, SIGSEGV); |
460 | die.lock_owner = -1; | ||
461 | add_taint(TAINT_DIE); | ||
462 | __raw_spin_unlock(&die.lock); | ||
463 | raw_local_irq_restore(flags); | ||
464 | |||
465 | if (!regs) | ||
466 | return; | ||
467 | |||
468 | if (kexec_should_crash(current)) | ||
469 | crash_kexec(regs); | ||
470 | |||
471 | if (in_interrupt()) | ||
472 | panic("Fatal exception in interrupt"); | ||
473 | |||
474 | if (panic_on_oops) | ||
475 | panic("Fatal exception"); | ||
476 | |||
477 | oops_exit(); | ||
478 | do_exit(SIGSEGV); | ||
479 | } | 486 | } |
480 | 487 | ||
481 | static inline void | 488 | static inline void |
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 2696a6837782..babdbe673b7f 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
@@ -518,7 +518,7 @@ unsigned __kprobes long oops_begin(void) | |||
518 | } | 518 | } |
519 | 519 | ||
520 | void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr) | 520 | void __kprobes oops_end(unsigned long flags, struct pt_regs *regs, int signr) |
521 | { | 521 | { |
522 | die_owner = -1; | 522 | die_owner = -1; |
523 | bust_spinlocks(0); | 523 | bust_spinlocks(0); |
524 | die_nest_count--; | 524 | die_nest_count--; |