ARM Build (doesn't compile yet)
[tpg/acess2.git] / Kernel / arch / arm7 / include / lock.h
1 /*
2  * Acess2
3  * ARM7 Architecture
4  *
5  * lock.h - Hardware level spinlocks
6  */
7 #ifndef _LOCK_H_
8 #define _LOCK_H_
9
10 // === CODE ===
11 struct sShortSpinlock {
12          int    Lock;
13 };
14
15 // --- Spinlocks ---
16 static inline int IS_LOCKED(struct sShortSpinlock *Lock)
17 {
18         return !!Lock->Lock;
19 }
20
21 static inline int CPU_HAS_LOCK(struct sShortSpinlock *Lock)
22 {
23         // TODO: Handle multiple CPUs
24         return !!Lock->Lock;
25 }
26
27 static inline int SHORTLOCK(struct sShortSpinlock *Lock)
28 {
29         // Shamelessly copied from linux (/arch/arm/include/asm/spinlock.h) until I can fix stuff
30         Uint    tmp;
31         __asm__ __volatile__ (
32         "1:     ldrex   %0, [%1]\n"
33         "       teq     %0, #0\n"
34         "       strexeq %0, %2, [%1]\n" // Magic? TODO: Look up
35         "       teqeq   %0, #0\n"
36         "       bne     1b"
37                 : "=&r" (tmp)   // Temp
38                 : "r" (&Lock->Lock), "r" (1)
39                 : "cc"  // Condition codes clobbered
40                 );
41         return 1;
42 }
43
44 static inline void SHORTREL(struct sShortSpinlock *Lock)
45 {
46         Lock->Lock = 0;
47 }
48
49 #endif
50

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