X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..b36670cedae0009469e8ee117453de831de64a6b:/osfmk/kern/debug.c?ds=inline diff --git a/osfmk/kern/debug.c b/osfmk/kern/debug.c index b0e7f043d..c5f6cf3d9 100644 --- a/osfmk/kern/debug.c +++ b/osfmk/kern/debug.c @@ -52,7 +52,6 @@ #include #include #include -#include #include #include @@ -61,8 +60,15 @@ #include #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,17 +76,24 @@ unsigned int active_debugger = 0; unsigned int debug_mode=0; unsigned int disableDebugOuput = TRUE; unsigned int systemLogDiags = FALSE; +unsigned int logPanicDataToScreen = FALSE; +unsigned int panicDebugging = FALSE; int mach_assert = 1; -const char *panicstr; +const char *panicstr = (char *) 0; decl_simple_lock_data(,panic_lock) int paniccpu; volatile int panicwait; -volatile int nestedpanic= 0; +volatile unsigned int nestedpanic= 0; unsigned int panic_is_inited = 0; unsigned int return_on_panic = 0; -wait_queue_t save_waits[NCPUS]; +unsigned long panic_caller; + +char *debug_buf; +ppnum_t debug_buf_page; +char *debug_buf_ptr; +unsigned int debug_buf_size = 0; void Assert( @@ -117,8 +130,9 @@ MACRO_END void panic_init(void) { - simple_lock_init(&panic_lock, ETAP_NO_TRACE); + simple_lock_init(&panic_lock, 0); panic_is_inited = 1; + panic_caller = 0; } void @@ -127,16 +141,28 @@ panic(const char *str, ...) va_list listp; spl_t s; thread_t thread; + wait_queue_t wq; 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 */ + wq = 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; + + /* panic_caller is initialized to 0. If set, don't change it */ + if ( ! panic_caller ) + panic_caller = (unsigned long) __builtin_return_address(0); + restart: PANIC_LOCK(); if (panicstr) { @@ -153,8 +179,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 +189,11 @@ restart: panicwait = 1; PANIC_UNLOCK(); - printf("panic(cpu %d): ", (unsigned) paniccpu); + kdb_printf("panic(cpu %d caller 0x%08X): ", (unsigned) paniccpu, panic_caller); 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 +206,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) + thread->wait_queue = wq; /* Restore the wait queue */ + 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 +221,6 @@ void log(int level, char *fmt, ...) { va_list listp; - extern void conslog_putc(char); #ifdef lint level++; @@ -209,3 +233,24 @@ 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; + debug_buf_page = pmap_find_phys(kernel_pmap, (addr64_t)(uintptr_t)debug_buf_ptr); +} + +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++; + } +}