Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cmpxchg.h
Go to the documentation of this file.
1 #ifndef _ASM_MICROBLAZE_CMPXCHG_H
2 #define _ASM_MICROBLAZE_CMPXCHG_H
3 
4 #include <linux/irqflags.h>
5 
6 void __bad_xchg(volatile void *ptr, int size);
7 
8 static inline unsigned long __xchg(unsigned long x, volatile void *ptr,
9  int size)
10 {
11  unsigned long ret;
12  unsigned long flags;
13 
14  switch (size) {
15  case 1:
16  local_irq_save(flags);
17  ret = *(volatile unsigned char *)ptr;
18  *(volatile unsigned char *)ptr = x;
19  local_irq_restore(flags);
20  break;
21 
22  case 4:
23  local_irq_save(flags);
24  ret = *(volatile unsigned long *)ptr;
25  *(volatile unsigned long *)ptr = x;
26  local_irq_restore(flags);
27  break;
28  default:
29  __bad_xchg(ptr, size), ret = 0;
30  break;
31  }
32 
33  return ret;
34 }
35 
36 #define xchg(ptr, x) \
37  ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
38 
39 #include <asm-generic/cmpxchg.h>
41 
42 #endif /* _ASM_MICROBLAZE_CMPXCHG_H */