| .. | .. |
|---|
| 14 | 14 | * bit 0 is the LSB of addr; bit 32 is the LSB of (addr+1). |
|---|
| 15 | 15 | */ |
|---|
| 16 | 16 | |
|---|
| 17 | +#include <asm/rmwcc.h> |
|---|
| 18 | + |
|---|
| 17 | 19 | #define ADDR (*(volatile long *)addr) |
|---|
| 18 | 20 | |
|---|
| 19 | 21 | /** |
|---|
| .. | .. |
|---|
| 29 | 31 | */ |
|---|
| 30 | 32 | static inline void sync_set_bit(long nr, volatile unsigned long *addr) |
|---|
| 31 | 33 | { |
|---|
| 32 | | - asm volatile("lock; bts %1,%0" |
|---|
| 34 | + asm volatile("lock; " __ASM_SIZE(bts) " %1,%0" |
|---|
| 33 | 35 | : "+m" (ADDR) |
|---|
| 34 | 36 | : "Ir" (nr) |
|---|
| 35 | 37 | : "memory"); |
|---|
| .. | .. |
|---|
| 47 | 49 | */ |
|---|
| 48 | 50 | static inline void sync_clear_bit(long nr, volatile unsigned long *addr) |
|---|
| 49 | 51 | { |
|---|
| 50 | | - asm volatile("lock; btr %1,%0" |
|---|
| 52 | + asm volatile("lock; " __ASM_SIZE(btr) " %1,%0" |
|---|
| 51 | 53 | : "+m" (ADDR) |
|---|
| 52 | 54 | : "Ir" (nr) |
|---|
| 53 | 55 | : "memory"); |
|---|
| .. | .. |
|---|
| 64 | 66 | */ |
|---|
| 65 | 67 | static inline void sync_change_bit(long nr, volatile unsigned long *addr) |
|---|
| 66 | 68 | { |
|---|
| 67 | | - asm volatile("lock; btc %1,%0" |
|---|
| 69 | + asm volatile("lock; " __ASM_SIZE(btc) " %1,%0" |
|---|
| 68 | 70 | : "+m" (ADDR) |
|---|
| 69 | 71 | : "Ir" (nr) |
|---|
| 70 | 72 | : "memory"); |
|---|
| .. | .. |
|---|
| 78 | 80 | * This operation is atomic and cannot be reordered. |
|---|
| 79 | 81 | * It also implies a memory barrier. |
|---|
| 80 | 82 | */ |
|---|
| 81 | | -static inline int sync_test_and_set_bit(long nr, volatile unsigned long *addr) |
|---|
| 83 | +static inline bool sync_test_and_set_bit(long nr, volatile unsigned long *addr) |
|---|
| 82 | 84 | { |
|---|
| 83 | | - unsigned char oldbit; |
|---|
| 84 | | - |
|---|
| 85 | | - asm volatile("lock; bts %2,%1\n\tsetc %0" |
|---|
| 86 | | - : "=qm" (oldbit), "+m" (ADDR) |
|---|
| 87 | | - : "Ir" (nr) : "memory"); |
|---|
| 88 | | - return oldbit; |
|---|
| 85 | + return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(bts), *addr, c, "Ir", nr); |
|---|
| 89 | 86 | } |
|---|
| 90 | 87 | |
|---|
| 91 | 88 | /** |
|---|
| .. | .. |
|---|
| 98 | 95 | */ |
|---|
| 99 | 96 | static inline int sync_test_and_clear_bit(long nr, volatile unsigned long *addr) |
|---|
| 100 | 97 | { |
|---|
| 101 | | - unsigned char oldbit; |
|---|
| 102 | | - |
|---|
| 103 | | - asm volatile("lock; btr %2,%1\n\tsetc %0" |
|---|
| 104 | | - : "=qm" (oldbit), "+m" (ADDR) |
|---|
| 105 | | - : "Ir" (nr) : "memory"); |
|---|
| 106 | | - return oldbit; |
|---|
| 98 | + return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(btr), *addr, c, "Ir", nr); |
|---|
| 107 | 99 | } |
|---|
| 108 | 100 | |
|---|
| 109 | 101 | /** |
|---|
| .. | .. |
|---|
| 116 | 108 | */ |
|---|
| 117 | 109 | static inline int sync_test_and_change_bit(long nr, volatile unsigned long *addr) |
|---|
| 118 | 110 | { |
|---|
| 119 | | - unsigned char oldbit; |
|---|
| 120 | | - |
|---|
| 121 | | - asm volatile("lock; btc %2,%1\n\tsetc %0" |
|---|
| 122 | | - : "=qm" (oldbit), "+m" (ADDR) |
|---|
| 123 | | - : "Ir" (nr) : "memory"); |
|---|
| 124 | | - return oldbit; |
|---|
| 111 | + return GEN_BINARY_RMWcc("lock; " __ASM_SIZE(btc), *addr, c, "Ir", nr); |
|---|
| 125 | 112 | } |
|---|
| 126 | 113 | |
|---|
| 127 | 114 | #define sync_test_bit(nr, addr) test_bit(nr, addr) |
|---|