+++ /dev/null
-/*
- * Acess2
- * ARM7 Architecture
- *
- * lock.h - Hardware level spinlocks
- */
-#ifndef _LOCK_H_
-#define _LOCK_H_
-
-// === CODE ===
-struct sShortSpinlock {
- int Lock;
-};
-
-// --- Spinlocks ---
-static inline int IS_LOCKED(struct sShortSpinlock *Lock)
-{
- return !!Lock->Lock;
-}
-
-static inline int CPU_HAS_LOCK(struct sShortSpinlock *Lock)
-{
- // TODO: Handle multiple CPUs
- return !!Lock->Lock;
-}
-
-static inline int SHORTLOCK(struct sShortSpinlock *Lock)
-{
- #if 0
- // Coped from linux, yes, but I know what it does now :)
- Uint tmp;
- __asm__ __volatile__ (
- "1: ldrex %0, [%1]\n" // Exclusive LOAD
- " teq %0, #0\n" // Check if zero
- " strexeq %0, %2, [%1]\n" // Set to one if it is zero (releasing lock on the memory)
- " teqeq %0, #0\n" // If the lock was avaliable, check if the write succeeded
- " bne 1b" // If the lock was unavaliable, or the write failed, loop
- : "=&r" (tmp) // Temp
- : "r" (&Lock->Lock), "r" (1)
- : "cc" // Condition codes clobbered
- );
- #elif 1
- while( *(volatile int*)&Lock->Lock ) ;
- Lock->Lock = 1;
- #else
- int v = 1;
- while( v )
- __asm__ __volatile__ (
- "swp %0, %0, [%1]"
- : "=r" (v) : "r" (&Lock->Lock)
- : "cc"
- );
- #endif
- return 1;
-}
-
-static inline void SHORTREL(struct sShortSpinlock *Lock)
-{
- Lock->Lock = 0;
-}
-
-#endif
-