aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2006-01-11 16:42:17 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-11 22:01:10 -0500
commiteca37c18beb306dd9dea4579d7214e1b4414b3fb (patch)
treef74aecdd6f793dd01901220e4a09e82c021d7028 /arch
parent6e3f361781573a27296c77a79c9892dec8f2e36c (diff)
[PATCH] x86_64: Clean up double fault handling
Since a double fault always implies that kernel data structures are corrupt, this fault should neither be handed to user mode handling, nor should the handler allow resuming the faulting code stream (since architecturally this isn't a fault, but an abort). Note that this slightly depends on the previously submitted patch adjusting the prototype of notify_die() (a compiler warning will result without that other patch). AK: Removed obsolete CONFIG_CHECKING code, added comments Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/kernel/traps.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c
index 0266b523e8d0..bd71ddac0dc5 100644
--- a/arch/x86_64/kernel/traps.c
+++ b/arch/x86_64/kernel/traps.c
@@ -489,7 +489,23 @@ DO_ERROR(11, SIGBUS, "segment not present", segment_not_present)
489DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0) 489DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
490DO_ERROR(18, SIGSEGV, "reserved", reserved) 490DO_ERROR(18, SIGSEGV, "reserved", reserved)
491DO_ERROR(12, SIGBUS, "stack segment", stack_segment) 491DO_ERROR(12, SIGBUS, "stack segment", stack_segment)
492DO_ERROR( 8, SIGSEGV, "double fault", double_fault) 492
493asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
494{
495 static const char str[] = "double fault";
496 struct task_struct *tsk = current;
497
498 /* Return not checked because double check cannot be ignored */
499 notify_die(DIE_TRAP, str, regs, error_code, 8, SIGSEGV);
500
501 tsk->thread.error_code = error_code;
502 tsk->thread.trap_no = 8;
503
504 /* This is always a kernel trap and never fixable (and thus must
505 never return). */
506 for (;;)
507 die(str, regs, error_code);
508}
493 509
494asmlinkage void __kprobes do_general_protection(struct pt_regs * regs, 510asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
495 long error_code) 511 long error_code)