00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef _RTAI_ASM_I386_ATOMIC_H
00020 #define _RTAI_ASM_I386_ATOMIC_H
00021
00022 #include <linux/bitops.h>
00023 #include <asm/atomic.h>
00024
00025 #ifdef __KERNEL__
00026
00027 #include <asm/system.h>
00028
00029 #define atomic_xchg(ptr,v) xchg(ptr,v)
00030 #define atomic_cmpxchg(ptr,o,n) cmpxchg(ptr,o,n)
00031
00032 #else
00033
00034 struct __rtai_xchg_dummy { unsigned long a[100]; };
00035 #define __rtai_xg(x) ((struct __rtai_xchg_dummy *)(x))
00036
00037 static inline unsigned long atomic_xchg (volatile void *ptr,
00038 unsigned long x)
00039 {
00040 __asm__ __volatile__(LOCK_PREFIX "xchgl %0,%1"
00041 :"=r" (x)
00042 :"m" (*__rtai_xg(ptr)), "0" (x)
00043 :"memory");
00044 return x;
00045 }
00046
00047 static inline unsigned long atomic_cmpxchg (volatile void *ptr,
00048 unsigned long o,
00049 unsigned long n)
00050 {
00051 unsigned long prev;
00052
00053 __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
00054 : "=a"(prev)
00055 : "q"(n), "m" (*__rtai_xg(ptr)), "0" (o)
00056 : "memory");
00057
00058 return prev;
00059 }
00060
00061
00062 #undef ADDR
00063
00064 #endif
00065
00066 #endif