1*387f9dfdSAndroid Build Coastguard Worker // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2022 Hengqi Chen */
3*387f9dfdSAndroid Build Coastguard Worker
4*387f9dfdSAndroid Build Coastguard Worker #ifndef __COMPAT_BPF_H
5*387f9dfdSAndroid Build Coastguard Worker #define __COMPAT_BPF_H
6*387f9dfdSAndroid Build Coastguard Worker
7*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
8*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
9*387f9dfdSAndroid Build Coastguard Worker
10*387f9dfdSAndroid Build Coastguard Worker #define MAX_EVENT_SIZE 10240
11*387f9dfdSAndroid Build Coastguard Worker #define RINGBUF_SIZE (1024 * 256)
12*387f9dfdSAndroid Build Coastguard Worker
13*387f9dfdSAndroid Build Coastguard Worker struct {
14*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
15*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, 1);
16*387f9dfdSAndroid Build Coastguard Worker __uint(key_size, sizeof(__u32));
17*387f9dfdSAndroid Build Coastguard Worker __uint(value_size, MAX_EVENT_SIZE);
18*387f9dfdSAndroid Build Coastguard Worker } heap SEC(".maps");
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Worker struct {
21*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_RINGBUF);
22*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, RINGBUF_SIZE);
23*387f9dfdSAndroid Build Coastguard Worker } events SEC(".maps");
24*387f9dfdSAndroid Build Coastguard Worker
reserve_buf(__u64 size)25*387f9dfdSAndroid Build Coastguard Worker static __always_inline void *reserve_buf(__u64 size)
26*387f9dfdSAndroid Build Coastguard Worker {
27*387f9dfdSAndroid Build Coastguard Worker static const int zero = 0;
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Worker if (bpf_core_type_exists(struct bpf_ringbuf))
30*387f9dfdSAndroid Build Coastguard Worker return bpf_ringbuf_reserve(&events, size, 0);
31*387f9dfdSAndroid Build Coastguard Worker
32*387f9dfdSAndroid Build Coastguard Worker return bpf_map_lookup_elem(&heap, &zero);
33*387f9dfdSAndroid Build Coastguard Worker }
34*387f9dfdSAndroid Build Coastguard Worker
submit_buf(void * ctx,void * buf,__u64 size)35*387f9dfdSAndroid Build Coastguard Worker static __always_inline long submit_buf(void *ctx, void *buf, __u64 size)
36*387f9dfdSAndroid Build Coastguard Worker {
37*387f9dfdSAndroid Build Coastguard Worker if (bpf_core_type_exists(struct bpf_ringbuf)) {
38*387f9dfdSAndroid Build Coastguard Worker bpf_ringbuf_submit(buf, 0);
39*387f9dfdSAndroid Build Coastguard Worker return 0;
40*387f9dfdSAndroid Build Coastguard Worker }
41*387f9dfdSAndroid Build Coastguard Worker
42*387f9dfdSAndroid Build Coastguard Worker return bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, buf, size);
43*387f9dfdSAndroid Build Coastguard Worker }
44*387f9dfdSAndroid Build Coastguard Worker
45*387f9dfdSAndroid Build Coastguard Worker #endif /* __COMPAT_BPF_H */
46