1 #include "u.h"
2 #include "libc.h"
3
4 int
tas(long * x)5 tas(long *x)
6 {
7 int v, t, i = 1;
8
9 #if ARMv5
10 __asm__(
11 "swp %0, %1, [%2]"
12 : "=&r" (v)
13 : "r" (1), "r" (x)
14 : "memory"
15 );
16 #else
17 __asm__ (
18 "1: ldrex %0, [%2]\n"
19 " strex %1, %3, [%2]\n"
20 " teq %1, #0\n"
21 " bne 1b"
22 : "=&r" (v), "=&r" (t)
23 : "r" (x), "r" (i)
24 : "cc");
25 #endif
26 switch(v) {
27 case 0:
28 case 1:
29 return v;
30 default:
31 print("canlock: corrupted 0x%lux\n", v);
32 return 1;
33 }
34 }
35
36