X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/a3d08fcd5120d2aa8303b6349ca8b14e3f284af3..91447636331957f3d9b5ca5b508f07c526b0074d:/pexpert/i386/pe_kprintf.c diff --git a/pexpert/i386/pe_kprintf.c b/pexpert/i386/pe_kprintf.c index b82d5d43b..7e0ed56f1 100644 --- a/pexpert/i386/pe_kprintf.c +++ b/pexpert/i386/pe_kprintf.c @@ -84,8 +84,17 @@ void kprintf(const char *fmt, ...) boolean_t state; if (!disableSerialOuput) { - state = ml_set_interrupts_enabled(FALSE); - simple_lock(&kprintf_lock); + + /* + * Spin to get kprintf lock but re-enable interrupts while failing. + * This allows interrupts to be handled while waiting but + * interrupts are disabled once we have the lock. + */ + state = ml_set_interrupts_enabled(FALSE); + while (!simple_lock_try(&kprintf_lock)) { + ml_set_interrupts_enabled(state); + ml_set_interrupts_enabled(FALSE); + } if (cpu_number() != cpu_last_locked) { MP_DEBUG_KPRINTF("[cpu%d...]\n", cpu_number());