Changes in uspace/lib/c/arch/arm32/src/atomic.c [56210a7a:25fdb2d] in mainline
- File:
-
- 1 edited
-
uspace/lib/c/arch/arm32/src/atomic.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/arm32/src/atomic.c
r56210a7a r25fdb2d 38 38 volatile unsigned *ras_page; 39 39 40 bool __atomic_compare_exchange_4(volatile void *mem0, void *expected0, 41 unsigned desired, bool weak, int success, int failure) 40 unsigned long long __atomic_load_8(const volatile void *mem0, int model) 41 { 42 const volatile unsigned *mem = mem0; 43 44 (void) model; 45 46 union { 47 unsigned long long a; 48 unsigned b[2]; 49 } ret; 50 51 /* 52 * The following instructions between labels 1 and 2 constitute a 53 * Restartable Atomic Seqeunce. Should the sequence be non-atomic, 54 * the kernel will restart it. 55 */ 56 asm volatile ( 57 "1:\n" 58 " adr %[ret0], 1b\n" 59 " str %[ret0], %[rp0]\n" 60 " adr %[ret0], 2f\n" 61 " str %[ret0], %[rp1]\n" 62 63 " ldr %[ret0], %[addr0]\n" 64 " ldr %[ret1], %[addr1]\n" 65 "2:\n" 66 : [ret0] "=&r" (ret.b[0]), 67 [ret1] "=&r" (ret.b[1]), 68 [rp0] "=m" (ras_page[0]), 69 [rp1] "=m" (ras_page[1]) 70 : [addr0] "m" (mem[0]), 71 [addr1] "m" (mem[1]) 72 ); 73 74 ras_page[0] = 0; 75 ras_page[1] = 0xffffffff; 76 77 return ret.a; 78 } 79 80 void __atomic_store_8(volatile void *mem0, unsigned long long val, int model) 42 81 { 43 82 volatile unsigned *mem = mem0; 44 unsigned *expected = expected0; 83 84 (void) model; 85 86 union { 87 unsigned long long a; 88 unsigned b[2]; 89 } v; 90 91 v.a = val; 92 93 /* scratch register */ 94 unsigned tmp; 95 96 /* 97 * The following instructions between labels 1 and 2 constitute a 98 * Restartable Atomic Seqeunce. Should the sequence be non-atomic, 99 * the kernel will restart it. 100 */ 101 asm volatile ( 102 "1:\n" 103 " adr %[tmp], 1b\n" 104 " str %[tmp], %[rp0]\n" 105 " adr %[tmp], 2f\n" 106 " str %[tmp], %[rp1]\n" 107 108 " str %[val0], %[addr0]\n" 109 " str %[val1], %[addr1]\n" 110 "2:\n" 111 : [tmp] "=&r" (tmp), 112 [rp0] "=m" (ras_page[0]), 113 [rp1] "=m" (ras_page[1]), 114 [addr0] "=m" (mem[0]), 115 [addr1] "=m" (mem[1]) 116 : [val0] "r" (v.b[0]), 117 [val1] "r" (v.b[1]) 118 ); 119 120 ras_page[0] = 0; 121 ras_page[1] = 0xffffffff; 122 } 123 124 bool __atomic_compare_exchange_1(volatile void *mem0, void *expected0, 125 unsigned char desired, bool weak, int success, int failure) 126 { 127 volatile unsigned char *mem = mem0; 128 unsigned char *expected = expected0; 45 129 46 130 (void) success; … … 48 132 (void) weak; 49 133 134 unsigned char ov = *expected; 135 unsigned ret; 136 137 /* 138 * The following instructions between labels 1 and 2 constitute a 139 * Restartable Atomic Sequence. Should the sequence be non-atomic, 140 * the kernel will restart it. 141 */ 142 asm volatile ( 143 "1:\n" 144 " adr %[ret], 1b\n" 145 " str %[ret], %[rp0]\n" 146 " adr %[ret], 2f\n" 147 " str %[ret], %[rp1]\n" 148 149 " ldrb %[ret], %[addr]\n" 150 " cmp %[ret], %[ov]\n" 151 " streqb %[nv], %[addr]\n" 152 "2:\n" 153 : [ret] "=&r" (ret), 154 [rp0] "=m" (ras_page[0]), 155 [rp1] "=m" (ras_page[1]), 156 [addr] "+m" (*mem) 157 : [ov] "r" (ov), 158 [nv] "r" (desired) 159 ); 160 161 ras_page[0] = 0; 162 ras_page[1] = 0xffffffff; 163 164 if (ret == ov) 165 return true; 166 167 *expected = ret; 168 return false; 169 } 170 171 bool __atomic_compare_exchange_4(volatile void *mem0, void *expected0, 172 unsigned desired, bool weak, int success, int failure) 173 { 174 volatile unsigned *mem = mem0; 175 unsigned *expected = expected0; 176 177 (void) success; 178 (void) failure; 179 (void) weak; 180 50 181 unsigned ov = *expected; 51 182 unsigned ret;
Note:
See TracChangeset
for help on using the changeset viewer.
