18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
28c2ecf20Sopenharmony_ci/* Copyright (c) 2019 Facebook */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef __LIBBPF_LIBBPF_UTIL_H
58c2ecf20Sopenharmony_ci#define __LIBBPF_LIBBPF_UTIL_H
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <stdbool.h>
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef __cplusplus
108c2ecf20Sopenharmony_ciextern "C" {
118c2ecf20Sopenharmony_ci#endif
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* Use these barrier functions instead of smp_[rw]mb() when they are
148c2ecf20Sopenharmony_ci * used in a libbpf header file. That way they can be built into the
158c2ecf20Sopenharmony_ci * application that uses libbpf.
168c2ecf20Sopenharmony_ci */
178c2ecf20Sopenharmony_ci#if defined(__i386__) || defined(__x86_64__)
188c2ecf20Sopenharmony_ci# define libbpf_smp_rmb() asm volatile("" : : : "memory")
198c2ecf20Sopenharmony_ci# define libbpf_smp_wmb() asm volatile("" : : : "memory")
208c2ecf20Sopenharmony_ci# define libbpf_smp_mb() \
218c2ecf20Sopenharmony_ci	asm volatile("lock; addl $0,-4(%%rsp)" : : : "memory", "cc")
228c2ecf20Sopenharmony_ci/* Hinders stores to be observed before older loads. */
238c2ecf20Sopenharmony_ci# define libbpf_smp_rwmb() asm volatile("" : : : "memory")
248c2ecf20Sopenharmony_ci#elif defined(__aarch64__)
258c2ecf20Sopenharmony_ci# define libbpf_smp_rmb() asm volatile("dmb ishld" : : : "memory")
268c2ecf20Sopenharmony_ci# define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory")
278c2ecf20Sopenharmony_ci# define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory")
288c2ecf20Sopenharmony_ci# define libbpf_smp_rwmb() libbpf_smp_mb()
298c2ecf20Sopenharmony_ci#elif defined(__arm__)
308c2ecf20Sopenharmony_ci/* These are only valid for armv7 and above */
318c2ecf20Sopenharmony_ci# define libbpf_smp_rmb() asm volatile("dmb ish" : : : "memory")
328c2ecf20Sopenharmony_ci# define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory")
338c2ecf20Sopenharmony_ci# define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory")
348c2ecf20Sopenharmony_ci# define libbpf_smp_rwmb() libbpf_smp_mb()
358c2ecf20Sopenharmony_ci#else
368c2ecf20Sopenharmony_ci/* Architecture missing native barrier functions. */
378c2ecf20Sopenharmony_ci# define libbpf_smp_rmb() __sync_synchronize()
388c2ecf20Sopenharmony_ci# define libbpf_smp_wmb() __sync_synchronize()
398c2ecf20Sopenharmony_ci# define libbpf_smp_mb() __sync_synchronize()
408c2ecf20Sopenharmony_ci# define libbpf_smp_rwmb() __sync_synchronize()
418c2ecf20Sopenharmony_ci#endif
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci#ifdef __cplusplus
448c2ecf20Sopenharmony_ci} /* extern "C" */
458c2ecf20Sopenharmony_ci#endif
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#endif
48