X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..5eebf7385fedb1517b66b53c28e5aa6bb0a2be50:/osfmk/kern/debug.c diff --git a/osfmk/kern/debug.c b/osfmk/kern/debug.c index b0e7f043d..5fedc28cc 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,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++; + } +}