Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bb3ba51 in mainline


Ignore:
Timestamp:
2017-08-22T18:10:29Z (3 years ago)
Author:
Martin Decky <martin@…>
Branches:
master
Children:
295ee02
Parents:
b93ea46
Message:

riscv64: atomic operations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/riscv64/include/arch/atomic.h

    rb93ea46 rbb3ba51  
    4040NO_TRACE static inline void atomic_inc(atomic_t *val)
    4141{
    42         // FIXME
     42        asm volatile (
     43                "amoadd.d zero, %[inc], %[addr]\n"
     44                : [addr] "+A" (val->count)
     45                : [inc] "r" (1)
     46        );
    4347}
    4448
    4549NO_TRACE static inline void atomic_dec(atomic_t *val)
    4650{
    47         // FIXME
     51        asm volatile (
     52                "amoadd.d zero, %[inc], %[addr]\n"
     53                : [addr] "+A" (val->count)
     54                : [inc] "r" (-1)
     55        );
    4856}
    4957
    5058NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val)
    5159{
    52         atomic_inc(val);
    53         return val->count - 1;
     60        atomic_count_t orig;
     61       
     62        asm volatile (
     63                "amoadd.d %[orig], %[inc], %[addr]\n"
     64                : [orig] "=r" (orig), [addr] "+A" (val->count)
     65                : [inc] "r" (1)
     66        );
     67       
     68        return orig;
    5469}
    5570
    5671NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val)
    5772{
    58         atomic_dec(val);
    59         return val->count + 1;
     73        atomic_count_t orig;
     74       
     75        asm volatile (
     76                "amoadd.d %[orig], %[inc], %[addr]\n"
     77                : [orig] "=r" (orig), [addr] "+A" (val->count)
     78                : [inc] "r" (-1)
     79        );
     80       
     81        return orig;
    6082}
    6183
    6284NO_TRACE static inline atomic_count_t atomic_preinc(atomic_t *val)
    6385{
    64         atomic_inc(val);
    65         return val->count;
     86        atomic_count_t orig;
     87       
     88        asm volatile (
     89                "amoadd.d %[orig], %[inc], %[addr]\n"
     90                : [orig] "=r" (orig), [addr] "+A" (val->count)
     91                : [inc] "r" (1)
     92        );
     93       
     94        return orig - 1;
    6695}
    6796
    6897NO_TRACE static inline atomic_count_t atomic_predec(atomic_t *val)
    6998{
    70         atomic_dec(val);
    71         return val->count;
     99        atomic_count_t orig;
     100       
     101        asm volatile (
     102                "amoadd.d %[orig], %[inc], %[addr]\n"
     103                : [orig] "=r" (orig), [addr] "+A" (val->count)
     104                : [inc] "r" (-1)
     105        );
     106       
     107        return orig + 1;
    72108}
    73109
Note: See TracChangeset for help on using the changeset viewer.