Changeset 6b781c0 in mainline for kernel/arch/arm32/include/atomic.h
- Timestamp:
- 2007-06-08T15:02:49Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c03ee1c
- Parents:
- 3ee8a075
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/arm32/include/atomic.h
r3ee8a075 r6b781c0 1 1 /* 2 * Copyright (c) 200 5 Ondrej Palkovsky2 * Copyright (c) 2007 Michal Kebrt 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 /** @file 32 /** @file 33 * @brief Atomic operations. 33 34 */ 34 35 … … 36 37 #define KERN_arm32_ATOMIC_H_ 37 38 38 #define atomic_inc(x) ((void) atomic_add(x, 1)) 39 #define atomic_dec(x) ((void) atomic_add(x, -1)) 40 41 #define atomic_postinc(x) (atomic_add(x, 1) - 1) 42 #define atomic_postdec(x) (atomic_add(x, -1) + 1) 43 44 #define atomic_preinc(x) atomic_add(x, 1) 45 #define atomic_predec(x) atomic_add(x, -1) 46 47 /* Atomic addition of immediate value. 39 /** Atomic addition. 48 40 * 49 * @param val Memory location to which will be the immediate value added.50 * @param i Signed immediate that will be added to *val.41 * @param val Where to add. 42 * @param i Value to be added. 51 43 * 52 44 * @return Value after addition. … … 54 46 static inline long atomic_add(atomic_t *val, int i) 55 47 { 56 /* TODO */ 57 return (val->count += i); 48 int ret; 49 volatile long *mem = &(val->count); 50 51 asm volatile ( 52 "1:\n" 53 "ldr r2, [%1] \n" 54 "add r3, r2, %2 \n" 55 "str r3, %0 \n" 56 "swp r3, r3, [%1] \n" 57 "cmp r3, r2 \n" 58 "bne 1b \n" 59 60 : "=m" (ret) 61 : "r" (mem), "r" (i) 62 : "r3", "r2" 63 ); 64 65 return ret; 66 } 67 68 /** Atomic increment. 69 * 70 * @param val Variable to be incremented. 71 */ 72 static inline void atomic_inc(atomic_t *val) 73 { 74 atomic_add(val, 1); 75 } 76 77 /** Atomic decrement. 78 * 79 * @param val Variable to be decremented. 80 */ 81 static inline void atomic_dec(atomic_t *val) { 82 atomic_add(val, -1); 83 } 84 85 /** Atomic pre-increment. 86 * 87 * @param val Variable to be incremented. 88 * @return Value after incrementation. 89 */ 90 static inline long atomic_preinc(atomic_t *val) 91 { 92 return atomic_add(val, 1); 93 } 94 95 /** Atomic pre-decrement. 96 * 97 * @param val Variable to be decremented. 98 * @return Value after decrementation. 99 */ 100 static inline long atomic_predec(atomic_t *val) 101 { 102 return atomic_add(val, -1); 103 } 104 105 /** Atomic post-increment. 106 * 107 * @param val Variable to be incremented. 108 * @return Value before incrementation. 109 */ 110 static inline long atomic_postinc(atomic_t *val) 111 { 112 return atomic_add(val, 1) - 1; 113 } 114 115 /** Atomic post-decrement. 116 * 117 * @param val Variable to be decremented. 118 * @return Value before decrementation. 119 */ 120 static inline long atomic_postdec(atomic_t *val) 121 { 122 return atomic_add(val, -1) + 1; 58 123 } 59 124
Note:
See TracChangeset
for help on using the changeset viewer.