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