Changeset 208b5f5 in mainline for kernel/arch/sparc32/include/arch/atomic.h
- Timestamp:
- 2013-12-29T14:32:55Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4c14b88, 6fa9a99d, 9be30cdf, aacdb8e
- Parents:
- 2a13328
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc32/include/arch/atomic.h
r2a13328 r208b5f5 37 37 38 38 #include <typedefs.h> 39 #include <arch/asm.h> 39 40 #include <arch/barrier.h> 40 41 #include <preemption.h> … … 47 48 REQUIRES(val->count < ATOMIC_COUNT_MAX) 48 49 { 49 // FIXME TODO 50 // FIXME: Isn't there any intrinsic atomic operation? 51 ipl_t ipl = interrupts_disable(); 50 52 val->count++; 53 interrupts_restore(ipl); 51 54 } 52 55 … … 56 59 REQUIRES(val->count > ATOMIC_COUNT_MIN) 57 60 { 58 // FIXME TODO 61 // FIXME: Isn't there any intrinsic atomic operation? 62 ipl_t ipl = interrupts_disable(); 59 63 val->count--; 64 interrupts_restore(ipl); 60 65 } 61 66 … … 65 70 REQUIRES(val->count < ATOMIC_COUNT_MAX) 66 71 { 67 // FIXME TODO72 // FIXME: Isn't there any intrinsic atomic operation? 68 73 74 ipl_t ipl = interrupts_disable(); 69 75 atomic_count_t prev = val->count; 70 76 71 77 val->count++; 78 interrupts_restore(ipl); 72 79 return prev; 73 80 } … … 78 85 REQUIRES(val->count > ATOMIC_COUNT_MIN) 79 86 { 80 // FIXME TODO87 // FIXME: Isn't there any intrinsic atomic operation? 81 88 89 ipl_t ipl = interrupts_disable(); 82 90 atomic_count_t prev = val->count; 83 91 84 92 val->count--; 93 interrupts_restore(ipl); 85 94 return prev; 86 95 } … … 93 102 REQUIRES_EXTENT_MUTABLE(val) 94 103 { 95 // FIXME TODO 104 atomic_count_t prev; 105 volatile uintptr_t ptr = (uintptr_t) &val->count; 96 106 97 atomic_count_t prev = val->count; 98 val->count = 1; 107 asm volatile ( 108 "ldstub [%[ptr]] %[prev]\n" 109 : [prev] "=r" (prev) 110 : [ptr] "r" (ptr) 111 : "memory" 112 ); 113 99 114 return prev; 100 115 } … … 104 119 REQUIRES_EXTENT_MUTABLE(val) 105 120 { 106 // FIXME TODO121 atomic_count_t tmp1 = 0; 107 122 108 do { 109 while (val->count); 110 } while (test_and_set(val)); 123 volatile uintptr_t ptr = (uintptr_t) &val->count; 124 125 preemption_disable(); 126 127 asm volatile ( 128 "0:\n" 129 "ldstub %0, %1\n" 130 "tst %1\n" 131 "be 2f\n" 132 "nop\n" 133 "1:\n" 134 "ldub %0, %1\n" 135 "tst %1\n" 136 "bne 1b\n" 137 "nop\n" 138 "ba,a 0b\n" 139 "2:\n" 140 : "+m" (*((atomic_count_t *) ptr)), 141 "+r" (tmp1) 142 : "r" (0) 143 ); 144 145 /* 146 * Prevent critical section code from bleeding out this way up. 147 */ 148 CS_ENTER_BARRIER(); 111 149 } 112 150
Note:
See TracChangeset
for help on using the changeset viewer.