Changeset 67cdc670 in mainline


Ignore:
Timestamp:
2025-04-16T22:16:24Z (2 days ago)
Author:
Miroslav Cimerman <mc@…>
Parents:
da54714
git-author:
Miroslav Cimerman <mc@…> (2025-04-03 16:03:51)
git-committer:
Miroslav Cimerman <mc@…> (2025-04-16 22:16:24)
Message:

lib/c/arch/arm32: add atomic_{load,store}_8

File:
1 edited

Legend:

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

    rda54714 r67cdc670  
    3838volatile unsigned *ras_page;
    3939
     40unsigned long long __atomic_load_8(const volatile void *mem0, int model)
     41{
     42        const volatile unsigned long long *mem = mem0;
     43
     44        (void) model;
     45
     46        unsigned long long ret;
     47
     48        /*
     49         * The following instructions between labels 1 and 2 constitute a
     50         * Restartable Atomic Seqeunce. Should the sequence be non-atomic,
     51         * the kernel will restart it.
     52         */
     53        asm volatile (
     54            "1:\n"
     55            "   adr %[ret], 1b\n"
     56            "   str %[ret], %[rp0]\n"
     57            "   adr %[ret], 2f\n"
     58            "   str %[ret], %[rp1]\n"
     59
     60            "   ldrd %[ret], %[addr]\n"
     61            "2:\n"
     62            : [ret] "=&r" (ret),
     63              [rp0] "=m" (ras_page[0]),
     64              [rp1] "=m" (ras_page[1])
     65            : [addr] "m" (*mem)
     66        );
     67
     68        ras_page[0] = 0;
     69        ras_page[1] = 0xffffffff;
     70
     71        return ret;
     72}
     73
     74void __atomic_store_8(volatile void *mem0, unsigned long long val, int model)
     75{
     76        volatile unsigned long long *mem = mem0;
     77
     78        (void) model;
     79
     80        /* scratch register */
     81        unsigned tmp;
     82
     83        /*
     84         * The following instructions between labels 1 and 2 constitute a
     85         * Restartable Atomic Seqeunce. Should the sequence be non-atomic,
     86         * the kernel will restart it.
     87         */
     88        asm volatile (
     89            "1:\n"
     90            "   adr %[tmp], 1b\n"
     91            "   str %[tmp], %[rp0]\n"
     92            "   adr %[tmp], 2f\n"
     93            "   str %[tmp], %[rp1]\n"
     94
     95            "   strd %[imm], %[addr]\n"
     96            "2:\n"
     97            : [tmp] "=&r" (tmp),
     98              [rp0] "=m" (ras_page[0]),
     99              [rp1] "=m" (ras_page[1]),
     100              [addr] "=m" (*mem)
     101            : [imm] "r" (val)
     102        );
     103
     104        ras_page[0] = 0;
     105        ras_page[1] = 0xffffffff;
     106}
     107
    40108bool __atomic_compare_exchange_4(volatile void *mem0, void *expected0,
    41109    unsigned desired, bool weak, int success, int failure)
Note: See TracChangeset for help on using the changeset viewer.