coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
atomic.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-4-Clause-UC */
2 
3 #ifndef _RISCV_ATOMIC_H
4 #define _RISCV_ATOMIC_H
5 
6 #include <arch/encoding.h>
7 
8 typedef struct { volatile int counter; } atomic_t;
9 
10 #define disable_irqsave() clear_csr(mstatus, MSTATUS_MIE)
11 #define enable_irqrestore(flags) set_csr(mstatus, (flags) & MSTATUS_MIE)
12 
13 #define atomic_set(v, val) ((v)->counter = (val))
14 #define atomic_read(v) ((v)->counter)
15 
16 #ifdef __riscv_atomic
17 # define atomic_add(v, inc) __sync_fetch_and_add(&((v)->counter), inc)
18 # define atomic_swap(v, swp) __sync_lock_test_and_set(&((v)->counter), swp)
19 # define atomic_cas(v, cmp, swp) __sync_val_compare_and_swap(&((v)->counter), \
20  cmp, swp)
21 # define atomic_inc(v) atomic_add(v, 1)
22 # define atomic_dec(v) atomic_add(v, -1)
23 #else
24 static inline int atomic_add(atomic_t *v, int inc)
25 {
26  long flags = disable_irqsave();
27  int res = v->counter;
28  v->counter += inc;
29  enable_irqrestore(flags);
30  return res;
31 }
32 
33 static inline int atomic_swap(atomic_t *v, int swp)
34 {
35  long flags = disable_irqsave();
36  int res = v->counter;
37  v->counter = swp;
38  enable_irqrestore(flags);
39  return res;
40 }
41 
42 static inline int atomic_cas(atomic_t *v, int cmp, int swp)
43 {
44  long flags = disable_irqsave();
45  int res = v->counter;
46  v->counter = (res == cmp ? swp : res);
47  enable_irqrestore(flags);
48  return res;
49 }
50 
51 static inline int atomic_inc(atomic_t *v)
52 {
53  return atomic_add(v, 1);
54 }
55 
56 static inline int atomic_dec(atomic_t *v)
57 {
58  return atomic_add(v, -1);
59 }
60 #endif //__riscv_atomic
61 
62 #endif //_RISCV_ATOMIC_H
#define enable_irqrestore(flags)
Definition: atomic.h:11
static int atomic_dec(atomic_t *v)
Definition: atomic.h:56
#define disable_irqsave()
Definition: atomic.h:10
static int atomic_cas(atomic_t *v, int cmp, int swp)
Definition: atomic.h:42
static int atomic_add(atomic_t *v, int inc)
Definition: atomic.h:24
static int atomic_inc(atomic_t *v)
Definition: atomic.h:51
static int atomic_swap(atomic_t *v, int swp)
Definition: atomic.h:33
Definition: atomic.h:8
volatile int counter
Definition: atomic.h:8