Changes in uspace/lib/c/arch/arm32/src/atomic.c [51949d0:ae787807] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/arm32/src/atomic.c
r51949d0 rae787807 106 106 } 107 107 108 bool __atomic_compare_exchange_ 1(volatile void *mem0, void *expected0,109 unsigned chardesired, bool weak, int success, int failure)110 { 111 volatile unsigned char*mem = mem0;112 unsigned char*expected = expected0;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; 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 a123 * 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 165 118 unsigned ov = *expected; 166 119 unsigned ret;
Note:
See TracChangeset
for help on using the changeset viewer.