+
+/*
+ * The above stuff catches the double panic case so we shouldn't have to worry about that here.
+ */
+ if ( panicstr != (char *)0 )
+ {
+ /* diable kernel preemptions */
+ disable_preemption();
+
+ /* everything should be printed now so copy to NVRAM
+ */
+ if( debug_buf_size > 0)
+ pi_size = PESavePanicInfo( debug_buf, debug_buf_ptr - debug_buf);
+
+ if( !panicDebugging && (pi_size != 0) ) {
+ int my_cpu, debugger_cpu;
+ int tcpu;
+
+ my_cpu = cpu_number();
+ debugger_cpu = my_cpu;
+
+ hw_atomic_add(&debug_mode, 1);
+ debugger_active[my_cpu]++;
+ lock_debugger();
+
+ for(tcpu = 0; tcpu < NCPUS; tcpu++) {
+ if(tcpu == my_cpu) continue;
+ hw_atomic_add(&debugger_sync, 1);
+ (void)cpu_signal(tcpu, SIGPdebug, 0 ,0);
+ }
+ (void)hw_cpu_sync(&debugger_sync, LockTimeOut);
+ debugger_sync = 0;
+ }
+
+ draw_panic_dialog();
+
+ if( !panicDebugging && (pi_size != 0))
+ PEHaltRestart( kPEHangCPU );
+
+ enable_preemption();
+ }
+
+