| #ifndef __UM_SYSTEM_I386_H |
| #define __UM_SYSTEM_I386_H |
| |
| #include "asm/system-generic.h" |
| |
| #define __HAVE_ARCH_CMPXCHG 1 |
| |
| static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, |
| unsigned long new, int size) |
| { |
| unsigned long prev; |
| switch (size) { |
| case 1: |
| __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" |
| : "=a"(prev) |
| : "q"(new), "m"(*__xg(ptr)), "0"(old) |
| : "memory"); |
| return prev; |
| case 2: |
| __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" |
| : "=a"(prev) |
| : "q"(new), "m"(*__xg(ptr)), "0"(old) |
| : "memory"); |
| return prev; |
| case 4: |
| __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" |
| : "=a"(prev) |
| : "q"(new), "m"(*__xg(ptr)), "0"(old) |
| : "memory"); |
| return prev; |
| } |
| return old; |
| } |
| |
| #define cmpxchg(ptr,o,n)\ |
| ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ |
| (unsigned long)(n),sizeof(*(ptr)))) |
| |
| #endif |