Changeset 51949d0 in mainline


Ignore:
Timestamp:
2025-04-17T19:11:34Z (36 hours ago)
Author:
GitHub <noreply@…>
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)
Message:

lib/c/arch/arm32: add atomic_compare_exchange_1 (#248)

File:
1 edited

Legend:

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

    reb2187c4 r51949d0  
    106106}
    107107
    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;
     108bool __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;
    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
     155bool __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
    118165        unsigned ov = *expected;
    119166        unsigned ret;
Note: See TracChangeset for help on using the changeset viewer.