coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
barrier.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Based on arch/arm/include/asm/barrier.h
4  */
5 #ifndef __ASM_ARM_BARRIER_H
6 #define __ASM_ARM_BARRIER_H
7 
8 #ifndef __ASSEMBLER__
9 
10 #define sevl() asm volatile("sevl" : : : "memory")
11 #define sev() asm volatile("sev" : : : "memory")
12 #define wfe() asm volatile("wfe" : : : "memory")
13 #define wfi() asm volatile("wfi" : : : "memory")
14 
15 #define isb() asm volatile("isb" : : : "memory")
16 #define dsb() asm volatile("dsb sy" : : : "memory")
17 #define dmb() asm volatile("dmb sy" : : : "memory")
18 
19 #define mb() dsb()
20 #define rmb() asm volatile("dsb ld" : : : "memory")
21 #define wmb() asm volatile("dsb st" : : : "memory")
22 
23 #if CONFIG(SMP)
24 #define barrier() __asm__ __volatile__("": : :"memory")
25 #endif
26 
27 #define nop() asm volatile("nop");
28 
29 #define force_read(x) (*(volatile typeof(x) *)&(x))
30 
31 #define load_acquire(p) \
32 ({ \
33  typeof(*p) ___p1; \
34  switch (sizeof(*p)) { \
35  case 4: \
36  asm volatile ("ldar %w0, %1" \
37  : "=r" (___p1) : "Q" (*p) : "memory"); \
38  break; \
39  case 8: \
40  asm volatile ("ldar %0, %1" \
41  : "=r" (___p1) : "Q" (*p) : "memory"); \
42  break; \
43  } \
44  ___p1; \
45 })
46 
47 #define store_release(p, v) \
48 do { \
49  switch (sizeof(*p)) { \
50  case 4: \
51  asm volatile ("stlr %w1, %0" \
52  : "=Q" (*p) : "r" (v) : "memory"); \
53  break; \
54  case 8: \
55  asm volatile ("stlr %1, %0" \
56  : "=Q" (*p) : "r" (v) : "memory"); \
57  break; \
58  } \
59 } while (0)
60 
61 #define load_acquire_exclusive(p) \
62 ({ \
63  typeof(*p) ___p1; \
64  switch (sizeof(*p)) { \
65  case 4: \
66  asm volatile ("ldaxr %w0, %1" \
67  : "=r" (___p1) : "Q" (*p) : "memory"); \
68  break; \
69  case 8: \
70  asm volatile ("ldaxr %0, %1" \
71  : "=r" (___p1) : "Q" (*p) : "memory"); \
72  break; \
73  } \
74  ___p1; \
75 })
76 
77 /* Returns 1 on success. */
78 #define store_release_exclusive(p, v) \
79 ({ \
80  int ret; \
81  switch (sizeof(*p)) { \
82  case 4: \
83  asm volatile ("stlxr %w0, %w2, %1" \
84  : "=&r" (ret), "=Q" (*p) : "r" (v) \
85  : "memory"); \
86  break; \
87  case 8: \
88  asm volatile ("stlxr %w0, %2, %1" \
89  : "=&r" (ret), "=Q" (*p) : "r" (v) \
90  : "memory"); \
91  break; \
92  } \
93  !ret; \
94 })
95 
96 #endif /* __ASSEMBLER__ */
97 
98 #endif /* __ASM_ARM_BARRIER_H */