Changes in kernel/arch/ia64/include/atomic.h [7038f55:7a0359b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/include/atomic.h
r7038f55 r7a0359b 27 27 */ 28 28 29 /** @addtogroup ia64 29 /** @addtogroup ia64 30 30 * @{ 31 31 */ … … 36 36 #define KERN_ia64_ATOMIC_H_ 37 37 38 /** Atomic addition. 39 * 40 * @param val Atomic value. 41 * @param imm Value to add. 42 * 43 * @return Value before addition. 44 */ 45 static inline long atomic_add(atomic_t *val, int imm) 38 #include <trace.h> 39 40 NO_TRACE static inline atomic_count_t test_and_set(atomic_t *val) 46 41 { 47 long v; 48 49 asm volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), 50 "+m" (val->count) : "i" (imm)); 51 52 return v; 53 } 54 55 static inline uint64_t test_and_set(atomic_t *val) 56 { 57 uint64_t v; 58 42 atomic_count_t v; 43 59 44 asm volatile ( 60 "movl %0 = 0x1;;\n" 61 "xchg8 %0 = %1, %0;;\n" 62 : "=r" (v), "+m" (val->count) 45 "movl %[v] = 0x1;;\n" 46 "xchg8 %[v] = %[count], %[v];;\n" 47 : [v] "=r" (v), 48 [count] "+m" (val->count) 63 49 ); 64 50 … … 66 52 } 67 53 68 static inline void atomic_lock_arch(atomic_t *val)54 NO_TRACE static inline void atomic_lock_arch(atomic_t *val) 69 55 { 70 56 do { 71 while (val->count) 72 ; 57 while (val->count); 73 58 } while (test_and_set(val)); 74 59 } 75 60 76 static inline void atomic_inc(atomic_t *val)61 NO_TRACE static inline void atomic_inc(atomic_t *val) 77 62 { 78 atomic_add(val, 1); 63 atomic_count_t v; 64 65 asm volatile ( 66 "fetchadd8.rel %[v] = %[count], 1\n" 67 : [v] "=r" (v), 68 [count] "+m" (val->count) 69 ); 79 70 } 80 71 81 static inline void atomic_dec(atomic_t *val)72 NO_TRACE static inline void atomic_dec(atomic_t *val) 82 73 { 83 atomic_add(val, -1); 74 atomic_count_t v; 75 76 asm volatile ( 77 "fetchadd8.rel %[v] = %[count], -1\n" 78 : [v] "=r" (v), 79 [count] "+m" (val->count) 80 ); 84 81 } 85 82 86 static inline longatomic_preinc(atomic_t *val)83 NO_TRACE static inline atomic_count_t atomic_preinc(atomic_t *val) 87 84 { 88 return atomic_add(val, 1) + 1; 85 atomic_count_t v; 86 87 asm volatile ( 88 "fetchadd8.rel %[v] = %[count], 1\n" 89 : [v] "=r" (v), 90 [count] "+m" (val->count) 91 ); 92 93 return (v + 1); 89 94 } 90 95 91 static inline longatomic_predec(atomic_t *val)96 NO_TRACE static inline atomic_count_t atomic_predec(atomic_t *val) 92 97 { 93 return atomic_add(val, -1) - 1; 98 atomic_count_t v; 99 100 asm volatile ( 101 "fetchadd8.rel %[v] = %[count], -1\n" 102 : [v] "=r" (v), 103 [count] "+m" (val->count) 104 ); 105 106 return (v - 1); 94 107 } 95 108 96 static inline longatomic_postinc(atomic_t *val)109 NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val) 97 110 { 98 return atomic_add(val, 1); 111 atomic_count_t v; 112 113 asm volatile ( 114 "fetchadd8.rel %[v] = %[count], 1\n" 115 : [v] "=r" (v), 116 [count] "+m" (val->count) 117 ); 118 119 return v; 99 120 } 100 121 101 static inline longatomic_postdec(atomic_t *val)122 NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val) 102 123 { 103 return atomic_add(val, -1); 124 atomic_count_t v; 125 126 asm volatile ( 127 "fetchadd8.rel %[v] = %[count], -1\n" 128 : [v] "=r" (v), 129 [count] "+m" (val->count) 130 ); 131 132 return v; 104 133 } 105 134
Note:
See TracChangeset
for help on using the changeset viewer.