ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-um / system-i386.h
1 #ifndef __UM_SYSTEM_I386_H
2 #define __UM_SYSTEM_I386_H
3
4 #include "asm/system-generic.h"
5
6 static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
7                                       unsigned long new, int size)
8 {
9         unsigned long prev;
10         switch (size) {
11         case 1:
12                 __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
13                                      : "=a"(prev)
14                                      : "q"(new), "m"(*__xg(ptr)), "0"(old)
15                                      : "memory");
16                 return prev;
17         case 2:
18                 __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
19                                      : "=a"(prev)
20                                      : "q"(new), "m"(*__xg(ptr)), "0"(old)
21                                      : "memory");
22                 return prev;
23         case 4:
24                 __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
25                                      : "=a"(prev)
26                                      : "q"(new), "m"(*__xg(ptr)), "0"(old)
27                                      : "memory");
28                 return prev;
29         }
30         return old;
31 }
32
33 #define cmpxchg(ptr,o,n)\
34         ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
35                                         (unsigned long)(n),sizeof(*(ptr))))
36     
37 #endif