]> git.saurik.com Git - apple/xnu.git/blobdiff - pexpert/i386/pe_kprintf.c
xnu-792.6.56.tar.gz
[apple/xnu.git] / pexpert / i386 / pe_kprintf.c
index 4383340f09efabba52801f6ad00b9469564b02b9..47788ec82593756d8cecb712d191216b3d4bb2fd 100644 (file)
@@ -3,8 +3,6 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
- * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
@@ -87,8 +85,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());