Changes in kernel/arch/arm32/include/atomic.h [e762b43:7a0359b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/include/atomic.h
re762b43 r7a0359b 37 37 #define KERN_arm32_ATOMIC_H_ 38 38 39 #include <arch/asm.h> 40 #include <trace.h> 41 39 42 /** Atomic addition. 40 43 * … … 45 48 * 46 49 */ 47 static inline long atomic_add(atomic_t *val, int i) 50 NO_TRACE static inline atomic_count_t atomic_add(atomic_t *val, 51 atomic_count_t i) 48 52 { 49 int ret; 50 volatile long *mem = &(val->count); 51 52 asm volatile ( 53 "1:\n" 54 "ldr r2, [%[mem]]\n" 55 "add r3, r2, %[i]\n" 56 "str r3, %[ret]\n" 57 "swp r3, r3, [%[mem]]\n" 58 "cmp r3, r2\n" 59 "bne 1b\n" 60 : [ret] "=m" (ret) 61 : [mem] "r" (mem), [i] "r" (i) 62 : "r3", "r2" 63 ); 53 /* 54 * This implementation is for UP pre-ARMv6 systems where we do not have 55 * the LDREX and STREX instructions. 56 */ 57 ipl_t ipl = interrupts_disable(); 58 val->count += i; 59 atomic_count_t ret = val->count; 60 interrupts_restore(ipl); 64 61 65 62 return ret; … … 69 66 * 70 67 * @param val Variable to be incremented. 68 * 71 69 */ 72 static inline void atomic_inc(atomic_t *val)70 NO_TRACE static inline void atomic_inc(atomic_t *val) 73 71 { 74 72 atomic_add(val, 1); … … 78 76 * 79 77 * @param val Variable to be decremented. 78 * 80 79 */ 81 static inline void atomic_dec(atomic_t *val) {80 NO_TRACE static inline void atomic_dec(atomic_t *val) { 82 81 atomic_add(val, -1); 83 82 } … … 87 86 * @param val Variable to be incremented. 88 87 * @return Value after incrementation. 88 * 89 89 */ 90 static inline longatomic_preinc(atomic_t *val)90 NO_TRACE static inline atomic_count_t atomic_preinc(atomic_t *val) 91 91 { 92 92 return atomic_add(val, 1); … … 97 97 * @param val Variable to be decremented. 98 98 * @return Value after decrementation. 99 * 99 100 */ 100 static inline longatomic_predec(atomic_t *val)101 NO_TRACE static inline atomic_count_t atomic_predec(atomic_t *val) 101 102 { 102 103 return atomic_add(val, -1); … … 107 108 * @param val Variable to be incremented. 108 109 * @return Value before incrementation. 110 * 109 111 */ 110 static inline longatomic_postinc(atomic_t *val)112 NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val) 111 113 { 112 114 return atomic_add(val, 1) - 1; … … 117 119 * @param val Variable to be decremented. 118 120 * @return Value before decrementation. 121 * 119 122 */ 120 static inline longatomic_postdec(atomic_t *val)123 NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val) 121 124 { 122 125 return atomic_add(val, -1) + 1;
Note:
See TracChangeset
for help on using the changeset viewer.