]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/debug.c
xnu-517.12.7.tar.gz
[apple/xnu.git] / osfmk / kern / debug.c
index b0e7f043d3f027d7a037880146bf512fffb622f3..5fedc28cc041e4ef8f3f57dfc1117c48be0f7014 100644 (file)
 #include <kern/assert.h>
 #include <kern/sched_prim.h>
 #include <kern/misc_protos.h>
+#include <vm/vm_kern.h>
 #include <stdarg.h>
 
+#ifdef __ppc__
+#include <ppc/Firmware.h>
+#include <ppc/low_trace.h>
+#endif
+
 unsigned int   halt_in_debugger = 0;
 unsigned int   switch_debugger = 0;
 unsigned int   current_debugger = 0;
@@ -70,10 +76,16 @@ unsigned int        active_debugger = 0;
 unsigned int   debug_mode=0;
 unsigned int   disableDebugOuput = TRUE;
 unsigned int   systemLogDiags = FALSE;
+unsigned int    logPanicDataToScreen = FALSE;
+#ifdef __ppc__
+        unsigned int   panicDebugging = FALSE;
+#else
+        unsigned int   panicDebugging = TRUE;
+#endif
 
 int mach_assert = 1;
 
-const char             *panicstr;
+const char             *panicstr = (char *) 0;
 decl_simple_lock_data(,panic_lock)
 int                    paniccpu;
 volatile int           panicwait;
@@ -82,6 +94,10 @@ unsigned int         panic_is_inited = 0;
 unsigned int           return_on_panic = 0;
 wait_queue_t           save_waits[NCPUS];
 
+char *debug_buf;
+char *debug_buf_ptr;
+unsigned int debug_buf_size = 0;
+
 void
 Assert(
        const char      *file,
@@ -129,13 +145,19 @@ panic(const char *str, ...)
        thread_t thread;
 
        s = splhigh();
+       disable_preemption();
+
+#ifdef __ppc__
+       lastTrace = LLTraceSet(0);              /* Disable low-level tracing */
+#endif
 
        thread = current_thread();              /* Get failing thread */
        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();
-       disableDebugOuput = FALSE;
+       if( logPanicDataToScreen )
+               disableDebugOuput = FALSE;
+               
        debug_mode = TRUE;
 restart:
        PANIC_LOCK();
@@ -153,8 +175,6 @@ restart:
                        nestedpanic +=1;
                        PANIC_UNLOCK();
                        Debugger("double panic");
-                       mp_enable_preemption();
-                       splx(s);
                        printf("double panic:  We are hanging here...\n");
                        while(1);
                        /* NOTREACHED */
@@ -165,11 +185,11 @@ restart:
        panicwait = 1;
 
        PANIC_UNLOCK();
-       printf("panic(cpu %d): ", (unsigned) paniccpu);
+       kdb_printf("panic(cpu %d): ", (unsigned) paniccpu);
        va_start(listp, str);
-       _doprnt(str, &listp, cnputc, 0);
+       _doprnt(str, &listp, consdebug_putc, 0);
        va_end(listp);
-       printf("\n");
+       kdb_printf("\n");
 
        /*
         * Release panicwait indicator so that other cpus may call Debugger().
@@ -182,12 +202,13 @@ restart:
        PANIC_LOCK();
        panicstr = (char *)0;
        PANIC_UNLOCK();
-       mp_enable_preemption();
-       splx(s);
        thread->wait_queue = save_waits[cpu_number()];  /* Restore the wait queue */
-       if (return_on_panic)
+       if (return_on_panic) {
+               enable_preemption();
+               splx(s);
                return;
-       printf("panic: We are hanging here...\n");
+       }
+       kdb_printf("panic: We are hanging here...\n");
        while(1);
        /* NOTREACHED */
 }
@@ -196,7 +217,6 @@ void
 log(int level, char *fmt, ...)
 {
        va_list listp;
-       extern void conslog_putc(char);
 
 #ifdef lint
        level++;
@@ -209,3 +229,23 @@ log(int level, char *fmt, ...)
        enable_preemption();
 #endif
 }
+
+void
+debug_log_init(void)
+{
+       if (debug_buf_size != 0)
+               return;
+       if (kmem_alloc(kernel_map, (vm_offset_t *) &debug_buf, PAGE_SIZE) != KERN_SUCCESS)
+               panic("cannot allocate debug_buf \n");
+       debug_buf_ptr = debug_buf;
+       debug_buf_size = PAGE_SIZE;
+}
+
+void
+debug_putc(char c)
+{
+       if ((debug_buf_size != 0) && ((debug_buf_ptr-debug_buf) < debug_buf_size)) {
+               *debug_buf_ptr=c;
+               debug_buf_ptr++;
+       }
+}