1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2 /* Copyright (c) 2019 Facebook */
4 #ifndef __LIBBPF_LIBBPF_UTIL_H
5 #define __LIBBPF_LIBBPF_UTIL_H
8 #include <linux/compiler.h>
14 /* Use these barrier functions instead of smp_[rw]mb() when they are
15 * used in a libbpf header file. That way they can be built into the
16 * application that uses libbpf.
18 #if defined(__i386__) || defined(__x86_64__)
19 # define libbpf_smp_store_release(p, v) \
21 asm volatile("" : : : "memory"); \
24 # define libbpf_smp_load_acquire(p) \
26 typeof(*p) ___p1 = READ_ONCE(*p); \
27 asm volatile("" : : : "memory"); \
30 #elif defined(__aarch64__)
31 # define libbpf_smp_store_release(p, v) \
32 asm volatile ("stlr %w1, %0" : "=Q" (*p) : "r" (v) : "memory")
33 # define libbpf_smp_load_acquire(p) \
36 asm volatile ("ldar %w0, %1" \
37 : "=r" (___p1) : "Q" (*p) : "memory"); \
40 #elif defined(__riscv)
41 # define libbpf_smp_store_release(p, v) \
43 asm volatile ("fence rw,w" : : : "memory"); \
46 # define libbpf_smp_load_acquire(p) \
48 typeof(*p) ___p1 = READ_ONCE(*p); \
49 asm volatile ("fence r,rw" : : : "memory"); \
54 #ifndef libbpf_smp_store_release
55 #define libbpf_smp_store_release(p, v) \
57 __sync_synchronize(); \
62 #ifndef libbpf_smp_load_acquire
63 #define libbpf_smp_load_acquire(p) \
65 typeof(*p) ___p1 = READ_ONCE(*p); \
66 __sync_synchronize(); \