Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2/* Copyright (c) 2019 Facebook */
3
4#ifndef __LIBBPF_LIBBPF_UTIL_H
5#define __LIBBPF_LIBBPF_UTIL_H
6
7#include <stdbool.h>
8
9#ifdef __cplusplus
10extern "C" {
11#endif
12
13extern void libbpf_print(enum libbpf_print_level level,
14 const char *format, ...)
15 __attribute__((format(printf, 2, 3)));
16
17#define __pr(level, fmt, ...) \
18do { \
19 libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \
20} while (0)
21
22#define pr_warning(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__)
23#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__)
24#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__)
25
26/* Use these barrier functions instead of smp_[rw]mb() when they are
27 * used in a libbpf header file. That way they can be built into the
28 * application that uses libbpf.
29 */
30#if defined(__i386__) || defined(__x86_64__)
31# define libbpf_smp_rmb() asm volatile("" : : : "memory")
32# define libbpf_smp_wmb() asm volatile("" : : : "memory")
33# define libbpf_smp_mb() \
34 asm volatile("lock; addl $0,-4(%%rsp)" : : : "memory", "cc")
35/* Hinders stores to be observed before older loads. */
36# define libbpf_smp_rwmb() asm volatile("" : : : "memory")
37#elif defined(__aarch64__)
38# define libbpf_smp_rmb() asm volatile("dmb ishld" : : : "memory")
39# define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory")
40# define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory")
41# define libbpf_smp_rwmb() libbpf_smp_mb()
42#elif defined(__arm__)
43/* These are only valid for armv7 and above */
44# define libbpf_smp_rmb() asm volatile("dmb ish" : : : "memory")
45# define libbpf_smp_wmb() asm volatile("dmb ishst" : : : "memory")
46# define libbpf_smp_mb() asm volatile("dmb ish" : : : "memory")
47# define libbpf_smp_rwmb() libbpf_smp_mb()
48#else
49/* Architecture missing native barrier functions. */
50# define libbpf_smp_rmb() __sync_synchronize()
51# define libbpf_smp_wmb() __sync_synchronize()
52# define libbpf_smp_mb() __sync_synchronize()
53# define libbpf_smp_rwmb() __sync_synchronize()
54#endif
55
56#ifdef __cplusplus
57} /* extern "C" */
58#endif
59
60#endif