]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/lib/libk/arm/atomic-arm-up.cpp
a0eb709ac7d8698747baddbc259896c6eb34bab8
[l4.git] / kernel / fiasco / src / lib / libk / arm / atomic-arm-up.cpp
1 IMPLEMENTATION [arm]:
2
3 inline
4 bool
5 cas_unsafe( Mword *ptr, Mword oldval, Mword newval )
6 {
7   Mword ret;
8   asm volatile ( "    mrs    r5, cpsr    \n"
9                  "    mov    r6,r5       \n"
10                  "    orr    r6,r6,#0x80 \n"
11                  "    msr    cpsr_c, r6  \n"
12                  "    \n"
13                  "    ldr    r6, [%1]    \n"
14                  "    cmp    r6, %2      \n"
15                  "    streq  %3, [%1]    \n"
16                  "    moveq  %0, #1      \n"
17                  "    movne  %0, #0      \n"
18                  "    msr    cpsr_c, r5  \n"
19                  : "=r"(ret)
20                  : "r"(ptr), "r"(oldval), "r"(newval)
21                  : "r5", "r6", "memory"
22                  );
23   return ret;
24 }
25
26 inline
27 bool
28 cas2_unsafe( Mword *ptr, Mword *oldval, Mword *newval )
29 {
30   Mword ret;
31   asm volatile ( "    mrs    r5, cpsr    \n"
32                  "    mov    r6,r5       \n"
33                  "    orr    r6,r6,#128  \n"
34                  "    msr    cpsr_c, r6  \n"
35                  "    \n"
36                  "    ldr    r6, [%1]    \n"
37                  "    ldr    r7, [%1,#4] \n"
38                  "    cmp    r6, %2      \n"
39                  "    cmpeq  r7, %3      \n"
40                  "    streq  %4, [%1]    \n"
41                  "    streq  %5, [%1,#4] \n"
42                  "    moveq  %0, #1      \n"
43                  "    movne  %0, #0      \n"
44                  "    msr    cpsr_c, r5  \n"
45                  : "=r"(ret)
46                  : "r"(ptr), "r"(*oldval), "r"(*(oldval+1)), "r"(*newval),
47                    "r"(*(newval+1))
48                  : "r5", "r6", "r7", "memory"
49                  );
50   return ret;
51 }
52
53 inline
54 bool
55 tas (Mword *l)
56 {
57   Mword ret;
58   asm volatile ( "    swp %0, %2, [%1] \n "
59                  : "=&r"(ret)
60                  : "r"(l), "r" (1)
61                  : "memory"
62                  );
63   return ret;
64 }
65
66 inline
67 void
68 atomic_and (Mword *l, Mword mask)
69 {
70   Mword old;
71   do { old = *l; }
72   while ( !cas (l, old, old & mask));
73 }
74
75 inline
76 void
77 atomic_or (Mword *l, Mword bits)
78 {
79   Mword old;
80   do { old = *l; }
81   while ( !cas (l, old, old | bits));
82 }
83