xref: /aosp_15_r20/external/bcc/libbpf-tools/compat.bpf.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
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