Changes in / [94abc30c:634340fd] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/arch/arm32/src/atomic.c

    r94abc30c r634340fd  
    106106}
    107107
    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;
     108bool __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;
    113113
    114114        (void) success;
     
    116116        (void) weak;
    117117
    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 
    165118        unsigned ov = *expected;
    166119        unsigned ret;
Note: See TracChangeset for help on using the changeset viewer.