Changeset 51949d0 in mainline
- Timestamp:
- 2025-04-17T19:11:34Z (36 hours ago)
- Branches:
- master
- Children:
- 94abc30c, e9bc927
- Parents:
- eb2187c4
- git-author:
- Miroslav Cimerman <70661600+mcimerman@…> (2025-04-17 19:11:34)
- git-committer:
- GitHub <noreply@…> (2025-04-17 19:11:34)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/arm32/src/atomic.c
reb2187c4 r51949d0 106 106 } 107 107 108 bool __atomic_compare_exchange_ 4(volatile void *mem0, void *expected0,109 unsigned desired, bool weak, int success, int failure)110 { 111 volatile unsigned *mem = mem0;112 unsigned *expected = expected0;108 bool __atomic_compare_exchange_1(volatile void *mem0, void *expected0, 109 unsigned char desired, bool weak, int success, int failure) 110 { 111 volatile unsigned char *mem = mem0; 112 unsigned char *expected = expected0; 113 113 114 114 (void) success; … … 116 116 (void) weak; 117 117 118 unsigned char ov = *expected; 119 unsigned ret; 120 121 /* 122 * The following instructions between labels 1 and 2 constitute a 123 * Restartable Atomic Sequence. Should the sequence be non-atomic, 124 * the kernel will restart it. 125 */ 126 asm volatile ( 127 "1:\n" 128 " adr %[ret], 1b\n" 129 " str %[ret], %[rp0]\n" 130 " adr %[ret], 2f\n" 131 " str %[ret], %[rp1]\n" 132 133 " ldrb %[ret], %[addr]\n" 134 " cmp %[ret], %[ov]\n" 135 " streqb %[nv], %[addr]\n" 136 "2:\n" 137 : [ret] "=&r" (ret), 138 [rp0] "=m" (ras_page[0]), 139 [rp1] "=m" (ras_page[1]), 140 [addr] "+m" (*mem) 141 : [ov] "r" (ov), 142 [nv] "r" (desired) 143 ); 144 145 ras_page[0] = 0; 146 ras_page[1] = 0xffffffff; 147 148 if (ret == ov) 149 return true; 150 151 *expected = ret; 152 return false; 153 } 154 155 bool __atomic_compare_exchange_4(volatile void *mem0, void *expected0, 156 unsigned desired, bool weak, int success, int failure) 157 { 158 volatile unsigned *mem = mem0; 159 unsigned *expected = expected0; 160 161 (void) success; 162 (void) failure; 163 (void) weak; 164 118 165 unsigned ov = *expected; 119 166 unsigned ret;
Note:
See TracChangeset
for help on using the changeset viewer.