Ignore:
File:
1 edited

Legend:

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

    r133461c r56210a7  
    8686}
    8787
     88unsigned char __atomic_exchange_1(volatile void *mem0, unsigned char val,
     89    int model)
     90{
     91        volatile unsigned char *mem = mem0;
     92
     93        (void) model;
     94
     95        unsigned ret;
     96
     97        /*
     98         * The following instructions between labels 1 and 2 constitute a
     99         * Restartable Atomic Seqeunce. Should the sequence be non-atomic,
     100         * the kernel will restart it.
     101         */
     102        asm volatile (
     103            "1:\n"
     104            "   adr %[ret], 1b\n"
     105            "   str %[ret], %[rp0]\n"
     106            "   adr %[ret], 2f\n"
     107            "   str %[ret], %[rp1]\n"
     108            "   ldrb %[ret], %[addr]\n"
     109            "   strb %[imm], %[addr]\n"
     110            "2:\n"
     111            : [ret] "=&r" (ret),
     112              [rp0] "=m" (ras_page[0]),
     113              [rp1] "=m" (ras_page[1]),
     114              [addr] "+m" (*mem)
     115            : [imm] "r" (val)
     116        );
     117
     118        ras_page[0] = 0;
     119        ras_page[1] = 0xffffffff;
     120
     121        return ret;
     122}
     123
     124unsigned short __atomic_exchange_2(volatile void *mem0, unsigned short val,
     125    int model)
     126{
     127        volatile unsigned short *mem = mem0;
     128
     129        (void) model;
     130
     131        unsigned ret;
     132
     133        /*
     134         * The following instructions between labels 1 and 2 constitute a
     135         * Restartable Atomic Seqeunce. Should the sequence be non-atomic,
     136         * the kernel will restart it.
     137         */
     138        asm volatile (
     139            "1:\n"
     140            "   adr %[ret], 1b\n"
     141            "   str %[ret], %[rp0]\n"
     142            "   adr %[ret], 2f\n"
     143            "   str %[ret], %[rp1]\n"
     144            "   ldrh %[ret], %[addr]\n"
     145            "   strh %[imm], %[addr]\n"
     146            "2:\n"
     147            : [ret] "=&r" (ret),
     148              [rp0] "=m" (ras_page[0]),
     149              [rp1] "=m" (ras_page[1]),
     150              [addr] "+m" (*mem)
     151            : [imm] "r" (val)
     152        );
     153
     154        ras_page[0] = 0;
     155        ras_page[1] = 0xffffffff;
     156
     157        return ret;
     158}
     159
     160unsigned __atomic_exchange_4(volatile void *mem0, unsigned val, int model)
     161{
     162        volatile unsigned *mem = mem0;
     163
     164        (void) model;
     165
     166        unsigned ret;
     167
     168        /*
     169         * The following instructions between labels 1 and 2 constitute a
     170         * Restartable Atomic Seqeunce. Should the sequence be non-atomic,
     171         * the kernel will restart it.
     172         */
     173        asm volatile (
     174            "1:\n"
     175            "   adr %[ret], 1b\n"
     176            "   str %[ret], %[rp0]\n"
     177            "   adr %[ret], 2f\n"
     178            "   str %[ret], %[rp1]\n"
     179            "   ldr %[ret], %[addr]\n"
     180            "   str %[imm], %[addr]\n"
     181            "2:\n"
     182            : [ret] "=&r" (ret),
     183              [rp0] "=m" (ras_page[0]),
     184              [rp1] "=m" (ras_page[1]),
     185              [addr] "+m" (*mem)
     186            : [imm] "r" (val)
     187        );
     188
     189        ras_page[0] = 0;
     190        ras_page[1] = 0xffffffff;
     191
     192        return ret;
     193}
     194
    88195unsigned short __atomic_fetch_add_2(volatile void *mem0, unsigned short val,
    89196    int model)
     
    164271}
    165272
     273bool __atomic_test_and_set(volatile void *ptr, int memorder)
     274{
     275        volatile unsigned char *b = ptr;
     276
     277        unsigned char orig = __atomic_exchange_n(b, (unsigned char) true, memorder);
     278        return orig != 0;
     279}
     280
    166281void __sync_synchronize(void)
    167282{
Note: See TracChangeset for help on using the changeset viewer.