Changeset 371bd7d in mainline for kernel/arch/arm32/include/atomic.h
- Timestamp:
- 2010-03-27T09:22:17Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 36a75a2
- Parents:
- cd82bb1 (diff), eaf22d4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
kernel/arch/arm32/include/atomic.h (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/include/atomic.h
rcd82bb1 r371bd7d 37 37 #define KERN_arm32_ATOMIC_H_ 38 38 39 #include <arch/asm.h> 40 39 41 /** Atomic addition. 40 42 * … … 45 47 * 46 48 */ 47 static inline long atomic_add(atomic_t *val, int i)49 static inline atomic_count_t atomic_add(atomic_t *val, atomic_count_t i) 48 50 { 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 ); 51 /* 52 * This implementation is for UP pre-ARMv6 systems where we do not have 53 * the LDREX and STREX instructions. 54 */ 55 ipl_t ipl = interrupts_disable(); 56 val->count += i; 57 atomic_count_t ret = val->count; 58 interrupts_restore(ipl); 64 59 65 60 return ret; … … 69 64 * 70 65 * @param val Variable to be incremented. 66 * 71 67 */ 72 68 static inline void atomic_inc(atomic_t *val) … … 78 74 * 79 75 * @param val Variable to be decremented. 76 * 80 77 */ 81 78 static inline void atomic_dec(atomic_t *val) { … … 87 84 * @param val Variable to be incremented. 88 85 * @return Value after incrementation. 86 * 89 87 */ 90 static inline longatomic_preinc(atomic_t *val)88 static inline atomic_count_t atomic_preinc(atomic_t *val) 91 89 { 92 90 return atomic_add(val, 1); … … 97 95 * @param val Variable to be decremented. 98 96 * @return Value after decrementation. 97 * 99 98 */ 100 static inline longatomic_predec(atomic_t *val)99 static inline atomic_count_t atomic_predec(atomic_t *val) 101 100 { 102 101 return atomic_add(val, -1); … … 107 106 * @param val Variable to be incremented. 108 107 * @return Value before incrementation. 108 * 109 109 */ 110 static inline longatomic_postinc(atomic_t *val)110 static inline atomic_count_t atomic_postinc(atomic_t *val) 111 111 { 112 112 return atomic_add(val, 1) - 1; … … 117 117 * @param val Variable to be decremented. 118 118 * @return Value before decrementation. 119 * 119 120 */ 120 static inline longatomic_postdec(atomic_t *val)121 static inline atomic_count_t atomic_postdec(atomic_t *val) 121 122 { 122 123 return atomic_add(val, -1) + 1;
Note:
See TracChangeset
for help on using the changeset viewer.
