X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..ac5ea4a98a4e1d34a076095ea1eaa87e43d1f335:/osfmk/kern/debug.c diff --git a/osfmk/kern/debug.c b/osfmk/kern/debug.c index b0e7f043d..7793cb8c2 100644 --- a/osfmk/kern/debug.c +++ b/osfmk/kern/debug.c @@ -61,8 +61,14 @@ #include #include #include +#include #include +#ifdef __ppc__ +#include +#include +#endif + unsigned int halt_in_debugger = 0; unsigned int switch_debugger = 0; unsigned int current_debugger = 0; @@ -70,6 +76,12 @@ unsigned int active_debugger = 0; unsigned int debug_mode=0; unsigned int disableDebugOuput = TRUE; unsigned int systemLogDiags = FALSE; +unsigned int panicDebugging = FALSE; +#ifdef __ppc__ + unsigned int logPanicDataToScreen = FALSE; +#else + unsigned int logPanicDataToScreen = TRUE; +#endif int mach_assert = 1; @@ -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, @@ -130,12 +146,19 @@ panic(const char *str, ...) s = splhigh(); +#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(); @@ -165,11 +188,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(). @@ -187,7 +210,7 @@ restart: thread->wait_queue = save_waits[cpu_number()]; /* Restore the wait queue */ if (return_on_panic) return; - printf("panic: We are hanging here...\n"); + kdb_printf("panic: We are hanging here...\n"); while(1); /* NOTREACHED */ } @@ -196,7 +219,6 @@ void log(int level, char *fmt, ...) { va_list listp; - extern void conslog_putc(char); #ifdef lint level++; @@ -209,3 +231,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++; + } +}