]> git.saurik.com Git - apple/xnu.git/blobdiff - pexpert/arm/pe_kprintf.c
xnu-7195.101.1.tar.gz
[apple/xnu.git] / pexpert / arm / pe_kprintf.c
index fdac3ab1ad6325a9ed1f255c2eed2e90ec1272f5..8475cd619e800762ae6ec360da02ec07592e83f8 100644 (file)
 #include <libkern/section_keywords.h>
 
 /* Globals */
-void            (*PE_kputc)(char c) = 0;
+typedef void (*PE_kputc_t)(char);
+SECURITY_READ_ONLY_LATE(PE_kputc_t) PE_kputc;
 
-SECURITY_READ_ONLY_LATE(unsigned int)    disable_serial_output = TRUE;
+// disable_serial_output disables kprintf() *and* unbuffered panic output.
+// disable_kprintf_output only disables kprintf().
+SECURITY_READ_ONLY_LATE(unsigned int) disable_serial_output = TRUE;
+static SECURITY_READ_ONLY_LATE(unsigned int) disable_kprintf_output = TRUE;
 
-decl_simple_lock_data(static, kprintf_lock);
+static SIMPLE_LOCK_DECLARE(kprintf_lock, 0);
 
 static void serial_putc_crlf(char c);
 
-void
-PE_init_kprintf(boolean_t vm_initialized)
+__startup_func
+static void
+PE_init_kprintf(void)
 {
-       unsigned int    boot_arg;
-
        if (PE_state.initialized == FALSE) {
                panic("Platform Expert not initialized");
        }
 
-       if (!vm_initialized) {
-               simple_lock_init(&kprintf_lock, 0);
+       if (debug_boot_arg & DB_KPRT) {
+               disable_serial_output = FALSE;
+       }
 
-               if (PE_parse_boot_argn("debug", &boot_arg, sizeof(boot_arg))) {
-                       if (boot_arg & DB_KPRT) {
-                               disable_serial_output = FALSE;
-                       }
-               }
+#if DEBUG
+       disable_kprintf_output = FALSE;
+#elif DEVELOPMENT
+       bool enable_kprintf_spam = false;
+       if (PE_parse_boot_argn("-enable_kprintf_spam", &enable_kprintf_spam, sizeof(enable_kprintf_spam))) {
+               disable_kprintf_output = FALSE;
+       }
+#endif
 
-               if (serial_init()) {
-                       PE_kputc = serial_putc_crlf;
-               } else {
-                       PE_kputc = cnputc;
-               }
+       if (serial_init()) {
+               PE_kputc = serial_putc_crlf;
+       } else {
+               PE_kputc = cnputc_unbuffered;
        }
 }
+STARTUP(KPRINTF, STARTUP_RANK_FIRST, PE_init_kprintf);
 
 #ifdef MP_DEBUG
 static void
@@ -79,7 +86,9 @@ kprintf(const char *fmt, ...)
        boolean_t       state;
        void           *caller = __builtin_return_address(0);
 
-       if (!disable_serial_output) {
+       if (!disable_serial_output && !disable_kprintf_output) {
+               va_start(listp, fmt);
+               va_copy(listp2, listp);
                /*
                 * Spin to get kprintf lock but re-enable interrupts while failing.
                 * This allows interrupts to be handled while waiting but
@@ -96,10 +105,7 @@ kprintf(const char *fmt, ...)
                        cpu_last_locked = cpu_number();
                }
 
-               va_start(listp, fmt);
-               va_copy(listp2, listp);
                _doprnt_log(fmt, &listp, PE_kputc, 16);
-               va_end(listp);
 
                simple_unlock(&kprintf_lock);
 
@@ -117,19 +123,14 @@ kprintf(const char *fmt, ...)
                }
 #endif
                ml_set_interrupts_enabled(state);
+               va_end(listp);
 
-               // If interrupts are enabled
-               if (ml_get_interrupts_enabled()) {
-                       os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, listp2, caller);
-               }
+               os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, listp2, caller);
                va_end(listp2);
        } else {
-               // If interrupts are enabled
-               if (ml_get_interrupts_enabled()) {
-                       va_start(listp, fmt);
-                       os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, listp, caller);
-                       va_end(listp);
-               }
+               va_start(listp, fmt);
+               os_log_with_args(OS_LOG_DEFAULT, OS_LOG_TYPE_DEFAULT, fmt, listp, caller);
+               va_end(listp);
        }
 }