2019-02-01 16:14:14 -08:00
|
|
|
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
|
|
|
|
|
/* Copyright (c) 2019 Facebook */
|
|
|
|
|
|
|
|
|
|
#ifndef __LIBBPF_LIBBPF_UTIL_H
|
|
|
|
|
#define __LIBBPF_LIBBPF_UTIL_H
|
|
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
2021-03-10 09:09:28 +01:00
|
|
|
/* Load-Acquire Store-Release barriers used by the XDP socket
|
|
|
|
|
* library. The following macros should *NOT* be considered part of
|
|
|
|
|
* the xsk.h API, and is subject to change anytime.
|
|
|
|
|
*
|
|
|
|
|
* LIBRARY INTERNAL
|
2019-04-16 14:58:11 +02:00
|
|
|
*/
|
2021-03-10 09:09:28 +01:00
|
|
|
|
|
|
|
|
#define __XSK_READ_ONCE(x) (*(volatile typeof(x) *)&x)
|
|
|
|
|
#define __XSK_WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v)
|
|
|
|
|
|
2019-04-16 14:58:11 +02:00
|
|
|
#if defined(__i386__) || defined(__x86_64__)
|
2021-03-05 10:41:13 +01:00
|
|
|
# define libbpf_smp_store_release(p, v) \
|
|
|
|
|
do { \
|
|
|
|
|
asm volatile("" : : : "memory"); \
|
2021-03-10 09:09:28 +01:00
|
|
|
__XSK_WRITE_ONCE(*p, v); \
|
2021-03-05 10:41:13 +01:00
|
|
|
} while (0)
|
|
|
|
|
# define libbpf_smp_load_acquire(p) \
|
|
|
|
|
({ \
|
2021-03-10 09:09:28 +01:00
|
|
|
typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
|
2021-03-05 10:41:13 +01:00
|
|
|
asm volatile("" : : : "memory"); \
|
|
|
|
|
___p1; \
|
|
|
|
|
})
|
2019-04-16 14:58:11 +02:00
|
|
|
#elif defined(__aarch64__)
|
2021-03-05 10:41:13 +01:00
|
|
|
# define libbpf_smp_store_release(p, v) \
|
|
|
|
|
asm volatile ("stlr %w1, %0" : "=Q" (*p) : "r" (v) : "memory")
|
|
|
|
|
# define libbpf_smp_load_acquire(p) \
|
|
|
|
|
({ \
|
|
|
|
|
typeof(*p) ___p1; \
|
|
|
|
|
asm volatile ("ldar %w0, %1" \
|
|
|
|
|
: "=r" (___p1) : "Q" (*p) : "memory"); \
|
2021-03-08 19:25:22 +01:00
|
|
|
___p1; \
|
2021-03-05 10:41:13 +01:00
|
|
|
})
|
|
|
|
|
#elif defined(__riscv)
|
|
|
|
|
# define libbpf_smp_store_release(p, v) \
|
|
|
|
|
do { \
|
|
|
|
|
asm volatile ("fence rw,w" : : : "memory"); \
|
2021-03-10 09:09:28 +01:00
|
|
|
__XSK_WRITE_ONCE(*p, v); \
|
2021-03-05 10:41:13 +01:00
|
|
|
} while (0)
|
|
|
|
|
# define libbpf_smp_load_acquire(p) \
|
|
|
|
|
({ \
|
2021-03-10 09:09:28 +01:00
|
|
|
typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
|
2021-03-05 10:41:13 +01:00
|
|
|
asm volatile ("fence r,rw" : : : "memory"); \
|
|
|
|
|
___p1; \
|
|
|
|
|
})
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef libbpf_smp_store_release
|
|
|
|
|
#define libbpf_smp_store_release(p, v) \
|
|
|
|
|
do { \
|
|
|
|
|
__sync_synchronize(); \
|
2021-03-10 09:09:28 +01:00
|
|
|
__XSK_WRITE_ONCE(*p, v); \
|
2021-03-05 10:41:13 +01:00
|
|
|
} while (0)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef libbpf_smp_load_acquire
|
|
|
|
|
#define libbpf_smp_load_acquire(p) \
|
|
|
|
|
({ \
|
2021-03-10 09:09:28 +01:00
|
|
|
typeof(*p) ___p1 = __XSK_READ_ONCE(*p); \
|
2021-03-05 10:41:13 +01:00
|
|
|
__sync_synchronize(); \
|
|
|
|
|
___p1; \
|
|
|
|
|
})
|
2019-04-16 14:58:11 +02:00
|
|
|
#endif
|
|
|
|
|
|
2021-03-10 09:09:28 +01:00
|
|
|
/* LIBRARY INTERNAL -- END */
|
|
|
|
|
|
2019-02-01 16:14:14 -08:00
|
|
|
#ifdef __cplusplus
|
|
|
|
|
} /* extern "C" */
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif
|