Kernel/x86 - Added owner field to SHORTLOCK to catch doublelocks
authorJohn Hodge (sonata) <[email protected]>
Thu, 29 Nov 2012 16:19:13 +0000 (00:19 +0800)
committerJohn Hodge (sonata) <[email protected]>
Thu, 29 Nov 2012 16:19:13 +0000 (00:19 +0800)
KernelLand/Kernel/arch/x86/include/arch.h
KernelLand/Kernel/arch/x86/lib.c

index 8a98705..040e18b 100644 (file)
@@ -45,6 +45,7 @@ struct sShortSpinlock {
        #if LOCK_DISABLE_INTS
         int    IF;     //!< Interrupt state on call to SHORTLOCK
        #endif
+       void    *LockedBy;
 };
 
 // === MACROS ===
index 1b1a0c3..b732f75 100644 (file)
@@ -85,7 +85,11 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
        __ASM__ ("pushf;\n\tpop %0" : "=r"(IF));
        IF &= 0x200;    // AND out all but the interrupt flag
        
-       ASSERT( !CPU_HAS_LOCK(Lock) );
+       if( CPU_HAS_LOCK(Lock) )
+       {
+               Panic("Double lock of %p, %p req, %p has", Lock, __builtin_return_address(0), Lock->LockedBy);
+               for(;;);
+       }
 
        #if TRACE_LOCKS
        if( TRACE_LOCK_COND )
@@ -100,6 +104,7 @@ void SHORTLOCK(struct sShortSpinlock *Lock)
        // Wait for another CPU to release
        __AtomicTestSetLoop( (Uint*)&Lock->Lock, cpu );
        Lock->IF = IF;
+       Lock->LockedBy = __builtin_return_address(0);
        
        #if TRACE_LOCKS
        if( TRACE_LOCK_COND )

UCC git Repository :: git.ucc.asn.au