xref: /kvm-unit-tests/lib/x86/atomic.c (revision 584afc90e9404e2b98a763fb615b689215744802)
1 #include <libcflat.h>
2 #include "atomic.h"
3 
4 #ifdef __i386__
5 
atomic64_cmpxchg(atomic64_t * v,u64 old,u64 new)6 u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new)
7 {
8         u32 low = new;
9         u32 high = new >> 32;
10 
11         asm volatile("lock cmpxchg8b %1\n"
12                      : "+A" (old),
13                        "+m" (*(volatile long long *)&v->counter)
14                      : "b" (low), "c" (high)
15                      : "memory"
16                      );
17 
18         return old;
19 }
20 
21 #else
22 
atomic64_cmpxchg(atomic64_t * v,u64 old,u64 new)23 u64 atomic64_cmpxchg(atomic64_t *v, u64 old, u64 new)
24 {
25         u64 ret;
26         u64 _old = old;
27         u64 _new = new;
28 
29         asm volatile("lock cmpxchgq %2,%1"
30                      : "=a" (ret), "+m" (*(volatile long *)&v->counter)
31                      : "r" (_new), "0" (_old)
32                      : "memory"
33                      );
34         return ret;
35 }
36 
37 #endif
38