[XEN] Do not halt on exceptions-with-interrupts-disabled and double faults.
authorkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sat, 4 Nov 2006 20:13:22 +0000 (20:13 +0000)
committerkaf24@localhost.localdomain <kaf24@localhost.localdomain>
Sat, 4 Nov 2006 20:13:22 +0000 (20:13 +0000)
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/traps.c
xen/arch/x86/x86_32/traps.c
xen/arch/x86/x86_64/traps.c

index 3d8023fc333f5c6141bfde2c8ecf48d1d3dc5177..f9e92f1b511fd7f94aeaca58f36735f0b078d5c1 100644 (file)
@@ -338,7 +338,6 @@ void show_execution_state(struct cpu_user_regs *regs)
  */
 asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs)
 {
-    int cpu = smp_processor_id();
     static char *trapstr[] = { 
         "divide error", "debug", "nmi", "bkpt", "overflow", "bounds", 
         "invalid opcode", "device not available", "double fault", 
@@ -360,20 +359,10 @@ asmlinkage void fatal_trap(int trapnr, struct cpu_user_regs *regs)
         show_page_walk(cr2);
     }
 
-    printk("************************************\n");
-    printk("CPU%d FATAL TRAP %d (%s), ERROR_CODE %04x%s.\n",
-           cpu, trapnr, trapstr[trapnr], regs->error_code,
-           (regs->eflags & X86_EFLAGS_IF) ? "" : ", IN INTERRUPT CONTEXT");
-    printk("System shutting down -- need manual reset.\n");
-    printk("************************************\n");
-
-    (void)debugger_trap_fatal(trapnr, regs);
-
-    /* Lock up the console to prevent spurious output from other CPUs. */
-    console_force_lock();
-
-    /* Wait for manual reset. */
-    machine_halt();
+    panic("FATAL TRAP: vector = %d (%s)\n"
+          "[error_code=%04x] %s\n",
+          trapnr, trapstr[trapnr], regs->error_code,
+          (regs->eflags & X86_EFLAGS_IF) ? "" : ", IN INTERRUPT CONTEXT");
 }
 
 static inline int do_trap(int trapnr, char *str,
@@ -416,9 +405,9 @@ static inline int do_trap(int trapnr, char *str,
     DEBUGGER_trap_fatal(trapnr, regs);
 
     show_execution_state(regs);
-    panic("CPU%d FATAL TRAP: vector = %d (%s)\n"
+    panic("FATAL TRAP: vector = %d (%s)\n"
           "[error_code=%04x]\n",
-          smp_processor_id(), trapnr, str, regs->error_code);
+          trapnr, str, regs->error_code);
     return 0;
 }
 
@@ -630,8 +619,7 @@ asmlinkage int do_invalid_op(struct cpu_user_regs *regs)
         }
         DEBUGGER_trap_fatal(TRAP_invalid_op, regs);
         show_execution_state(regs);
-        panic("CPU%d FATAL TRAP: vector = %d (invalid opcode)\n",
-              smp_processor_id(), TRAP_invalid_op);
+        panic("FATAL TRAP: vector = %d (invalid opcode)\n", TRAP_invalid_op);
     }
 
     if ( (rc = emulate_forced_invalid_op(regs)) != 0 )
@@ -659,7 +647,7 @@ asmlinkage int do_int3(struct cpu_user_regs *regs)
     {
         DEBUGGER_trap_fatal(TRAP_int3, regs);
         show_execution_state(regs);
-        panic("CPU%d FATAL TRAP: vector = 3 (Int3)\n", smp_processor_id());
+        panic("FATAL TRAP: vector = 3 (Int3)\n");
     } 
 
     ti = &current->arch.guest_context.trap_ctxt[TRAP_int3];
@@ -930,10 +918,10 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs)
 
         show_execution_state(regs);
         show_page_walk(addr);
-        panic("CPU%d FATAL PAGE FAULT\n"
+        panic("FATAL PAGE FAULT\n"
               "[error_code=%04x]\n"
               "Faulting linear address: %p\n",
-              smp_processor_id(), regs->error_code, _p(addr));
+              regs->error_code, _p(addr));
     }
 
     propagate_page_fault(addr, regs->error_code);
@@ -1517,8 +1505,7 @@ asmlinkage int do_general_protection(struct cpu_user_regs *regs)
 
  hardware_gp:
     show_execution_state(regs);
-    panic("CPU%d GENERAL PROTECTION FAULT\n[error_code=%04x]\n",
-          smp_processor_id(), regs->error_code);
+    panic("GENERAL PROTECTION FAULT\n[error_code=%04x]\n", regs->error_code);
     return 0;
 }
 
index c83f1774d49ef0a9803c05d22929995ba7b5b697..14a7c30d9364075a7b8b48847e48800e749ba365 100644 (file)
@@ -168,16 +168,8 @@ asmlinkage void do_double_fault(void)
     printk("ds: %04x   es: %04x   fs: %04x   gs: %04x   ss: %04x\n",
            tss->ds, tss->es, tss->fs, tss->gs, tss->ss);
     show_stack_overflow(tss->esp);
-    printk("************************************\n");
-    printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu);
-    printk("System needs manual reset.\n");
-    printk("************************************\n");
 
-    /* Lock up the console to prevent spurious output from other CPUs. */
-    console_force_lock();
-
-    /* Wait for manual reset. */
-    machine_halt();
+    panic("DOUBLE FAULT -- system shutdown\n");
 }
 
 unsigned long do_iret(void)
index c6bae2284e13503d09342c49c90ff652552504a5..a59cdaab7055a9dcbe1b7649168a7f031d085acf 100644 (file)
@@ -172,16 +172,8 @@ asmlinkage void do_double_fault(struct cpu_user_regs *regs)
            regs->r12, regs->r13, regs->r14);
     printk("r15: %016lx\n", regs->r15);
     show_stack_overflow(regs->rsp);
-    printk("************************************\n");
-    printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu);
-    printk("System needs manual reset.\n");
-    printk("************************************\n");
 
-    /* Lock up the console to prevent spurious output from other CPUs. */
-    console_force_lock();
-
-    /* Wait for manual reset. */
-    machine_halt();
+    panic("DOUBLE FAULT -- system shutdown\n");
 }
 
 void toggle_guest_mode(struct vcpu *v)