1 //---------------------------------------------------------------------------
4 EXTENSION class Spin_lock
7 enum { Arch_lock = 2 };
9 //---------------------------------------------------------------------------
10 IMPLEMENTATION [arm && mp]:
12 #include "processor.h"
14 PRIVATE template<typename Lock_t> inline NEEDS["processor.h"]
16 Spin_lock<Lock_t>::lock_arch()
21 __asm__ __volatile__ ( \
22 "1: ldr" #z " %[d], [%[lock]] \n" \
23 " tst %[d], #2 \n" /* Arch_lock == #2 */ \
26 " ldrex"#z" %[d], [%[lock]] \n" \
28 " orr %[tmp], %[d], #2 \n" \
29 " strex"#z"eq %[d], %[tmp], [%[lock]] \n" \
30 " teqeq %[d], #0 \n" \
32 : [d] "=&r" (dummy), [tmp] "=&r"(tmp), "+m" (_lock) \
33 : [lock] "r" (&_lock) \
36 if (sizeof(Lock_t) == sizeof(char))
38 else if (sizeof(Lock_t) == sizeof(short))
46 PRIVATE template<typename Lock_t> inline
48 Spin_lock<Lock_t>::unlock_arch()
52 __asm__ __volatile__( \
53 "ldr"#z " %[tmp], %[lock] \n" \
54 "bic %[tmp], %[tmp], #2 \n" /* Arch_lock == #2 */ \
55 "str"#z " %[tmp], %[lock] \n" \
56 "mcr p15, 0, %[tmp], c7, c10, 4 \n" /* drain write buffer */ \
58 : [lock] "=m" (_lock), [tmp] "=&r" (tmp))
59 if (sizeof(Lock_t) == sizeof(char))
61 else if (sizeof(Lock_t) == sizeof(short))