]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/lib/libk/amd64/atomic-amd64.cpp
983ed2995869ff0b158966f9d89e497a912195e9
[l4.git] / kernel / fiasco / src / lib / libk / amd64 / atomic-amd64.cpp
1 IMPLEMENTATION [amd64]:
2
3 inline
4 void
5 atomic_mp_and(Mword *l, Mword value)
6 {
7   asm volatile ("lock; andq %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
8 }
9
10 inline
11 void
12 atomic_mp_or(Mword *l, Mword value)
13 {
14   asm volatile ("lock; orq %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
15 }
16
17 inline
18 void
19 atomic_mp_add (Mword *l, Mword value)
20 {
21   asm volatile ("lock; addq %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
22 }
23
24 inline
25 void
26 atomic_add (Mword *l, Mword value)
27 {
28   asm volatile ("addq %1, %2" : "=m"(*l) : "ir"(value), "m"(*l));
29 }
30
31 inline
32 void
33 atomic_and (Mword *l, Mword mask)
34 {
35   asm volatile ("andq %1, %2" : "=m"(*l) : "ir"(mask), "m"(*l));
36 }
37
38 inline
39 void
40 atomic_or (Mword *l, Mword bits)
41 {
42   asm volatile ("orq %1, %2" : "=m"(*l) : "ir"(bits), "m"(*l));
43 }
44
45 // ``unsafe'' stands for no safety according to the size of the given type.
46 // There are type safe versions of the cas operations in the architecture
47 // independent part of atomic that use the unsafe versions and make a type
48 // check.
49
50 inline
51 bool
52 cas_unsafe (Mword *ptr, Mword oldval, Mword newval)
53 {
54   Mword tmp;
55
56   asm volatile
57     ("cmpxchgq %1, %2"
58      : "=a" (tmp)
59      : "r" (newval), "m" (*ptr), "a" (oldval)
60      : "memory");
61
62   return tmp == oldval;
63 }
64
65 inline
66 bool
67 mp_cas_arch (Mword *ptr, Mword oldval, Mword newval)
68 {
69   Mword tmp;
70
71   asm volatile
72     ("lock; cmpxchgq %1, %2"
73      : "=a" (tmp)
74      : "r" (newval), "m" (*ptr), "a" (oldval)
75      : "memory");
76
77   return tmp == oldval;
78 }
79
80 inline
81 bool
82 cas2_unsafe (Mword *ptr, Mword *oldval, Mword *newval)
83 {
84   char ret;
85   asm volatile
86     ("cmpxchg16b %3 ; sete %%cl"
87      : "=c" (ret), 
88        "=a" (* oldval), 
89        "=d" (*(oldval+1))
90      : "m" (*ptr) , 
91        "a" (* oldval), "d" (*(oldval+1)), 
92        "b" (* newval), "c" (*(newval+1))
93      : "memory");
94
95   return ret;
96 }
97
98 inline
99 bool
100 mp_cas2_arch (char *p, Mword o1, Mword o2, Mword n1, Mword n2)
101 {
102   char ret;
103   asm volatile
104     ("lock; cmpxchg16b %3 ; sete %%cl"
105      : "=c" (ret), "=a" (o1), "=d" (o2)
106      : "m" (*p), "a" (o1), "d" (o2),
107        "b" (n1), "c" (n2)
108      : "memory");
109
110   return ret;
111 }
112
113 inline
114 bool
115 tas (Mword *l)
116 {
117   Mword tmp;
118   asm volatile ("xchg %0, %1" : "=r"(tmp) : "m"(*l), "0"(1) : "memory");
119   return tmp;
120 }
121