]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/debug.c
xnu-517.9.5.tar.gz
[apple/xnu.git] / osfmk / kern / debug.c
index 7793cb8c242faad5624b14f803c3fe7c41ab2b1f..5fedc28cc041e4ef8f3f57dfc1117c48be0f7014 100644 (file)
@@ -76,16 +76,16 @@ unsigned int        active_debugger = 0;
 unsigned int   debug_mode=0;
 unsigned int   disableDebugOuput = TRUE;
 unsigned int   systemLogDiags = FALSE;
 unsigned int   debug_mode=0;
 unsigned int   disableDebugOuput = TRUE;
 unsigned int   systemLogDiags = FALSE;
-unsigned int   panicDebugging = FALSE;
+unsigned int    logPanicDataToScreen = FALSE;
 #ifdef __ppc__
 #ifdef __ppc__
-       unsigned int    logPanicDataToScreen = FALSE;
+        unsigned int   panicDebugging = FALSE;
 #else
 #else
-       unsigned int    logPanicDataToScreen = TRUE;
+        unsigned int   panicDebugging = TRUE;
 #endif
 
 int mach_assert = 1;
 
 #endif
 
 int mach_assert = 1;
 
-const char             *panicstr;
+const char             *panicstr = (char *) 0;
 decl_simple_lock_data(,panic_lock)
 int                    paniccpu;
 volatile int           panicwait;
 decl_simple_lock_data(,panic_lock)
 int                    paniccpu;
 volatile int           panicwait;
@@ -145,6 +145,7 @@ panic(const char *str, ...)
        thread_t thread;
 
        s = splhigh();
        thread_t thread;
 
        s = splhigh();
+       disable_preemption();
 
 #ifdef __ppc__
        lastTrace = LLTraceSet(0);              /* Disable low-level tracing */
 
 #ifdef __ppc__
        lastTrace = LLTraceSet(0);              /* Disable low-level tracing */
@@ -154,8 +155,6 @@ panic(const char *str, ...)
        save_waits[cpu_number()] = thread->wait_queue;  /* Save the old value */
        thread->wait_queue = 0;                 /* Clear the wait so we do not get double panics when we try locks */
 
        save_waits[cpu_number()] = thread->wait_queue;  /* Save the old value */
        thread->wait_queue = 0;                 /* Clear the wait so we do not get double panics when we try locks */
 
-       mp_disable_preemption();
-       
        if( logPanicDataToScreen )
                disableDebugOuput = FALSE;
                
        if( logPanicDataToScreen )
                disableDebugOuput = FALSE;
                
@@ -176,8 +175,6 @@ restart:
                        nestedpanic +=1;
                        PANIC_UNLOCK();
                        Debugger("double panic");
                        nestedpanic +=1;
                        PANIC_UNLOCK();
                        Debugger("double panic");
-                       mp_enable_preemption();
-                       splx(s);
                        printf("double panic:  We are hanging here...\n");
                        while(1);
                        /* NOTREACHED */
                        printf("double panic:  We are hanging here...\n");
                        while(1);
                        /* NOTREACHED */
@@ -205,11 +202,12 @@ restart:
        PANIC_LOCK();
        panicstr = (char *)0;
        PANIC_UNLOCK();
        PANIC_LOCK();
        panicstr = (char *)0;
        PANIC_UNLOCK();
-       mp_enable_preemption();
-       splx(s);
        thread->wait_queue = save_waits[cpu_number()];  /* Restore the wait queue */
        thread->wait_queue = save_waits[cpu_number()];  /* Restore the wait queue */
-       if (return_on_panic)
+       if (return_on_panic) {
+               enable_preemption();
+               splx(s);
                return;
                return;
+       }
        kdb_printf("panic: We are hanging here...\n");
        while(1);
        /* NOTREACHED */
        kdb_printf("panic: We are hanging here...\n");
        while(1);
        /* NOTREACHED */