Ignore:
File:
1 edited

Legend:

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

    r56210a7a r25fdb2d  
    3838volatile unsigned *ras_page;
    3939
    40 bool __atomic_compare_exchange_4(volatile void *mem0, void *expected0,
    41     unsigned desired, bool weak, int success, int failure)
     40unsigned 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
     80void __atomic_store_8(volatile void *mem0, unsigned long long val, int model)
    4281{
    4382        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
     124bool __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;
    45129
    46130        (void) success;
     
    48132        (void) weak;
    49133
     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
     171bool __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
    50181        unsigned ov = *expected;
    51182        unsigned ret;
Note: See TracChangeset for help on using the changeset viewer.