aboutsummaryrefslogtreecommitdiffstats
path: root/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h
diff options
context:
space:
mode:
Diffstat (limited to 'linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h')
-rw-r--r--linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h
index 6af3ad2857..11f88c2507 100644
--- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h
+++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/synch_bitops.h
@@ -89,6 +89,22 @@ static inline unsigned long __synch_cmpxchg(volatile void *ptr,
"0"(old)
: "memory");
return prev;
+#ifdef CONFIG_X86_64
+ case 4:
+ __asm__ __volatile__("lock; cmpxchgl %k1,%2"
+ : "=a"(prev)
+ : "q"(new), "m"(*__synch_xg(ptr)),
+ "0"(old)
+ : "memory");
+ return prev;
+ case 8:
+ __asm__ __volatile__("lock; cmpxchgq %1,%2"
+ : "=a"(prev)
+ : "q"(new), "m"(*__synch_xg(ptr)),
+ "0"(old)
+ : "memory");
+ return prev;
+#else
case 4:
__asm__ __volatile__("lock; cmpxchgl %1,%2"
: "=a"(prev)
@@ -96,6 +112,7 @@ static inline unsigned long __synch_cmpxchg(volatile void *ptr,
"0"(old)
: "memory");
return prev;
+#endif
}
return old;
}