xref: /aosp_15_r20/external/bcc/src/cc/export/helpers.h (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker R"********(
2*387f9dfdSAndroid Build Coastguard Worker /*
3*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) 2015 PLUMgrid, Inc.
4*387f9dfdSAndroid Build Coastguard Worker  *
5*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*387f9dfdSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*387f9dfdSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*387f9dfdSAndroid Build Coastguard Worker  *
9*387f9dfdSAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*387f9dfdSAndroid Build Coastguard Worker  *
11*387f9dfdSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*387f9dfdSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*387f9dfdSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*387f9dfdSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*387f9dfdSAndroid Build Coastguard Worker  * limitations under the License.
16*387f9dfdSAndroid Build Coastguard Worker  */
17*387f9dfdSAndroid Build Coastguard Worker #ifndef __BPF_HELPERS_H
18*387f9dfdSAndroid Build Coastguard Worker #define __BPF_HELPERS_H
19*387f9dfdSAndroid Build Coastguard Worker 
20*387f9dfdSAndroid Build Coastguard Worker /* In Linux 5.4 asm_inline was introduced, but it's not supported by clang.
21*387f9dfdSAndroid Build Coastguard Worker  * Redefine it to just asm to enable successful compilation.
22*387f9dfdSAndroid Build Coastguard Worker  */
23*387f9dfdSAndroid Build Coastguard Worker #ifdef asm_inline
24*387f9dfdSAndroid Build Coastguard Worker #undef asm_inline
25*387f9dfdSAndroid Build Coastguard Worker #define asm_inline asm
26*387f9dfdSAndroid Build Coastguard Worker #endif
27*387f9dfdSAndroid Build Coastguard Worker 
28*387f9dfdSAndroid Build Coastguard Worker /* Before bpf_helpers.h is included, uapi bpf.h has been
29*387f9dfdSAndroid Build Coastguard Worker  * included, which references linux/types.h. This may bring
30*387f9dfdSAndroid Build Coastguard Worker  * in asm_volatile_goto definition if permitted based on
31*387f9dfdSAndroid Build Coastguard Worker  * compiler setup and kernel configs.
32*387f9dfdSAndroid Build Coastguard Worker  *
33*387f9dfdSAndroid Build Coastguard Worker  * clang does not support "asm volatile goto" yet.
34*387f9dfdSAndroid Build Coastguard Worker  * So redefine asm_volatile_goto to some invalid asm code.
35*387f9dfdSAndroid Build Coastguard Worker  * If asm_volatile_goto is actually used by the bpf program,
36*387f9dfdSAndroid Build Coastguard Worker  * a compilation error will appear.
37*387f9dfdSAndroid Build Coastguard Worker  */
38*387f9dfdSAndroid Build Coastguard Worker #ifdef asm_volatile_goto
39*387f9dfdSAndroid Build Coastguard Worker #undef asm_volatile_goto
40*387f9dfdSAndroid Build Coastguard Worker #endif
41*387f9dfdSAndroid Build Coastguard Worker #define asm_volatile_goto(x...) asm volatile("invalid use of asm_volatile_goto")
42*387f9dfdSAndroid Build Coastguard Worker 
43*387f9dfdSAndroid Build Coastguard Worker /* In 4.18 and later, when CONFIG_FUNCTION_TRACER is defined, kernel Makefile adds
44*387f9dfdSAndroid Build Coastguard Worker  * -DCC_USING_FENTRY. Let do the same for bpf programs.
45*387f9dfdSAndroid Build Coastguard Worker  */
46*387f9dfdSAndroid Build Coastguard Worker #if defined(CONFIG_FUNCTION_TRACER)
47*387f9dfdSAndroid Build Coastguard Worker #define CC_USING_FENTRY
48*387f9dfdSAndroid Build Coastguard Worker #endif
49*387f9dfdSAndroid Build Coastguard Worker 
50*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/bpf.h>
51*387f9dfdSAndroid Build Coastguard Worker #include <uapi/linux/if_packet.h>
52*387f9dfdSAndroid Build Coastguard Worker #include <linux/version.h>
53*387f9dfdSAndroid Build Coastguard Worker #include <linux/log2.h>
54*387f9dfdSAndroid Build Coastguard Worker #include <asm/page.h>
55*387f9dfdSAndroid Build Coastguard Worker 
56*387f9dfdSAndroid Build Coastguard Worker #ifndef CONFIG_BPF_SYSCALL
57*387f9dfdSAndroid Build Coastguard Worker #error "CONFIG_BPF_SYSCALL is undefined, please check your .config or ask your Linux distro to enable this feature"
58*387f9dfdSAndroid Build Coastguard Worker #endif
59*387f9dfdSAndroid Build Coastguard Worker 
60*387f9dfdSAndroid Build Coastguard Worker #ifdef PERF_MAX_STACK_DEPTH
61*387f9dfdSAndroid Build Coastguard Worker #define BPF_MAX_STACK_DEPTH PERF_MAX_STACK_DEPTH
62*387f9dfdSAndroid Build Coastguard Worker #else
63*387f9dfdSAndroid Build Coastguard Worker #define BPF_MAX_STACK_DEPTH 127
64*387f9dfdSAndroid Build Coastguard Worker #endif
65*387f9dfdSAndroid Build Coastguard Worker 
66*387f9dfdSAndroid Build Coastguard Worker /* helper macro to place programs, maps, license in
67*387f9dfdSAndroid Build Coastguard Worker  * different sections in elf_bpf file. Section names
68*387f9dfdSAndroid Build Coastguard Worker  * are interpreted by elf_bpf loader
69*387f9dfdSAndroid Build Coastguard Worker  */
70*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC(NAME) __attribute__((section(NAME), used))
71*387f9dfdSAndroid Build Coastguard Worker 
72*387f9dfdSAndroid Build Coastguard Worker #ifdef B_WORKAROUND
73*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC_HELPERS BCC_SEC("helpers")
74*387f9dfdSAndroid Build Coastguard Worker #else
75*387f9dfdSAndroid Build Coastguard Worker #define BCC_SEC_HELPERS
76*387f9dfdSAndroid Build Coastguard Worker #endif
77*387f9dfdSAndroid Build Coastguard Worker 
78*387f9dfdSAndroid Build Coastguard Worker // Associate map with its key/value types
79*387f9dfdSAndroid Build Coastguard Worker #define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val)	\
80*387f9dfdSAndroid Build Coastguard Worker         struct ____btf_map_##name {			\
81*387f9dfdSAndroid Build Coastguard Worker                 type_key key;				\
82*387f9dfdSAndroid Build Coastguard Worker                 type_val value;				\
83*387f9dfdSAndroid Build Coastguard Worker         };						\
84*387f9dfdSAndroid Build Coastguard Worker         struct ____btf_map_##name			\
85*387f9dfdSAndroid Build Coastguard Worker         __attribute__ ((section(".maps." #name), used))	\
86*387f9dfdSAndroid Build Coastguard Worker                 ____btf_map_##name = { }
87*387f9dfdSAndroid Build Coastguard Worker 
88*387f9dfdSAndroid Build Coastguard Worker // Associate map with its key/value types for QUEUE/STACK map types
89*387f9dfdSAndroid Build Coastguard Worker #define BPF_ANNOTATE_KV_PAIR_QUEUESTACK(name, type_val)  \
90*387f9dfdSAndroid Build Coastguard Worker         struct ____btf_map_##name {     \
91*387f9dfdSAndroid Build Coastguard Worker                 type_val value;       \
92*387f9dfdSAndroid Build Coastguard Worker         };            \
93*387f9dfdSAndroid Build Coastguard Worker         struct ____btf_map_##name     \
94*387f9dfdSAndroid Build Coastguard Worker         __attribute__ ((section(".maps." #name), used)) \
95*387f9dfdSAndroid Build Coastguard Worker                 ____btf_map_##name = { }
96*387f9dfdSAndroid Build Coastguard Worker 
97*387f9dfdSAndroid Build Coastguard Worker // Changes to the macro require changes in BFrontendAction classes
98*387f9dfdSAndroid Build Coastguard Worker #define BPF_F_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries, _flags) \
99*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
100*387f9dfdSAndroid Build Coastguard Worker   _key_type key; \
101*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
102*387f9dfdSAndroid Build Coastguard Worker   _leaf_type * (*lookup) (_key_type *); \
103*387f9dfdSAndroid Build Coastguard Worker   _leaf_type * (*lookup_or_init) (_key_type *, _leaf_type *); \
104*387f9dfdSAndroid Build Coastguard Worker   _leaf_type * (*lookup_or_try_init) (_key_type *, _leaf_type *); \
105*387f9dfdSAndroid Build Coastguard Worker   int (*update) (_key_type *, _leaf_type *); \
106*387f9dfdSAndroid Build Coastguard Worker   int (*insert) (_key_type *, _leaf_type *); \
107*387f9dfdSAndroid Build Coastguard Worker   int (*delete) (_key_type *); \
108*387f9dfdSAndroid Build Coastguard Worker   void (*call) (void *, int index); \
109*387f9dfdSAndroid Build Coastguard Worker   void (*increment) (_key_type, ...); \
110*387f9dfdSAndroid Build Coastguard Worker   void (*atomic_increment) (_key_type, ...); \
111*387f9dfdSAndroid Build Coastguard Worker   int (*get_stackid) (void *, u64); \
112*387f9dfdSAndroid Build Coastguard Worker   void * (*sk_storage_get) (void *, void *, int); \
113*387f9dfdSAndroid Build Coastguard Worker   int (*sk_storage_delete) (void *); \
114*387f9dfdSAndroid Build Coastguard Worker   void * (*inode_storage_get) (void *, void *, int); \
115*387f9dfdSAndroid Build Coastguard Worker   int (*inode_storage_delete) (void *); \
116*387f9dfdSAndroid Build Coastguard Worker   void * (*task_storage_get) (void *, void *, int); \
117*387f9dfdSAndroid Build Coastguard Worker   int (*task_storage_delete) (void *); \
118*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
119*387f9dfdSAndroid Build Coastguard Worker   int flags; \
120*387f9dfdSAndroid Build Coastguard Worker }; \
121*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _table_type))) \
122*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = (_flags), .max_entries = (_max_entries) }; \
123*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, _key_type, _leaf_type)
124*387f9dfdSAndroid Build Coastguard Worker 
125*387f9dfdSAndroid Build Coastguard Worker 
126*387f9dfdSAndroid Build Coastguard Worker // Changes to the macro require changes in BFrontendAction classes
127*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags) \
128*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
129*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
130*387f9dfdSAndroid Build Coastguard Worker   int * (*peek) (_leaf_type *); \
131*387f9dfdSAndroid Build Coastguard Worker   int * (*pop) (_leaf_type *); \
132*387f9dfdSAndroid Build Coastguard Worker   int * (*push) (_leaf_type *, u64); \
133*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
134*387f9dfdSAndroid Build Coastguard Worker   int flags; \
135*387f9dfdSAndroid Build Coastguard Worker }; \
136*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _table_type))) \
137*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = (_flags), .max_entries = (_max_entries) }; \
138*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR_QUEUESTACK(_name, _leaf_type)
139*387f9dfdSAndroid Build Coastguard Worker 
140*387f9dfdSAndroid Build Coastguard Worker // define queue with 3 parameters (_type=queue/stack automatically) and default flags to 0
141*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACK3(_type, _name, _leaf_type, _max_entries) \
142*387f9dfdSAndroid Build Coastguard Worker   BPF_QUEUESTACK(_type, _name, _leaf_type, _max_entries, 0)
143*387f9dfdSAndroid Build Coastguard Worker 
144*387f9dfdSAndroid Build Coastguard Worker // define queue with 4 parameters (_type=queue/stack automatically)
145*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACK4(_type, _name, _leaf_type, _max_entries, _flags) \
146*387f9dfdSAndroid Build Coastguard Worker   BPF_QUEUESTACK(_type, _name, _leaf_type, _max_entries, _flags)
147*387f9dfdSAndroid Build Coastguard Worker 
148*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function
149*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE_STACKX(_1, _2, _3, _4, NAME, ...) NAME
150*387f9dfdSAndroid Build Coastguard Worker 
151*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUE(...) \
152*387f9dfdSAndroid Build Coastguard Worker   BPF_QUEUE_STACKX(__VA_ARGS__, BPF_QUEUE_STACK4, BPF_QUEUE_STACK3)("queue", __VA_ARGS__)
153*387f9dfdSAndroid Build Coastguard Worker 
154*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK(...) \
155*387f9dfdSAndroid Build Coastguard Worker   BPF_QUEUE_STACKX(__VA_ARGS__, BPF_QUEUE_STACK4, BPF_QUEUE_STACK3)("stack", __VA_ARGS__)
156*387f9dfdSAndroid Build Coastguard Worker 
157*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_PINNED(_table_type, _name, _leaf_type, _max_entries, _flags, _pinned) \
158*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type ":" _pinned, _name, _leaf_type, _max_entries, _flags)
159*387f9dfdSAndroid Build Coastguard Worker 
160*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_PUBLIC(_table_type, _name, _leaf_type, _max_entries, _flags) \
161*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags); \
162*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/export"))) \
163*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name
164*387f9dfdSAndroid Build Coastguard Worker 
165*387f9dfdSAndroid Build Coastguard Worker #define BPF_QUEUESTACK_SHARED(_table_type, _name, _leaf_type, _max_entries, _flags) \
166*387f9dfdSAndroid Build Coastguard Worker BPF_QUEUESTACK(_table_type, _name, _leaf_type, _max_entries, _flags); \
167*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/shared"))) \
168*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name
169*387f9dfdSAndroid Build Coastguard Worker 
170*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries) \
171*387f9dfdSAndroid Build Coastguard Worker BPF_F_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries, 0)
172*387f9dfdSAndroid Build Coastguard Worker 
173*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED7(_table_type, _key_type, _leaf_type, _name, _max_entries, _pinned, _flags) \
174*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE(_table_type ":" _pinned, _key_type, _leaf_type, _name, _max_entries, _flags)
175*387f9dfdSAndroid Build Coastguard Worker 
176*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED6(_table_type, _key_type, _leaf_type, _name, _max_entries, _pinned) \
177*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE(_table_type ":" _pinned, _key_type, _leaf_type, _name, _max_entries, 0)
178*387f9dfdSAndroid Build Coastguard Worker 
179*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNEDX(_1, _2, _3, _4, _5, _6, _7, NAME, ...) NAME
180*387f9dfdSAndroid Build Coastguard Worker 
181*387f9dfdSAndroid Build Coastguard Worker // Define a pinned table with optional flags argument
182*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PINNED(...) \
183*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE_PINNEDX(__VA_ARGS__, BPF_TABLE_PINNED7, BPF_TABLE_PINNED6)(__VA_ARGS__)
184*387f9dfdSAndroid Build Coastguard Worker 
185*387f9dfdSAndroid Build Coastguard Worker // define a table same as above but allow it to be referenced by other modules
186*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_PUBLIC(_table_type, _key_type, _leaf_type, _name, _max_entries) \
187*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries); \
188*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/export"))) \
189*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name
190*387f9dfdSAndroid Build Coastguard Worker 
191*387f9dfdSAndroid Build Coastguard Worker // define a table that is shared across the programs in the same namespace
192*387f9dfdSAndroid Build Coastguard Worker #define BPF_TABLE_SHARED(_table_type, _key_type, _leaf_type, _name, _max_entries) \
193*387f9dfdSAndroid Build Coastguard Worker BPF_TABLE(_table_type, _key_type, _leaf_type, _name, _max_entries); \
194*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/shared"))) \
195*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t __##_name
196*387f9dfdSAndroid Build Coastguard Worker 
197*387f9dfdSAndroid Build Coastguard Worker // Identifier for current CPU used in perf_submit and perf_read
198*387f9dfdSAndroid Build Coastguard Worker // Prefer BPF_F_CURRENT_CPU flag, falls back to call helper for older kernel
199*387f9dfdSAndroid Build Coastguard Worker // Can be overridden from BCC
200*387f9dfdSAndroid Build Coastguard Worker #ifndef CUR_CPU_IDENTIFIER
201*387f9dfdSAndroid Build Coastguard Worker #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0)
202*387f9dfdSAndroid Build Coastguard Worker #define CUR_CPU_IDENTIFIER BPF_F_CURRENT_CPU
203*387f9dfdSAndroid Build Coastguard Worker #else
204*387f9dfdSAndroid Build Coastguard Worker #define CUR_CPU_IDENTIFIER bpf_get_smp_processor_id()
205*387f9dfdSAndroid Build Coastguard Worker #endif
206*387f9dfdSAndroid Build Coastguard Worker #endif
207*387f9dfdSAndroid Build Coastguard Worker 
208*387f9dfdSAndroid Build Coastguard Worker // Table for pushing custom events to userspace via perf ring buffer
209*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERF_OUTPUT(_name) \
210*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
211*387f9dfdSAndroid Build Coastguard Worker   int key; \
212*387f9dfdSAndroid Build Coastguard Worker   u32 leaf; \
213*387f9dfdSAndroid Build Coastguard Worker   /* map.perf_submit(ctx, data, data_size) */ \
214*387f9dfdSAndroid Build Coastguard Worker   int (*perf_submit) (void *, void *, u32); \
215*387f9dfdSAndroid Build Coastguard Worker   int (*perf_submit_skb) (void *, u32, void *, u32); \
216*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
217*387f9dfdSAndroid Build Coastguard Worker }; \
218*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/perf_output"))) \
219*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = 0 }
220*387f9dfdSAndroid Build Coastguard Worker 
221*387f9dfdSAndroid Build Coastguard Worker // Table for pushing custom events to userspace via ring buffer
222*387f9dfdSAndroid Build Coastguard Worker #define BPF_RINGBUF_OUTPUT(_name, _num_pages) \
223*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
224*387f9dfdSAndroid Build Coastguard Worker   int key; \
225*387f9dfdSAndroid Build Coastguard Worker   u32 leaf; \
226*387f9dfdSAndroid Build Coastguard Worker   /* map.ringbuf_output(data, data_size, flags) */ \
227*387f9dfdSAndroid Build Coastguard Worker   int (*ringbuf_output) (void *, u64, u64); \
228*387f9dfdSAndroid Build Coastguard Worker   /* map.ringbuf_reserve(data_size) */ \
229*387f9dfdSAndroid Build Coastguard Worker   void* (*ringbuf_reserve) (u64); \
230*387f9dfdSAndroid Build Coastguard Worker   /* map.ringbuf_discard(data, flags) */ \
231*387f9dfdSAndroid Build Coastguard Worker   void (*ringbuf_discard) (void *, u64); \
232*387f9dfdSAndroid Build Coastguard Worker   /* map.ringbuf_submit(data, flags) */ \
233*387f9dfdSAndroid Build Coastguard Worker   void (*ringbuf_submit) (void *, u64); \
234*387f9dfdSAndroid Build Coastguard Worker   /* map.ringbuf_query(flags) */ \
235*387f9dfdSAndroid Build Coastguard Worker   u64 (*ringbuf_query) (u64); \
236*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
237*387f9dfdSAndroid Build Coastguard Worker }; \
238*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/ringbuf"))) \
239*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = ((_num_pages) * PAGE_SIZE) }
240*387f9dfdSAndroid Build Coastguard Worker 
241*387f9dfdSAndroid Build Coastguard Worker // Table for reading hw perf cpu counters
242*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERF_ARRAY(_name, _max_entries) \
243*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
244*387f9dfdSAndroid Build Coastguard Worker   int key; \
245*387f9dfdSAndroid Build Coastguard Worker   u32 leaf; \
246*387f9dfdSAndroid Build Coastguard Worker   /* counter = map.perf_read(index) */ \
247*387f9dfdSAndroid Build Coastguard Worker   u64 (*perf_read) (int); \
248*387f9dfdSAndroid Build Coastguard Worker   int (*perf_counter_value) (int, void *, u32); \
249*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
250*387f9dfdSAndroid Build Coastguard Worker }; \
251*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/perf_array"))) \
252*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }
253*387f9dfdSAndroid Build Coastguard Worker 
254*387f9dfdSAndroid Build Coastguard Worker // Table for cgroup file descriptors
255*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_ARRAY(_name, _max_entries) \
256*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
257*387f9dfdSAndroid Build Coastguard Worker   int key; \
258*387f9dfdSAndroid Build Coastguard Worker   u32 leaf; \
259*387f9dfdSAndroid Build Coastguard Worker   int (*check_current_task) (int); \
260*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
261*387f9dfdSAndroid Build Coastguard Worker }; \
262*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/cgroup_array"))) \
263*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }
264*387f9dfdSAndroid Build Coastguard Worker 
265*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH1(_name) \
266*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash", u64, u64, _name, 10240)
267*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH2(_name, _key_type) \
268*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash", _key_type, u64, _name, 10240)
269*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH3(_name, _key_type, _leaf_type) \
270*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash", _key_type, _leaf_type, _name, 10240)
271*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH4(_name, _key_type, _leaf_type, _size) \
272*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash", _key_type, _leaf_type, _name, _size)
273*387f9dfdSAndroid Build Coastguard Worker 
274*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function
275*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASHX(_1, _2, _3, _4, NAME, ...) NAME
276*387f9dfdSAndroid Build Coastguard Worker 
277*387f9dfdSAndroid Build Coastguard Worker // Define a hash function, some arguments optional
278*387f9dfdSAndroid Build Coastguard Worker // BPF_HASH(name, key_type=u64, leaf_type=u64, size=10240)
279*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH(...) \
280*387f9dfdSAndroid Build Coastguard Worker   BPF_HASHX(__VA_ARGS__, BPF_HASH4, BPF_HASH3, BPF_HASH2, BPF_HASH1)(__VA_ARGS__)
281*387f9dfdSAndroid Build Coastguard Worker 
282*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH1(_name) \
283*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("percpu_hash", u64, u64, _name, 10240)
284*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH2(_name, _key_type) \
285*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("percpu_hash", _key_type, u64, _name, 10240)
286*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH3(_name, _key_type, _leaf_type) \
287*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("percpu_hash", _key_type, _leaf_type, _name, 10240)
288*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH4(_name, _key_type, _leaf_type, _size) \
289*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("percpu_hash", _key_type, _leaf_type, _name, _size)
290*387f9dfdSAndroid Build Coastguard Worker 
291*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function
292*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASHX(_1, _2, _3, _4, NAME, ...) NAME
293*387f9dfdSAndroid Build Coastguard Worker 
294*387f9dfdSAndroid Build Coastguard Worker // Define a hash function, some arguments optional
295*387f9dfdSAndroid Build Coastguard Worker // BPF_PERCPU_HASH(name, key_type=u64, leaf_type=u64, size=10240)
296*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_HASH(...)                                            \
297*387f9dfdSAndroid Build Coastguard Worker   BPF_PERCPU_HASHX(                                                     \
298*387f9dfdSAndroid Build Coastguard Worker     __VA_ARGS__, BPF_PERCPU_HASH4, BPF_PERCPU_HASH3, BPF_PERCPU_HASH2, BPF_PERCPU_HASH1) \
299*387f9dfdSAndroid Build Coastguard Worker            (__VA_ARGS__)
300*387f9dfdSAndroid Build Coastguard Worker 
301*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY1(_name) \
302*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("array", int, u64, _name, 10240)
303*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY2(_name, _leaf_type) \
304*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("array", int, _leaf_type, _name, 10240)
305*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY3(_name, _leaf_type, _size) \
306*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("array", int, _leaf_type, _name, _size)
307*387f9dfdSAndroid Build Coastguard Worker 
308*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function
309*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAYX(_1, _2, _3, NAME, ...) NAME
310*387f9dfdSAndroid Build Coastguard Worker 
311*387f9dfdSAndroid Build Coastguard Worker // Define an array function, some arguments optional
312*387f9dfdSAndroid Build Coastguard Worker // BPF_ARRAY(name, leaf_type=u64, size=10240)
313*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY(...) \
314*387f9dfdSAndroid Build Coastguard Worker   BPF_ARRAYX(__VA_ARGS__, BPF_ARRAY3, BPF_ARRAY2, BPF_ARRAY1)(__VA_ARGS__)
315*387f9dfdSAndroid Build Coastguard Worker 
316*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY1(_name)                        \
317*387f9dfdSAndroid Build Coastguard Worker     BPF_TABLE("percpu_array", int, u64, _name, 10240)
318*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY2(_name, _leaf_type) \
319*387f9dfdSAndroid Build Coastguard Worker     BPF_TABLE("percpu_array", int, _leaf_type, _name, 10240)
320*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY3(_name, _leaf_type, _size) \
321*387f9dfdSAndroid Build Coastguard Worker     BPF_TABLE("percpu_array", int, _leaf_type, _name, _size)
322*387f9dfdSAndroid Build Coastguard Worker 
323*387f9dfdSAndroid Build Coastguard Worker // helper for default-variable macro function
324*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAYX(_1, _2, _3, NAME, ...) NAME
325*387f9dfdSAndroid Build Coastguard Worker 
326*387f9dfdSAndroid Build Coastguard Worker // Define an array function (per CPU), some arguments optional
327*387f9dfdSAndroid Build Coastguard Worker // BPF_PERCPU_ARRAY(name, leaf_type=u64, size=10240)
328*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_ARRAY(...)                                           \
329*387f9dfdSAndroid Build Coastguard Worker   BPF_PERCPU_ARRAYX(                                                    \
330*387f9dfdSAndroid Build Coastguard Worker     __VA_ARGS__, BPF_PERCPU_ARRAY3, BPF_PERCPU_ARRAY2, BPF_PERCPU_ARRAY1) \
331*387f9dfdSAndroid Build Coastguard Worker            (__VA_ARGS__)
332*387f9dfdSAndroid Build Coastguard Worker 
333*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST1(_name) \
334*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("histogram", int, u64, _name, 64)
335*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST2(_name, _key_type) \
336*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("histogram", _key_type, u64, _name, 64)
337*387f9dfdSAndroid Build Coastguard Worker #define BPF_HIST3(_name, _key_type, _size) \
338*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("histogram", _key_type, u64, _name, _size)
339*387f9dfdSAndroid Build Coastguard Worker #define BPF_HISTX(_1, _2, _3, NAME, ...) NAME
340*387f9dfdSAndroid Build Coastguard Worker 
341*387f9dfdSAndroid Build Coastguard Worker // Define a histogram, some arguments optional
342*387f9dfdSAndroid Build Coastguard Worker // BPF_HISTOGRAM(name, key_type=int, size=64)
343*387f9dfdSAndroid Build Coastguard Worker #define BPF_HISTOGRAM(...) \
344*387f9dfdSAndroid Build Coastguard Worker   BPF_HISTX(__VA_ARGS__, BPF_HIST3, BPF_HIST2, BPF_HIST1)(__VA_ARGS__)
345*387f9dfdSAndroid Build Coastguard Worker 
346*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE1(_name) \
347*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE("lpm_trie", u64, u64, _name, 10240, BPF_F_NO_PREALLOC)
348*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE2(_name, _key_type) \
349*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE("lpm_trie", _key_type, u64, _name, 10240, BPF_F_NO_PREALLOC)
350*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE3(_name, _key_type, _leaf_type) \
351*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE("lpm_trie", _key_type, _leaf_type, _name, 10240, BPF_F_NO_PREALLOC)
352*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE4(_name, _key_type, _leaf_type, _size) \
353*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE("lpm_trie", _key_type, _leaf_type, _name, _size, BPF_F_NO_PREALLOC)
354*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIEX(_1, _2, _3, _4, NAME, ...) NAME
355*387f9dfdSAndroid Build Coastguard Worker 
356*387f9dfdSAndroid Build Coastguard Worker // Define a LPM trie function, some arguments optional
357*387f9dfdSAndroid Build Coastguard Worker // BPF_LPM_TRIE(name, key_type=u64, leaf_type=u64, size=10240)
358*387f9dfdSAndroid Build Coastguard Worker #define BPF_LPM_TRIE(...) \
359*387f9dfdSAndroid Build Coastguard Worker   BPF_LPM_TRIEX(__VA_ARGS__, BPF_LPM_TRIE4, BPF_LPM_TRIE3, BPF_LPM_TRIE2, BPF_LPM_TRIE1)(__VA_ARGS__)
360*387f9dfdSAndroid Build Coastguard Worker 
361*387f9dfdSAndroid Build Coastguard Worker struct bpf_stacktrace {
362*387f9dfdSAndroid Build Coastguard Worker   u64 ip[BPF_MAX_STACK_DEPTH];
363*387f9dfdSAndroid Build Coastguard Worker };
364*387f9dfdSAndroid Build Coastguard Worker 
365*387f9dfdSAndroid Build Coastguard Worker struct bpf_stacktrace_buildid {
366*387f9dfdSAndroid Build Coastguard Worker   struct bpf_stack_build_id trace[BPF_MAX_STACK_DEPTH];
367*387f9dfdSAndroid Build Coastguard Worker };
368*387f9dfdSAndroid Build Coastguard Worker 
369*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK_TRACE(_name, _max_entries) \
370*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("stacktrace", int, struct bpf_stacktrace, _name, roundup_pow_of_two(_max_entries))
371*387f9dfdSAndroid Build Coastguard Worker 
372*387f9dfdSAndroid Build Coastguard Worker #define BPF_STACK_TRACE_BUILDID(_name, _max_entries) \
373*387f9dfdSAndroid Build Coastguard Worker   BPF_F_TABLE("stacktrace", int, struct bpf_stacktrace_buildid, _name, roundup_pow_of_two(_max_entries), BPF_F_STACK_BUILD_ID)
374*387f9dfdSAndroid Build Coastguard Worker 
375*387f9dfdSAndroid Build Coastguard Worker #define BPF_PROG_ARRAY(_name, _max_entries) \
376*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("prog", u32, u32, _name, _max_entries)
377*387f9dfdSAndroid Build Coastguard Worker 
378*387f9dfdSAndroid Build Coastguard Worker #define BPF_XDP_REDIRECT_MAP(_table_type, _leaf_type, _name, _max_entries) \
379*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
380*387f9dfdSAndroid Build Coastguard Worker   u32 key; \
381*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
382*387f9dfdSAndroid Build Coastguard Worker   /* xdp_act = map.redirect_map(index, flag) */ \
383*387f9dfdSAndroid Build Coastguard Worker   u64 (*redirect_map) (int, int); \
384*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
385*387f9dfdSAndroid Build Coastguard Worker }; \
386*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/"_table_type))) \
387*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }
388*387f9dfdSAndroid Build Coastguard Worker 
389*387f9dfdSAndroid Build Coastguard Worker #define BPF_DEVMAP(_name, _max_entries) \
390*387f9dfdSAndroid Build Coastguard Worker   BPF_XDP_REDIRECT_MAP("devmap", int, _name, _max_entries)
391*387f9dfdSAndroid Build Coastguard Worker 
392*387f9dfdSAndroid Build Coastguard Worker #define BPF_CPUMAP(_name, _max_entries) \
393*387f9dfdSAndroid Build Coastguard Worker   BPF_XDP_REDIRECT_MAP("cpumap", u32, _name, _max_entries)
394*387f9dfdSAndroid Build Coastguard Worker 
395*387f9dfdSAndroid Build Coastguard Worker #define _BPF_XSKMAP(_name, _max_entries, _pinned) \
396*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
397*387f9dfdSAndroid Build Coastguard Worker   u32 key; \
398*387f9dfdSAndroid Build Coastguard Worker   int leaf; \
399*387f9dfdSAndroid Build Coastguard Worker   int * (*lookup) (int *); \
400*387f9dfdSAndroid Build Coastguard Worker   /* xdp_act = map.redirect_map(index, flag) */ \
401*387f9dfdSAndroid Build Coastguard Worker   u64 (*redirect_map) (int, int); \
402*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
403*387f9dfdSAndroid Build Coastguard Worker }; \
404*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/xskmap" _pinned))) \
405*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }
406*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP2(_name, _max_entries) _BPF_XSKMAP(_name, _max_entries, "")
407*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP3(_name, _max_entries, _pinned) _BPF_XSKMAP(_name, _max_entries, ":" _pinned)
408*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAPX(_1, _2, _3, NAME, ...) NAME
409*387f9dfdSAndroid Build Coastguard Worker #define BPF_XSKMAP(...) BPF_XSKMAPX(__VA_ARGS__, BPF_XSKMAP3, BPF_XSKMAP2)(__VA_ARGS__)
410*387f9dfdSAndroid Build Coastguard Worker 
411*387f9dfdSAndroid Build Coastguard Worker #define BPF_ARRAY_OF_MAPS(_name, _inner_map_name, _max_entries) \
412*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("array_of_maps$" _inner_map_name, int, int, _name, _max_entries)
413*387f9dfdSAndroid Build Coastguard Worker 
414*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS2(_name, _inner_map_name) \
415*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash_of_maps$" _inner_map_name, int, int, _name, 10240)
416*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS3(_name, _key_type, _inner_map_name) \
417*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash_of_maps$" _inner_map_name, _key_type, int, _name, 10240)
418*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS4(_name, _key_type, _inner_map_name, _max_entries) \
419*387f9dfdSAndroid Build Coastguard Worker   BPF_TABLE("hash_of_maps$" _inner_map_name, _key_type, int, _name, _max_entries)
420*387f9dfdSAndroid Build Coastguard Worker 
421*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPSX(_name, _2, _3, _4, NAME, ...) NAME
422*387f9dfdSAndroid Build Coastguard Worker 
423*387f9dfdSAndroid Build Coastguard Worker #define BPF_HASH_OF_MAPS(...) \
424*387f9dfdSAndroid Build Coastguard Worker   BPF_HASH_OF_MAPSX(__VA_ARGS__, BPF_HASH_OF_MAPS4, BPF_HASH_OF_MAPS3, BPF_HASH_OF_MAPS2)(__VA_ARGS__)
425*387f9dfdSAndroid Build Coastguard Worker 
426*387f9dfdSAndroid Build Coastguard Worker #define BPF_SK_STORAGE(_name, _leaf_type) \
427*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
428*387f9dfdSAndroid Build Coastguard Worker   int key; \
429*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
430*387f9dfdSAndroid Build Coastguard Worker   void * (*sk_storage_get) (void *, void *, int); \
431*387f9dfdSAndroid Build Coastguard Worker   int (*sk_storage_delete) (void *); \
432*387f9dfdSAndroid Build Coastguard Worker   u32 flags; \
433*387f9dfdSAndroid Build Coastguard Worker }; \
434*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/sk_storage"))) \
435*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
436*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
437*387f9dfdSAndroid Build Coastguard Worker 
438*387f9dfdSAndroid Build Coastguard Worker #define BPF_INODE_STORAGE(_name, _leaf_type) \
439*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
440*387f9dfdSAndroid Build Coastguard Worker   int key; \
441*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
442*387f9dfdSAndroid Build Coastguard Worker   void * (*inode_storage_get) (void *, void *, int); \
443*387f9dfdSAndroid Build Coastguard Worker   int (*inode_storage_delete) (void *); \
444*387f9dfdSAndroid Build Coastguard Worker   u32 flags; \
445*387f9dfdSAndroid Build Coastguard Worker }; \
446*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/inode_storage"))) \
447*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
448*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
449*387f9dfdSAndroid Build Coastguard Worker 
450*387f9dfdSAndroid Build Coastguard Worker #define BPF_TASK_STORAGE(_name, _leaf_type) \
451*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
452*387f9dfdSAndroid Build Coastguard Worker   int key; \
453*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
454*387f9dfdSAndroid Build Coastguard Worker   void * (*task_storage_get) (void *, void *, int); \
455*387f9dfdSAndroid Build Coastguard Worker   int (*task_storage_delete) (void *); \
456*387f9dfdSAndroid Build Coastguard Worker   u32 flags; \
457*387f9dfdSAndroid Build Coastguard Worker }; \
458*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/task_storage"))) \
459*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .flags = BPF_F_NO_PREALLOC }; \
460*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, int, _leaf_type)
461*387f9dfdSAndroid Build Coastguard Worker 
462*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKMAP_COMMON(_name, _max_entries, _kind, _helper_name) \
463*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
464*387f9dfdSAndroid Build Coastguard Worker   u32 key; \
465*387f9dfdSAndroid Build Coastguard Worker   int leaf; \
466*387f9dfdSAndroid Build Coastguard Worker   int (*update) (u32 *, int *); \
467*387f9dfdSAndroid Build Coastguard Worker   int (*delete) (u32 *); \
468*387f9dfdSAndroid Build Coastguard Worker   /* ret = map.sock_map_update(ctx, key, flag) */ \
469*387f9dfdSAndroid Build Coastguard Worker   int (* _helper_name) (void *, void *, u64); \
470*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
471*387f9dfdSAndroid Build Coastguard Worker }; \
472*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _kind))) \
473*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }; \
474*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, u32, int)
475*387f9dfdSAndroid Build Coastguard Worker 
476*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKMAP(_name, _max_entries) \
477*387f9dfdSAndroid Build Coastguard Worker   BPF_SOCKMAP_COMMON(_name, _max_entries, "sockmap", sock_map_update)
478*387f9dfdSAndroid Build Coastguard Worker 
479*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH_COMMON(_name, _key_type, _max_entries) \
480*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t {\
481*387f9dfdSAndroid Build Coastguard Worker   _key_type key;\
482*387f9dfdSAndroid Build Coastguard Worker   int leaf; \
483*387f9dfdSAndroid Build Coastguard Worker   int (*update) (_key_type *, int *); \
484*387f9dfdSAndroid Build Coastguard Worker   int (*delete) (_key_type *); \
485*387f9dfdSAndroid Build Coastguard Worker   int (*sock_hash_update) (void *, void *, u64); \
486*387f9dfdSAndroid Build Coastguard Worker   int (*msg_redirect_hash) (void *, void *, u64); \
487*387f9dfdSAndroid Build Coastguard Worker   int (*sk_redirect_hash) (void *, void *, u64); \
488*387f9dfdSAndroid Build Coastguard Worker   u32 max_entries; \
489*387f9dfdSAndroid Build Coastguard Worker }; \
490*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/sockhash"))) \
491*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { .max_entries = (_max_entries) }; \
492*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, _key_type, int)
493*387f9dfdSAndroid Build Coastguard Worker 
494*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH1(_name) \
495*387f9dfdSAndroid Build Coastguard Worker   BPF_SOCKHASH_COMMON(_name, u32, 10240)
496*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH2(_name, _key_type) \
497*387f9dfdSAndroid Build Coastguard Worker   BPF_SOCKHASH_COMMON(_name, _key_type, 10240)
498*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH3(_name, _key_type, _max_entries) \
499*387f9dfdSAndroid Build Coastguard Worker   BPF_SOCKHASH_COMMON(_name, _key_type, _max_entries)
500*387f9dfdSAndroid Build Coastguard Worker 
501*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASHX(_1, _2, _3, NAME, ...) NAME
502*387f9dfdSAndroid Build Coastguard Worker // We can define a five-tuple as the key, and basically never define the val type.
503*387f9dfdSAndroid Build Coastguard Worker // BPF_SOCKHASH(name, key_type=u64, size=10240)
504*387f9dfdSAndroid Build Coastguard Worker #define BPF_SOCKHASH(...) \
505*387f9dfdSAndroid Build Coastguard Worker   BPF_SOCKHASHX(__VA_ARGS__, BPF_SOCKHASH3, BPF_SOCKHASH2, BPF_SOCKHASH1)(__VA_ARGS__)
506*387f9dfdSAndroid Build Coastguard Worker 
507*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, _kind) \
508*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t { \
509*387f9dfdSAndroid Build Coastguard Worker   struct bpf_cgroup_storage_key key; \
510*387f9dfdSAndroid Build Coastguard Worker   _leaf_type leaf; \
511*387f9dfdSAndroid Build Coastguard Worker   _leaf_type * (*lookup) (struct bpf_cgroup_storage_key *); \
512*387f9dfdSAndroid Build Coastguard Worker   int (*update) (struct bpf_cgroup_storage_key *, _leaf_type *); \
513*387f9dfdSAndroid Build Coastguard Worker   int (*get_local_storage) (u64); \
514*387f9dfdSAndroid Build Coastguard Worker }; \
515*387f9dfdSAndroid Build Coastguard Worker __attribute__((section("maps/" _kind))) \
516*387f9dfdSAndroid Build Coastguard Worker struct _name##_table_t _name = { 0 }; \
517*387f9dfdSAndroid Build Coastguard Worker BPF_ANNOTATE_KV_PAIR(_name, struct bpf_cgroup_storage_key, _leaf_type)
518*387f9dfdSAndroid Build Coastguard Worker 
519*387f9dfdSAndroid Build Coastguard Worker #define BPF_CGROUP_STORAGE(_name, _leaf_type) \
520*387f9dfdSAndroid Build Coastguard Worker   BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, "cgroup_storage")
521*387f9dfdSAndroid Build Coastguard Worker 
522*387f9dfdSAndroid Build Coastguard Worker #define BPF_PERCPU_CGROUP_STORAGE(_name, _leaf_type) \
523*387f9dfdSAndroid Build Coastguard Worker   BPF_CGROUP_STORAGE_COMMON(_name, _leaf_type, "percpu_cgroup_storage")
524*387f9dfdSAndroid Build Coastguard Worker 
525*387f9dfdSAndroid Build Coastguard Worker // packet parsing state machine helpers
526*387f9dfdSAndroid Build Coastguard Worker #define cursor_advance(_cursor, _len) \
527*387f9dfdSAndroid Build Coastguard Worker   ({ void *_tmp = _cursor; _cursor += _len; _tmp; })
528*387f9dfdSAndroid Build Coastguard Worker 
529*387f9dfdSAndroid Build Coastguard Worker #ifdef LINUX_VERSION_CODE_OVERRIDE
530*387f9dfdSAndroid Build Coastguard Worker unsigned _version BCC_SEC("version") = LINUX_VERSION_CODE_OVERRIDE;
531*387f9dfdSAndroid Build Coastguard Worker #else
532*387f9dfdSAndroid Build Coastguard Worker unsigned _version BCC_SEC("version") = LINUX_VERSION_CODE;
533*387f9dfdSAndroid Build Coastguard Worker #endif
534*387f9dfdSAndroid Build Coastguard Worker 
535*387f9dfdSAndroid Build Coastguard Worker /* helper functions called from eBPF programs written in C */
536*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_map_lookup_elem)(void *map, void *key) =
537*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_lookup_elem;
538*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_update_elem)(void *map, void *key, void *value, u64 flags) =
539*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_update_elem;
540*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_delete_elem)(void *map, void *key) =
541*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_delete_elem;
542*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read)(void *dst, u64 size, const void *unsafe_ptr) =
543*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_probe_read;
544*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_ktime_get_ns)(void) =
545*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_ktime_get_ns;
546*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_prandom_u32)(void) =
547*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_prandom_u32;
548*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_trace_printk_)(const char *fmt, u64 fmt_size, ...) =
549*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_trace_printk;
550*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_str)(void *dst, u64 size, const void *unsafe_ptr) =
551*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_probe_read_str;
552*387f9dfdSAndroid Build Coastguard Worker int bpf_trace_printk(const char *fmt, ...) asm("llvm.bpf.extra");
553*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
554*387f9dfdSAndroid Build Coastguard Worker void bpf_tail_call_(void *map_fd, void *ctx, int index) {
555*387f9dfdSAndroid Build Coastguard Worker   ((void (*)(void *, u64, int))BPF_FUNC_tail_call)(ctx, (u64)map_fd, index);
556*387f9dfdSAndroid Build Coastguard Worker }
557*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_clone_redirect)(void *ctx, int ifindex, u32 flags) =
558*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_clone_redirect;
559*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_smp_processor_id)(void) =
560*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_smp_processor_id;
561*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_pid_tgid)(void) =
562*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_current_pid_tgid;
563*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_uid_gid)(void) =
564*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_current_uid_gid;
565*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_current_comm)(void *buf, int buf_size) =
566*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_current_comm;
567*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_cgroup_classid)(void *ctx) =
568*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_cgroup_classid;
569*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_vlan_push)(void *ctx, u16 proto, u16 vlan_tci) =
570*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_vlan_push;
571*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_vlan_pop)(void *ctx) =
572*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_vlan_pop;
573*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_tunnel_key)(void *ctx, void *to, u32 size, u64 flags) =
574*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_get_tunnel_key;
575*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_set_tunnel_key)(void *ctx, void *from, u32 size, u64 flags) =
576*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_set_tunnel_key;
577*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_perf_event_read)(void *map, u64 flags) =
578*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_perf_event_read;
579*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_redirect)(int ifindex, u32 flags) =
580*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_redirect;
581*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_route_realm)(void *ctx) =
582*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_route_realm;
583*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_event_output)(void *ctx, void *map, u64 index, void *data, u32 size) =
584*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_perf_event_output;
585*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_load_bytes)(void *ctx, int offset, void *to, u32 len) =
586*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_load_bytes;
587*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_event_read_value)(void *map, u64 flags, void *buf, u32 buf_size) =
588*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_perf_event_read_value;
589*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_perf_prog_read_value)(void *ctx, void *buf, u32 buf_size) =
590*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_perf_prog_read_value;
591*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_current_task_under_cgroup)(void *map, int index) =
592*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_current_task_under_cgroup;
593*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_socket_cookie)(void *ctx) =
594*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_socket_cookie;
595*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_socket_uid)(void *ctx) =
596*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_socket_uid;
597*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_getsockopt)(void *ctx, int level, int optname, void *optval, int optlen) =
598*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_getsockopt;
599*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_redirect_map)(void *map, int key, int flags) =
600*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_redirect_map;
601*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_hash)(void *ctx, u32 hash) =
602*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_set_hash;
603*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_setsockopt)(void *ctx, int level, int optname, void *optval, int optlen) =
604*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_setsockopt;
605*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_adjust_room)(void *ctx, int len_diff, u32 mode, u64 flags) =
606*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_adjust_room;
607*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) =
608*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_under_cgroup;
609*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, int size,
610*387f9dfdSAndroid Build Coastguard Worker                                               unsigned long long netns_id,
611*387f9dfdSAndroid Build Coastguard Worker                                               unsigned long long flags) =
612*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skc_lookup_tcp;
613*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_redirect_map)(void *ctx, void *map, int key, int flags) =
614*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_redirect_map;
615*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_map_update)(void *map, void *key, void *value, unsigned long long flags) =
616*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sock_map_update;
617*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_strtol)(const char *buf, size_t buf_len, u64 flags, long *res) =
618*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_strtol;
619*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_strtoul)(const char *buf, size_t buf_len, u64 flags, unsigned long *res) =
620*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_strtoul;
621*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, size_t buf_len) =
622*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sysctl_get_current_value;
623*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) =
624*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sysctl_get_name;
625*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, size_t buf_len) =
626*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sysctl_get_new_value;
627*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) =
628*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sysctl_set_new_value;
629*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_tcp_check_syncookie)(void *sk, void *ip, int ip_len, void *tcp,
630*387f9dfdSAndroid Build Coastguard Worker                                       int tcp_len) =
631*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_tcp_check_syncookie;
632*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_meta)(void *ctx, int offset) =
633*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_xdp_adjust_meta;
634*387f9dfdSAndroid Build Coastguard Worker 
635*387f9dfdSAndroid Build Coastguard Worker /* bcc_get_stackid will return a negative value in the case of an error
636*387f9dfdSAndroid Build Coastguard Worker  *
637*387f9dfdSAndroid Build Coastguard Worker  * BPF_STACK_TRACE(_name, _size) will allocate space for _size stack traces.
638*387f9dfdSAndroid Build Coastguard Worker  *  -ENOMEM will be returned when this limit is reached.
639*387f9dfdSAndroid Build Coastguard Worker  *
640*387f9dfdSAndroid Build Coastguard Worker  * -EFAULT is typically returned when requesting user-space stack straces (using
641*387f9dfdSAndroid Build Coastguard Worker  * BPF_F_USER_STACK) for kernel threads. However, a valid stackid may be
642*387f9dfdSAndroid Build Coastguard Worker  * returned in some cases; consider a tracepoint or kprobe executing in the
643*387f9dfdSAndroid Build Coastguard Worker  * kernel context. Given this you can typically ignore -EFAULT errors when
644*387f9dfdSAndroid Build Coastguard Worker  * retrieving user-space stack traces.
645*387f9dfdSAndroid Build Coastguard Worker  */
646*387f9dfdSAndroid Build Coastguard Worker static int (*bcc_get_stackid_)(void *ctx, void *map, u64 flags) =
647*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_stackid;
648*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
649*387f9dfdSAndroid Build Coastguard Worker int bcc_get_stackid(uintptr_t map, void *ctx, u64 flags) {
650*387f9dfdSAndroid Build Coastguard Worker   return bcc_get_stackid_(ctx, (void *)map, flags);
651*387f9dfdSAndroid Build Coastguard Worker }
652*387f9dfdSAndroid Build Coastguard Worker 
653*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_diff)(void *from, u64 from_size, void *to, u64 to_size, u64 seed) =
654*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_csum_diff;
655*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_tunnel_opt)(void *ctx, void *md, u32 size) =
656*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_get_tunnel_opt;
657*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_set_tunnel_opt)(void *ctx, void *md, u32 size) =
658*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_set_tunnel_opt;
659*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_proto)(void *ctx, u16 proto, u64 flags) =
660*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_change_proto;
661*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_type)(void *ctx, u32 type) =
662*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_change_type;
663*387f9dfdSAndroid Build Coastguard Worker static u32 (*bpf_get_hash_recalc)(void *ctx) =
664*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_hash_recalc;
665*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_task)(void) =
666*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_current_task;
667*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_write_user)(void *dst, void *src, u32 size) =
668*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_probe_write_user;
669*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_tail)(void *ctx, u32 new_len, u64 flags) =
670*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_change_tail;
671*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_pull_data)(void *ctx, u32 len) =
672*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_pull_data;
673*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_update)(void *ctx, u16 csum) =
674*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_csum_update;
675*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_hash_invalid)(void *ctx) =
676*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_set_hash_invalid;
677*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_numa_node_id)(void) =
678*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_numa_node_id;
679*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_change_head)(void *ctx, u32 len, u64 flags) =
680*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_change_head;
681*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_head)(void *ctx, int offset) =
682*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_xdp_adjust_head;
683*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_override_return)(void *pt_regs, unsigned long rc) =
684*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_override_return;
685*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_ops_cb_flags_set)(void *skops, int flags) =
686*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sock_ops_cb_flags_set;
687*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_redirect_map)(void *msg, void *map, u32 key, u64 flags) =
688*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_redirect_map;
689*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_apply_bytes)(void *msg, u32 bytes) =
690*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_apply_bytes;
691*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_cork_bytes)(void *msg, u32 bytes) =
692*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_cork_bytes;
693*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_pull_data)(void *msg, u32 start, u32 end, u64 flags) =
694*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_pull_data;
695*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_bind)(void *ctx, void *addr, int addr_len) =
696*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_bind;
697*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_adjust_tail)(void *ctx, int offset) =
698*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_xdp_adjust_tail;
699*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_get_xfrm_state)(void *ctx, u32 index, void *xfrm_state, u32 size, u64 flags) =
700*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_get_xfrm_state;
701*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_stack)(void *ctx, void *buf, u32 size, u64 flags) =
702*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_stack;
703*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_load_bytes_relative)(void *ctx, u32 offset, void *to, u32 len, u32 start_header) =
704*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_load_bytes_relative;
705*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_fib_lookup)(void *ctx, void *params, int plen, u32 flags) =
706*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_fib_lookup;
707*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sock_hash_update)(void *ctx, void *map, void *key, u64 flags) =
708*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sock_hash_update;
709*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_redirect_hash)(void *ctx, void *map, void *key, u64 flags) =
710*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_redirect_hash;
711*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_redirect_hash)(void *ctx, void *map, void *key, u64 flags) =
712*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_redirect_hash;
713*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_push_encap)(void *skb, u32 type, void *hdr, u32 len) =
714*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_lwt_push_encap;
715*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_store_bytes)(void *ctx, u32 offset, const void *from, u32 len) =
716*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_lwt_seg6_store_bytes;
717*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_adjust_srh)(void *ctx, u32 offset, s32 delta) =
718*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_lwt_seg6_adjust_srh;
719*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_lwt_seg6_action)(void *ctx, u32 action, void *param, u32 param_len) =
720*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_lwt_seg6_action;
721*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_keydown)(void *ctx, u32 protocol, u64 scancode, u32 toggle) =
722*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_rc_keydown;
723*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_repeat)(void *ctx) =
724*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_rc_repeat;
725*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_cgroup_id)(void *skb) =
726*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_cgroup_id;
727*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_get_current_cgroup_id)(void) =
728*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_current_cgroup_id;
729*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_ancestor_cgroup_id)(void *skb, int ancestor_level) =
730*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_ancestor_cgroup_id;
731*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_get_local_storage)(void *map, u64 flags) =
732*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_local_storage;
733*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_select_reuseport)(void *reuse, void *map, void *key, u64 flags) =
734*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_select_reuseport;
735*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx,
736*387f9dfdSAndroid Build Coastguard Worker                                              struct bpf_sock_tuple *tuple,
737*387f9dfdSAndroid Build Coastguard Worker                                              int size, unsigned int netns_id,
738*387f9dfdSAndroid Build Coastguard Worker                                              unsigned long long flags) =
739*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_lookup_tcp;
740*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx,
741*387f9dfdSAndroid Build Coastguard Worker                                              struct bpf_sock_tuple *tuple,
742*387f9dfdSAndroid Build Coastguard Worker                                              int size, unsigned int netns_id,
743*387f9dfdSAndroid Build Coastguard Worker                                              unsigned long long flags) =
744*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_lookup_udp;
745*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_release)(void *sk) =
746*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_release;
747*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_push_elem)(void *map, const void *value, u64 flags) =
748*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_push_elem;
749*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_pop_elem)(void *map, void *value) =
750*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_pop_elem;
751*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_map_peek_elem)(void *map, void *value) =
752*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_map_peek_elem;
753*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_push_data)(void *skb, u32 start, u32 len, u64 flags) =
754*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_push_data;
755*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_msg_pop_data)(void *msg, u32 start, u32 pop, u64 flags) =
756*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_msg_pop_data;
757*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_rc_pointer_rel)(void *ctx, s32 rel_x, s32 rel_y) =
758*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_rc_pointer_rel;
759*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_spin_lock)(struct bpf_spin_lock *lock) =
760*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_spin_lock;
761*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_spin_unlock)(struct bpf_spin_lock *lock) =
762*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_spin_unlock;
763*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) =
764*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_fullsock;
765*387f9dfdSAndroid Build Coastguard Worker static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) =
766*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_tcp_sock;
767*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_ecn_set_ce)(void *ctx) =
768*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_ecn_set_ce;
769*387f9dfdSAndroid Build Coastguard Worker static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) =
770*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_get_listener_sock;
771*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_sk_storage_get)(void *map, void *sk,
772*387f9dfdSAndroid Build Coastguard Worker                                    void *value, __u64 flags) =
773*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_sk_storage_get;
774*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_storage_delete)(void *map, void *sk) =
775*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_sk_storage_delete;
776*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_send_signal)(unsigned sig) = (void *)BPF_FUNC_send_signal;
777*387f9dfdSAndroid Build Coastguard Worker static long long (*bpf_tcp_gen_syncookie)(void *sk, void *ip,
778*387f9dfdSAndroid Build Coastguard Worker                                           int ip_len, void *tcp, int tcp_len) =
779*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_tcp_gen_syncookie;
780*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data,
781*387f9dfdSAndroid Build Coastguard Worker                              __u64 size) =
782*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skb_output;
783*387f9dfdSAndroid Build Coastguard Worker 
784*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_user)(void *dst, __u32 size,
785*387f9dfdSAndroid Build Coastguard Worker                                   const void *unsafe_ptr) =
786*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_probe_read_user;
787*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_kernel)(void *dst, __u32 size,
788*387f9dfdSAndroid Build Coastguard Worker                                     const void *unsafe_ptr) =
789*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_probe_read_kernel;
790*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_user_str)(void *dst, __u32 size,
791*387f9dfdSAndroid Build Coastguard Worker             const void *unsafe_ptr) =
792*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_probe_read_user_str;
793*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_probe_read_kernel_str)(void *dst, __u32 size,
794*387f9dfdSAndroid Build Coastguard Worker             const void *unsafe_ptr) =
795*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_probe_read_kernel_str;
796*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) =
797*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_tcp_send_ack;
798*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_send_signal_thread)(__u32 sig) =
799*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_send_signal_thread;
800*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_jiffies64)(void) = (void *)BPF_FUNC_jiffies64;
801*387f9dfdSAndroid Build Coastguard Worker 
802*387f9dfdSAndroid Build Coastguard Worker struct bpf_perf_event_data;
803*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf,
804*387f9dfdSAndroid Build Coastguard Worker                                       __u32 size, __u64 flags) =
805*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_read_branch_records;
806*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino,
807*387f9dfdSAndroid Build Coastguard Worker                                           struct bpf_pidns_info *nsdata,
808*387f9dfdSAndroid Build Coastguard Worker                                           __u32 size) =
809*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_ns_current_pid_tgid;
810*387f9dfdSAndroid Build Coastguard Worker 
811*387f9dfdSAndroid Build Coastguard Worker struct bpf_map;
812*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_xdp_output)(void *ctx, struct bpf_map *map, __u64 flags,
813*387f9dfdSAndroid Build Coastguard Worker                              void *data, __u64 size) =
814*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_xdp_output;
815*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *)BPF_FUNC_get_netns_cookie;
816*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) =
817*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_current_ancestor_cgroup_id;
818*387f9dfdSAndroid Build Coastguard Worker 
819*387f9dfdSAndroid Build Coastguard Worker struct sk_buff;
820*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_sk_assign)(void *skb, void *sk, __u64 flags) =
821*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_sk_assign;
822*387f9dfdSAndroid Build Coastguard Worker 
823*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *)BPF_FUNC_ktime_get_boot_ns;
824*387f9dfdSAndroid Build Coastguard Worker 
825*387f9dfdSAndroid Build Coastguard Worker struct seq_file;
826*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size,
827*387f9dfdSAndroid Build Coastguard Worker 			     const void *data, __u32 data_len) =
828*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_seq_printf;
829*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) =
830*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_seq_write;
831*387f9dfdSAndroid Build Coastguard Worker 
832*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *)BPF_FUNC_sk_cgroup_id;
833*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) =
834*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_sk_ancestor_cgroup_id;
835*387f9dfdSAndroid Build Coastguard Worker 
836*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) =
837*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_output;
838*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) =
839*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_reserve;
840*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_submit)(void *data, __u64 flags) =
841*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_submit;
842*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_discard)(void *data, __u64 flags) =
843*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_discard;
844*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) =
845*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_query;
846*387f9dfdSAndroid Build Coastguard Worker 
847*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) =
848*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_csum_level;
849*387f9dfdSAndroid Build Coastguard Worker 
850*387f9dfdSAndroid Build Coastguard Worker struct tcp6_sock;
851*387f9dfdSAndroid Build Coastguard Worker struct tcp_sock;
852*387f9dfdSAndroid Build Coastguard Worker struct tcp_timewait_sock;
853*387f9dfdSAndroid Build Coastguard Worker struct tcp_request_sock;
854*387f9dfdSAndroid Build Coastguard Worker struct udp6_sock;
855*387f9dfdSAndroid Build Coastguard Worker static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) =
856*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_tcp6_sock;
857*387f9dfdSAndroid Build Coastguard Worker static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) =
858*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_tcp_sock;
859*387f9dfdSAndroid Build Coastguard Worker static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) =
860*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_tcp_timewait_sock;
861*387f9dfdSAndroid Build Coastguard Worker static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) =
862*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_tcp_request_sock;
863*387f9dfdSAndroid Build Coastguard Worker static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) =
864*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_udp6_sock;
865*387f9dfdSAndroid Build Coastguard Worker 
866*387f9dfdSAndroid Build Coastguard Worker struct task_struct;
867*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_task_stack)(struct task_struct *task, void *buf,
868*387f9dfdSAndroid Build Coastguard Worker 				  __u32 size, __u64 flags) =
869*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_task_stack;
870*387f9dfdSAndroid Build Coastguard Worker 
871*387f9dfdSAndroid Build Coastguard Worker struct bpf_sock_ops;
872*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res,
873*387f9dfdSAndroid Build Coastguard Worker                                 u32 len, u64 flags) =
874*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_load_hdr_opt;
875*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from,
876*387f9dfdSAndroid Build Coastguard Worker                                  u32 len, u64 flags) =
877*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_store_hdr_opt;
878*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, u32 len,
879*387f9dfdSAndroid Build Coastguard Worker                                    u64 flags) =
880*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_reserve_hdr_opt;
881*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_inode_storage_get)(struct bpf_map *map, void *inode,
882*387f9dfdSAndroid Build Coastguard Worker                                       void *value, u64 flags) =
883*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_inode_storage_get;
884*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_inode_storage_delete)(struct bpf_map *map, void *inode) =
885*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_inode_storage_delete;
886*387f9dfdSAndroid Build Coastguard Worker struct path;
887*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_d_path)(struct path *path, char *buf, u32 sz) =
888*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_d_path;
889*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_copy_from_user)(void *dst, u32 size, const void *user_ptr) =
890*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_copy_from_user;
891*387f9dfdSAndroid Build Coastguard Worker 
892*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_snprintf_btf)(char *str, u32 str_size, struct btf_ptr *ptr,
893*387f9dfdSAndroid Build Coastguard Worker 				u32 btf_ptr_size, u64 flags) =
894*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_snprintf_btf;
895*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr,
896*387f9dfdSAndroid Build Coastguard Worker 				  u32 ptr_size, u64 flags) =
897*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_seq_printf_btf;
898*387f9dfdSAndroid Build Coastguard Worker static u64 (*bpf_skb_cgroup_classid)(struct sk_buff *skb) =
899*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skb_cgroup_classid;
900*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_redirect_neigh)(u32 ifindex, struct bpf_redir_neigh *params,
901*387f9dfdSAndroid Build Coastguard Worker 				  u64 flags) =
902*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_redirect_neigh;
903*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_per_cpu_ptr)(const void *percpu_ptr, u32 cpu) =
904*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_per_cpu_ptr;
905*387f9dfdSAndroid Build Coastguard Worker static void * (*bpf_this_cpu_ptr)(const void *percpu_ptr) =
906*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_this_cpu_ptr;
907*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_redirect_peer)(u32 ifindex, u64 flags) = (void *)BPF_FUNC_redirect_peer;
908*387f9dfdSAndroid Build Coastguard Worker 
909*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_task_storage_get)(void *map, struct task_struct *task,
910*387f9dfdSAndroid Build Coastguard Worker 				     void *value, __u64 flags) =
911*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_task_storage_get;
912*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) =
913*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_task_storage_delete;
914*387f9dfdSAndroid Build Coastguard Worker static struct task_struct *(*bpf_get_current_task_btf)(void) =
915*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_current_task_btf;
916*387f9dfdSAndroid Build Coastguard Worker struct linux_binprm;
917*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) =
918*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_bprm_opts_set;
919*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *)BPF_FUNC_ktime_get_coarse_ns;
920*387f9dfdSAndroid Build Coastguard Worker struct inode;
921*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) =
922*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ima_inode_hash;
923*387f9dfdSAndroid Build Coastguard Worker struct file;
924*387f9dfdSAndroid Build Coastguard Worker static struct socket *(*bpf_sock_from_file)(struct file *file) =
925*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_sock_from_file;
926*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len,
927*387f9dfdSAndroid Build Coastguard Worker                              __s32 len_diff, __u64 flags) =
928*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_check_mtu;
929*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_for_each_map_elem)(void *map, void *callback_fn,
930*387f9dfdSAndroid Build Coastguard Worker                                      void *callback_ctx, __u64 flags) =
931*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_for_each_map_elem;
932*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt,
933*387f9dfdSAndroid Build Coastguard Worker                             __u64 *data, __u32 data_len) =
934*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_snprintf;
935*387f9dfdSAndroid Build Coastguard Worker 
936*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) =
937*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_sys_bpf;
938*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) =
939*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_btf_find_by_name_kind;
940*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_sys_close)(__u32 fd) = (void *)BPF_FUNC_sys_close;
941*387f9dfdSAndroid Build Coastguard Worker 
942*387f9dfdSAndroid Build Coastguard Worker struct bpf_timer;
943*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) =
944*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_timer_init;
945*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) =
946*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_timer_set_callback;
947*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) =
948*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_timer_start;
949*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *)BPF_FUNC_timer_cancel;
950*387f9dfdSAndroid Build Coastguard Worker 
951*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_func_ip)(void *ctx) = (void *)BPF_FUNC_get_func_ip;
952*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *)BPF_FUNC_get_attach_cookie;
953*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *)BPF_FUNC_task_pt_regs;
954*387f9dfdSAndroid Build Coastguard Worker 
955*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) =
956*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_branch_snapshot;
957*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data,
958*387f9dfdSAndroid Build Coastguard Worker                                  __u32 data_len) =
959*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_trace_vprintk;
960*387f9dfdSAndroid Build Coastguard Worker static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) =
961*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_unix_sock;
962*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags,
963*387f9dfdSAndroid Build Coastguard Worker 				__u64 *res) =
964*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_kallsyms_lookup_name;
965*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn,
966*387f9dfdSAndroid Build Coastguard Worker 			    void *callback_ctx, __u64 flags) =
967*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_find_vma;
968*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) =
969*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_loop;
970*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) =
971*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_strncmp;
972*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) =
973*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_get_func_arg;
974*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *)BPF_FUNC_get_func_ret;
975*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *)BPF_FUNC_get_func_arg_cnt;
976*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_get_retval)(void) = (void *)BPF_FUNC_get_retval;
977*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_set_retval)(int retval) = (void *)BPF_FUNC_set_retval;
978*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *)BPF_FUNC_xdp_get_buff_len;
979*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) =
980*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_xdp_load_bytes;
981*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) =
982*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_xdp_store_bytes;
983*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr,
984*387f9dfdSAndroid Build Coastguard Worker 				       struct task_struct *tsk, __u64 flags) =
985*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_copy_from_user_task;
986*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) =
987*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skb_set_tstamp;
988*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) =
989*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ima_file_hash;
990*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *)BPF_FUNC_kptr_xchg;
991*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) =
992*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_map_lookup_percpu_elem;
993*387f9dfdSAndroid Build Coastguard Worker 
994*387f9dfdSAndroid Build Coastguard Worker struct mptcp_sock;
995*387f9dfdSAndroid Build Coastguard Worker struct bpf_dynptr;
996*387f9dfdSAndroid Build Coastguard Worker struct iphdr;
997*387f9dfdSAndroid Build Coastguard Worker struct ipv6hdr;
998*387f9dfdSAndroid Build Coastguard Worker struct tcphdr;
999*387f9dfdSAndroid Build Coastguard Worker static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) =
1000*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_skc_to_mptcp_sock;
1001*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags,
1002*387f9dfdSAndroid Build Coastguard Worker 				   struct bpf_dynptr *ptr) =
1003*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_dynptr_from_mem;
1004*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags,
1005*387f9dfdSAndroid Build Coastguard Worker 					  struct bpf_dynptr *ptr) =
1006*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_reserve_dynptr;
1007*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) =
1008*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_submit_dynptr;
1009*387f9dfdSAndroid Build Coastguard Worker static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) =
1010*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_ringbuf_discard_dynptr;
1011*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_read)(void *dst, __u32 len, const struct bpf_dynptr *src, __u32 offset,
1012*387f9dfdSAndroid Build Coastguard Worker 			       __u64 flags) =
1013*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_dynptr_read;
1014*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_dynptr_write)(const struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len,
1015*387f9dfdSAndroid Build Coastguard Worker 				__u64 flags) =
1016*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_dynptr_write;
1017*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_dynptr_data)(const struct bpf_dynptr *ptr, __u32 offset, __u32 len) =
1018*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_dynptr_data;
1019*387f9dfdSAndroid Build Coastguard Worker static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th,
1020*387f9dfdSAndroid Build Coastguard Worker 					       __u32 th_len) =
1021*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_tcp_raw_gen_syncookie_ipv4;
1022*387f9dfdSAndroid Build Coastguard Worker static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th,
1023*387f9dfdSAndroid Build Coastguard Worker 					       __u32 th_len) =
1024*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_tcp_raw_gen_syncookie_ipv6;
1025*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) =
1026*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_tcp_raw_check_syncookie_ipv4;
1027*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) =
1028*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_tcp_raw_check_syncookie_ipv6;
1029*387f9dfdSAndroid Build Coastguard Worker 
1030*387f9dfdSAndroid Build Coastguard Worker static __u64 (*bpf_ktime_get_tai_ns)(void) = (void *)BPF_FUNC_ktime_get_tai_ns;
1031*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_user_ringbuf_drain)(void *map, void *callback_fn, void *ctx, __u64 flags) =
1032*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_user_ringbuf_drain;
1033*387f9dfdSAndroid Build Coastguard Worker 
1034*387f9dfdSAndroid Build Coastguard Worker struct cgroup;
1035*387f9dfdSAndroid Build Coastguard Worker static void *(*bpf_cgrp_storage_get)(void *map, struct cgroup *cgroup, void *value, __u64 flags) =
1036*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_cgrp_storage_get;
1037*387f9dfdSAndroid Build Coastguard Worker static long (*bpf_cgrp_storage_delete)(void *map, struct cgroup *cgroup) =
1038*387f9dfdSAndroid Build Coastguard Worker   (void *)BPF_FUNC_cgrp_storage_delete;
1039*387f9dfdSAndroid Build Coastguard Worker 
1040*387f9dfdSAndroid Build Coastguard Worker /* llvm builtin functions that eBPF C program may use to
1041*387f9dfdSAndroid Build Coastguard Worker  * emit BPF_LD_ABS and BPF_LD_IND instructions
1042*387f9dfdSAndroid Build Coastguard Worker  */
1043*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_byte(void *skb,
1044*387f9dfdSAndroid Build Coastguard Worker   unsigned long long off) asm("llvm.bpf.load.byte");
1045*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_half(void *skb,
1046*387f9dfdSAndroid Build Coastguard Worker   unsigned long long off) asm("llvm.bpf.load.half");
1047*387f9dfdSAndroid Build Coastguard Worker unsigned long long load_word(void *skb,
1048*387f9dfdSAndroid Build Coastguard Worker   unsigned long long off) asm("llvm.bpf.load.word");
1049*387f9dfdSAndroid Build Coastguard Worker 
1050*387f9dfdSAndroid Build Coastguard Worker /* a helper structure used by eBPF C program
1051*387f9dfdSAndroid Build Coastguard Worker  * to describe map attributes to elf_bpf loader
1052*387f9dfdSAndroid Build Coastguard Worker  */
1053*387f9dfdSAndroid Build Coastguard Worker struct bpf_map_def {
1054*387f9dfdSAndroid Build Coastguard Worker   unsigned int type;
1055*387f9dfdSAndroid Build Coastguard Worker   unsigned int key_size;
1056*387f9dfdSAndroid Build Coastguard Worker   unsigned int value_size;
1057*387f9dfdSAndroid Build Coastguard Worker   unsigned int max_entries;
1058*387f9dfdSAndroid Build Coastguard Worker };
1059*387f9dfdSAndroid Build Coastguard Worker 
1060*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_skb_store_bytes)(void *ctx, unsigned long long off, void *from,
1061*387f9dfdSAndroid Build Coastguard Worker                                   unsigned long long len, unsigned long long flags) =
1062*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_skb_store_bytes;
1063*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_l3_csum_replace)(void *ctx, unsigned long long off, unsigned long long from,
1064*387f9dfdSAndroid Build Coastguard Worker                                   unsigned long long to, unsigned long long flags) =
1065*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_l3_csum_replace;
1066*387f9dfdSAndroid Build Coastguard Worker static int (*bpf_l4_csum_replace)(void *ctx, unsigned long long off, unsigned long long from,
1067*387f9dfdSAndroid Build Coastguard Worker                                   unsigned long long to, unsigned long long flags) =
1068*387f9dfdSAndroid Build Coastguard Worker   (void *) BPF_FUNC_l4_csum_replace;
1069*387f9dfdSAndroid Build Coastguard Worker 
1070*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1071*387f9dfdSAndroid Build Coastguard Worker u16 bpf_ntohs(u16 val) {
1072*387f9dfdSAndroid Build Coastguard Worker   /* will be recognized by gcc into rotate insn and eventually rolw 8 */
1073*387f9dfdSAndroid Build Coastguard Worker   return (val << 8) | (val >> 8);
1074*387f9dfdSAndroid Build Coastguard Worker }
1075*387f9dfdSAndroid Build Coastguard Worker 
1076*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1077*387f9dfdSAndroid Build Coastguard Worker u32 bpf_ntohl(u32 val) {
1078*387f9dfdSAndroid Build Coastguard Worker   /* gcc will use bswapsi2 insn */
1079*387f9dfdSAndroid Build Coastguard Worker   return __builtin_bswap32(val);
1080*387f9dfdSAndroid Build Coastguard Worker }
1081*387f9dfdSAndroid Build Coastguard Worker 
1082*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1083*387f9dfdSAndroid Build Coastguard Worker u64 bpf_ntohll(u64 val) {
1084*387f9dfdSAndroid Build Coastguard Worker   /* gcc will use bswapdi2 insn */
1085*387f9dfdSAndroid Build Coastguard Worker   return __builtin_bswap64(val);
1086*387f9dfdSAndroid Build Coastguard Worker }
1087*387f9dfdSAndroid Build Coastguard Worker 
1088*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1089*387f9dfdSAndroid Build Coastguard Worker unsigned __int128 bpf_ntoh128(unsigned __int128 val) {
1090*387f9dfdSAndroid Build Coastguard Worker   return (((unsigned __int128)bpf_ntohll(val) << 64) | (u64)bpf_ntohll(val >> 64));
1091*387f9dfdSAndroid Build Coastguard Worker }
1092*387f9dfdSAndroid Build Coastguard Worker 
1093*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1094*387f9dfdSAndroid Build Coastguard Worker u16 bpf_htons(u16 val) {
1095*387f9dfdSAndroid Build Coastguard Worker   return bpf_ntohs(val);
1096*387f9dfdSAndroid Build Coastguard Worker }
1097*387f9dfdSAndroid Build Coastguard Worker 
1098*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1099*387f9dfdSAndroid Build Coastguard Worker u32 bpf_htonl(u32 val) {
1100*387f9dfdSAndroid Build Coastguard Worker   return bpf_ntohl(val);
1101*387f9dfdSAndroid Build Coastguard Worker }
1102*387f9dfdSAndroid Build Coastguard Worker 
1103*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1104*387f9dfdSAndroid Build Coastguard Worker u64 bpf_htonll(u64 val) {
1105*387f9dfdSAndroid Build Coastguard Worker   return bpf_ntohll(val);
1106*387f9dfdSAndroid Build Coastguard Worker }
1107*387f9dfdSAndroid Build Coastguard Worker 
1108*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1109*387f9dfdSAndroid Build Coastguard Worker unsigned __int128 bpf_hton128(unsigned __int128 val) {
1110*387f9dfdSAndroid Build Coastguard Worker   return bpf_ntoh128(val);
1111*387f9dfdSAndroid Build Coastguard Worker }
1112*387f9dfdSAndroid Build Coastguard Worker 
1113*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1114*387f9dfdSAndroid Build Coastguard Worker u64 load_dword(void *skb, u64 off) {
1115*387f9dfdSAndroid Build Coastguard Worker   return ((u64)load_word(skb, off) << 32) | load_word(skb, off + 4);
1116*387f9dfdSAndroid Build Coastguard Worker }
1117*387f9dfdSAndroid Build Coastguard Worker 
1118*387f9dfdSAndroid Build Coastguard Worker void bpf_store_byte(void *skb, u64 off, u64 val) asm("llvm.bpf.store.byte");
1119*387f9dfdSAndroid Build Coastguard Worker void bpf_store_half(void *skb, u64 off, u64 val) asm("llvm.bpf.store.half");
1120*387f9dfdSAndroid Build Coastguard Worker void bpf_store_word(void *skb, u64 off, u64 val) asm("llvm.bpf.store.word");
1121*387f9dfdSAndroid Build Coastguard Worker u64 bpf_pseudo_fd(u64, u64) asm("llvm.bpf.pseudo");
1122*387f9dfdSAndroid Build Coastguard Worker 
1123*387f9dfdSAndroid Build Coastguard Worker static inline void __attribute__((always_inline))
1124*387f9dfdSAndroid Build Coastguard Worker bpf_store_dword(void *skb, u64 off, u64 val) {
1125*387f9dfdSAndroid Build Coastguard Worker   bpf_store_word(skb, off, (u32)val);
1126*387f9dfdSAndroid Build Coastguard Worker   bpf_store_word(skb, off + 4, val >> 32);
1127*387f9dfdSAndroid Build Coastguard Worker }
1128*387f9dfdSAndroid Build Coastguard Worker 
1129*387f9dfdSAndroid Build Coastguard Worker #define MASK(_n) ((_n) < 64 ? (1ull << (_n)) - 1 : ((u64)-1LL))
1130*387f9dfdSAndroid Build Coastguard Worker #define MASK128(_n) ((_n) < 128 ? ((unsigned __int128)1 << (_n)) - 1 : ((unsigned __int128)-1))
1131*387f9dfdSAndroid Build Coastguard Worker 
1132*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1133*387f9dfdSAndroid Build Coastguard Worker unsigned int bpf_log2(unsigned int v)
1134*387f9dfdSAndroid Build Coastguard Worker {
1135*387f9dfdSAndroid Build Coastguard Worker   unsigned int r;
1136*387f9dfdSAndroid Build Coastguard Worker   unsigned int shift;
1137*387f9dfdSAndroid Build Coastguard Worker 
1138*387f9dfdSAndroid Build Coastguard Worker   r = (v > 0xFFFF) << 4; v >>= r;
1139*387f9dfdSAndroid Build Coastguard Worker   shift = (v > 0xFF) << 3; v >>= shift; r |= shift;
1140*387f9dfdSAndroid Build Coastguard Worker   shift = (v > 0xF) << 2; v >>= shift; r |= shift;
1141*387f9dfdSAndroid Build Coastguard Worker   shift = (v > 0x3) << 1; v >>= shift; r |= shift;
1142*387f9dfdSAndroid Build Coastguard Worker   r |= (v >> 1);
1143*387f9dfdSAndroid Build Coastguard Worker   return r;
1144*387f9dfdSAndroid Build Coastguard Worker }
1145*387f9dfdSAndroid Build Coastguard Worker 
1146*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1147*387f9dfdSAndroid Build Coastguard Worker unsigned int bpf_log2l(unsigned long v)
1148*387f9dfdSAndroid Build Coastguard Worker {
1149*387f9dfdSAndroid Build Coastguard Worker   unsigned int hi = v >> 32;
1150*387f9dfdSAndroid Build Coastguard Worker   if (hi)
1151*387f9dfdSAndroid Build Coastguard Worker     return bpf_log2(hi) + 32 + 1;
1152*387f9dfdSAndroid Build Coastguard Worker   else
1153*387f9dfdSAndroid Build Coastguard Worker     return bpf_log2(v) + 1;
1154*387f9dfdSAndroid Build Coastguard Worker }
1155*387f9dfdSAndroid Build Coastguard Worker 
1156*387f9dfdSAndroid Build Coastguard Worker struct bpf_context;
1157*387f9dfdSAndroid Build Coastguard Worker 
1158*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1159*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1160*387f9dfdSAndroid Build Coastguard Worker u64 bpf_dext_pkt(void *pkt, u64 off, u64 bofs, u64 bsz) {
1161*387f9dfdSAndroid Build Coastguard Worker   if (bofs == 0 && bsz == 8) {
1162*387f9dfdSAndroid Build Coastguard Worker     return load_byte(pkt, off);
1163*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 8) {
1164*387f9dfdSAndroid Build Coastguard Worker     return load_byte(pkt, off) >> (8 - (bofs + bsz))  &  MASK(bsz);
1165*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 16) {
1166*387f9dfdSAndroid Build Coastguard Worker     return load_half(pkt, off);
1167*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 16) {
1168*387f9dfdSAndroid Build Coastguard Worker     return load_half(pkt, off) >> (16 - (bofs + bsz))  &  MASK(bsz);
1169*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 32) {
1170*387f9dfdSAndroid Build Coastguard Worker     return load_word(pkt, off);
1171*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 32) {
1172*387f9dfdSAndroid Build Coastguard Worker     return load_word(pkt, off) >> (32 - (bofs + bsz))  &  MASK(bsz);
1173*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 64) {
1174*387f9dfdSAndroid Build Coastguard Worker     return load_dword(pkt, off);
1175*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 64) {
1176*387f9dfdSAndroid Build Coastguard Worker     return load_dword(pkt, off) >> (64 - (bofs + bsz))  &  MASK(bsz);
1177*387f9dfdSAndroid Build Coastguard Worker   }
1178*387f9dfdSAndroid Build Coastguard Worker   return 0;
1179*387f9dfdSAndroid Build Coastguard Worker }
1180*387f9dfdSAndroid Build Coastguard Worker 
1181*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1182*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1183*387f9dfdSAndroid Build Coastguard Worker void bpf_dins_pkt(void *pkt, u64 off, u64 bofs, u64 bsz, u64 val) {
1184*387f9dfdSAndroid Build Coastguard Worker   // The load_xxx function does a bswap before returning the short/word/dword,
1185*387f9dfdSAndroid Build Coastguard Worker   // so the value in register will always be host endian. However, the bytes
1186*387f9dfdSAndroid Build Coastguard Worker   // written back need to be in network order.
1187*387f9dfdSAndroid Build Coastguard Worker   if (bofs == 0 && bsz == 8) {
1188*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &val, 1, 0);
1189*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 8) {
1190*387f9dfdSAndroid Build Coastguard Worker     u8 v = load_byte(pkt, off);
1191*387f9dfdSAndroid Build Coastguard Worker     v &= ~(MASK(bsz) << (8 - (bofs + bsz)));
1192*387f9dfdSAndroid Build Coastguard Worker     v |= ((val & MASK(bsz)) << (8 - (bofs + bsz)));
1193*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 1, 0);
1194*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 16) {
1195*387f9dfdSAndroid Build Coastguard Worker     u16 v = bpf_htons(val);
1196*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 2, 0);
1197*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 16) {
1198*387f9dfdSAndroid Build Coastguard Worker     u16 v = load_half(pkt, off);
1199*387f9dfdSAndroid Build Coastguard Worker     v &= ~(MASK(bsz) << (16 - (bofs + bsz)));
1200*387f9dfdSAndroid Build Coastguard Worker     v |= ((val & MASK(bsz)) << (16 - (bofs + bsz)));
1201*387f9dfdSAndroid Build Coastguard Worker     v = bpf_htons(v);
1202*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 2, 0);
1203*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 32) {
1204*387f9dfdSAndroid Build Coastguard Worker     u32 v = bpf_htonl(val);
1205*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 4, 0);
1206*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 32) {
1207*387f9dfdSAndroid Build Coastguard Worker     u32 v = load_word(pkt, off);
1208*387f9dfdSAndroid Build Coastguard Worker     v &= ~(MASK(bsz) << (32 - (bofs + bsz)));
1209*387f9dfdSAndroid Build Coastguard Worker     v |= ((val & MASK(bsz)) << (32 - (bofs + bsz)));
1210*387f9dfdSAndroid Build Coastguard Worker     v = bpf_htonl(v);
1211*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 4, 0);
1212*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs == 0 && bsz == 64) {
1213*387f9dfdSAndroid Build Coastguard Worker     u64 v = bpf_htonll(val);
1214*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 8, 0);
1215*387f9dfdSAndroid Build Coastguard Worker   } else if (bofs + bsz <= 64) {
1216*387f9dfdSAndroid Build Coastguard Worker     u64 v = load_dword(pkt, off);
1217*387f9dfdSAndroid Build Coastguard Worker     v &= ~(MASK(bsz) << (64 - (bofs + bsz)));
1218*387f9dfdSAndroid Build Coastguard Worker     v |= ((val & MASK(bsz)) << (64 - (bofs + bsz)));
1219*387f9dfdSAndroid Build Coastguard Worker     v = bpf_htonll(v);
1220*387f9dfdSAndroid Build Coastguard Worker     bpf_skb_store_bytes(pkt, off, &v, 8, 0);
1221*387f9dfdSAndroid Build Coastguard Worker   }
1222*387f9dfdSAndroid Build Coastguard Worker }
1223*387f9dfdSAndroid Build Coastguard Worker 
1224*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1225*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1226*387f9dfdSAndroid Build Coastguard Worker void * bpf_map_lookup_elem_(uintptr_t map, void *key) {
1227*387f9dfdSAndroid Build Coastguard Worker   return bpf_map_lookup_elem((void *)map, key);
1228*387f9dfdSAndroid Build Coastguard Worker }
1229*387f9dfdSAndroid Build Coastguard Worker 
1230*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1231*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1232*387f9dfdSAndroid Build Coastguard Worker int bpf_map_update_elem_(uintptr_t map, void *key, void *value, u64 flags) {
1233*387f9dfdSAndroid Build Coastguard Worker   return bpf_map_update_elem((void *)map, key, value, flags);
1234*387f9dfdSAndroid Build Coastguard Worker }
1235*387f9dfdSAndroid Build Coastguard Worker 
1236*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1237*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1238*387f9dfdSAndroid Build Coastguard Worker int bpf_map_delete_elem_(uintptr_t map, void *key) {
1239*387f9dfdSAndroid Build Coastguard Worker   return bpf_map_delete_elem((void *)map, key);
1240*387f9dfdSAndroid Build Coastguard Worker }
1241*387f9dfdSAndroid Build Coastguard Worker 
1242*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1243*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1244*387f9dfdSAndroid Build Coastguard Worker int bpf_l3_csum_replace_(void *ctx, u64 off, u64 from, u64 to, u64 flags) {
1245*387f9dfdSAndroid Build Coastguard Worker   switch (flags & 0xf) {
1246*387f9dfdSAndroid Build Coastguard Worker     case 2:
1247*387f9dfdSAndroid Build Coastguard Worker       return bpf_l3_csum_replace(ctx, off, bpf_htons(from), bpf_htons(to), flags);
1248*387f9dfdSAndroid Build Coastguard Worker     case 4:
1249*387f9dfdSAndroid Build Coastguard Worker       return bpf_l3_csum_replace(ctx, off, bpf_htonl(from), bpf_htonl(to), flags);
1250*387f9dfdSAndroid Build Coastguard Worker     case 8:
1251*387f9dfdSAndroid Build Coastguard Worker       return bpf_l3_csum_replace(ctx, off, bpf_htonll(from), bpf_htonll(to), flags);
1252*387f9dfdSAndroid Build Coastguard Worker     default:
1253*387f9dfdSAndroid Build Coastguard Worker       {}
1254*387f9dfdSAndroid Build Coastguard Worker   }
1255*387f9dfdSAndroid Build Coastguard Worker   return bpf_l3_csum_replace(ctx, off, from, to, flags);
1256*387f9dfdSAndroid Build Coastguard Worker }
1257*387f9dfdSAndroid Build Coastguard Worker 
1258*387f9dfdSAndroid Build Coastguard Worker static inline __attribute__((always_inline))
1259*387f9dfdSAndroid Build Coastguard Worker BCC_SEC_HELPERS
1260*387f9dfdSAndroid Build Coastguard Worker int bpf_l4_csum_replace_(void *ctx, u64 off, u64 from, u64 to, u64 flags) {
1261*387f9dfdSAndroid Build Coastguard Worker   switch (flags & 0xf) {
1262*387f9dfdSAndroid Build Coastguard Worker     case 2:
1263*387f9dfdSAndroid Build Coastguard Worker       return bpf_l4_csum_replace(ctx, off, bpf_htons(from), bpf_htons(to), flags);
1264*387f9dfdSAndroid Build Coastguard Worker     case 4:
1265*387f9dfdSAndroid Build Coastguard Worker       return bpf_l4_csum_replace(ctx, off, bpf_htonl(from), bpf_htonl(to), flags);
1266*387f9dfdSAndroid Build Coastguard Worker     case 8:
1267*387f9dfdSAndroid Build Coastguard Worker       return bpf_l4_csum_replace(ctx, off, bpf_htonll(from), bpf_htonll(to), flags);
1268*387f9dfdSAndroid Build Coastguard Worker     default:
1269*387f9dfdSAndroid Build Coastguard Worker       {}
1270*387f9dfdSAndroid Build Coastguard Worker   }
1271*387f9dfdSAndroid Build Coastguard Worker   return bpf_l4_csum_replace(ctx, off, from, to, flags);
1272*387f9dfdSAndroid Build Coastguard Worker }
1273*387f9dfdSAndroid Build Coastguard Worker 
1274*387f9dfdSAndroid Build Coastguard Worker int incr_cksum_l3(void *off, u64 oldval, u64 newval) asm("llvm.bpf.extra");
1275*387f9dfdSAndroid Build Coastguard Worker int incr_cksum_l4(void *off, u64 oldval, u64 newval, u64 flags) asm("llvm.bpf.extra");
1276*387f9dfdSAndroid Build Coastguard Worker int bpf_num_cpus() asm("llvm.bpf.extra");
1277*387f9dfdSAndroid Build Coastguard Worker 
1278*387f9dfdSAndroid Build Coastguard Worker struct pt_regs;
1279*387f9dfdSAndroid Build Coastguard Worker int bpf_usdt_readarg(int argc, struct pt_regs *ctx, void *arg) asm("llvm.bpf.extra");
1280*387f9dfdSAndroid Build Coastguard Worker int bpf_usdt_readarg_p(int argc, struct pt_regs *ctx, void *buf, u64 len) asm("llvm.bpf.extra");
1281*387f9dfdSAndroid Build Coastguard Worker 
1282*387f9dfdSAndroid Build Coastguard Worker /* Scan the ARCH passed in from ARCH env variable (see kbuild_helper.cc) */
1283*387f9dfdSAndroid Build Coastguard Worker #if defined(__TARGET_ARCH_x86)
1284*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_x86
1285*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1286*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_s390x)
1287*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_s390x
1288*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1289*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_arm64)
1290*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_arm64
1291*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1292*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_powerpc)
1293*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_powerpc
1294*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1295*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_mips)
1296*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_mips
1297*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1298*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_riscv64)
1299*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_riscv64
1300*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1301*387f9dfdSAndroid Build Coastguard Worker #elif defined(__TARGET_ARCH_loongarch)
1302*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_loongarch
1303*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_defined
1304*387f9dfdSAndroid Build Coastguard Worker #else
1305*387f9dfdSAndroid Build Coastguard Worker #undef bpf_target_defined
1306*387f9dfdSAndroid Build Coastguard Worker #endif
1307*387f9dfdSAndroid Build Coastguard Worker 
1308*387f9dfdSAndroid Build Coastguard Worker /* Fall back to what the compiler says */
1309*387f9dfdSAndroid Build Coastguard Worker #ifndef bpf_target_defined
1310*387f9dfdSAndroid Build Coastguard Worker #if defined(__x86_64__)
1311*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_x86
1312*387f9dfdSAndroid Build Coastguard Worker #elif defined(__s390x__)
1313*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_s390x
1314*387f9dfdSAndroid Build Coastguard Worker #elif defined(__aarch64__)
1315*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_arm64
1316*387f9dfdSAndroid Build Coastguard Worker #elif defined(__powerpc__)
1317*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_powerpc
1318*387f9dfdSAndroid Build Coastguard Worker #elif defined(__mips__)
1319*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_mips
1320*387f9dfdSAndroid Build Coastguard Worker #elif defined(__riscv) && (__riscv_xlen == 64)
1321*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_riscv64
1322*387f9dfdSAndroid Build Coastguard Worker #elif defined(__loongarch__)
1323*387f9dfdSAndroid Build Coastguard Worker #define bpf_target_loongarch
1324*387f9dfdSAndroid Build Coastguard Worker #endif
1325*387f9dfdSAndroid Build Coastguard Worker #endif
1326*387f9dfdSAndroid Build Coastguard Worker 
1327*387f9dfdSAndroid Build Coastguard Worker #if defined(bpf_target_powerpc)
1328*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(ctx)	((ctx)->gpr[3])
1329*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(ctx)	((ctx)->gpr[4])
1330*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(ctx)	((ctx)->gpr[5])
1331*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(ctx)	((ctx)->gpr[6])
1332*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(ctx)	((ctx)->gpr[7])
1333*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(ctx)	((ctx)->gpr[8])
1334*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(ctx)		((ctx)->gpr[3])
1335*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(ctx)		((ctx)->nip)
1336*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(ctx)		((ctx)->gpr[1])
1337*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_s390x)
1338*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->gprs[2])
1339*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->gprs[3])
1340*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->gprs[4])
1341*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->gprs[5])
1342*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->gprs[6])
1343*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->gprs[14])
1344*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */
1345*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->gprs[2])
1346*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->gprs[15])
1347*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->psw.addr)
1348*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_x86)
1349*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(ctx)	((ctx)->di)
1350*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(ctx)	((ctx)->si)
1351*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(ctx)	((ctx)->dx)
1352*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(ctx)	((ctx)->cx)
1353*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(ctx)	((ctx)->r8)
1354*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(ctx)	((ctx)->r9)
1355*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(ctx)	((ctx)->sp)
1356*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(ctx)         ((ctx)->bp) /* Works only with CONFIG_FRAME_POINTER */
1357*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(ctx)		((ctx)->ax)
1358*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(ctx)		((ctx)->ip)
1359*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(ctx)		((ctx)->sp)
1360*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_arm64)
1361*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x)	((x)->regs[0])
1362*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x)	((x)->regs[1])
1363*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x)	((x)->regs[2])
1364*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x)	((x)->regs[3])
1365*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x)	((x)->regs[4])
1366*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x)	((x)->regs[5])
1367*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x)		((x)->regs[30])
1368*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x)		((x)->regs[29]) /*  Works only with CONFIG_FRAME_POINTER */
1369*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x)		((x)->regs[0])
1370*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x)		((x)->sp)
1371*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x)		((x)->pc)
1372*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_mips)
1373*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->regs[4])
1374*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->regs[5])
1375*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->regs[6])
1376*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->regs[7])
1377*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->regs[8])
1378*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) ((x)->regs[9])
1379*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->regs[31])
1380*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */
1381*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->regs[2])
1382*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->regs[29])
1383*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->cp0_epc)
1384*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_riscv64)
1385*387f9dfdSAndroid Build Coastguard Worker /* riscv64 provides struct user_pt_regs instead of struct pt_regs to userspace */
1386*387f9dfdSAndroid Build Coastguard Worker #define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x))
1387*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->a0)
1388*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->a1)
1389*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->a2)
1390*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->a3)
1391*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->a4)
1392*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->a5)
1393*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) (__PT_REGS_CAST(x)->ra)
1394*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) (__PT_REGS_CAST(x)->s0) /* Works only with CONFIG_FRAME_POINTER */
1395*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) (__PT_REGS_CAST(x)->a0)
1396*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) (__PT_REGS_CAST(x)->sp)
1397*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) (__PT_REGS_CAST(x)->pc)
1398*387f9dfdSAndroid Build Coastguard Worker #elif defined(bpf_target_loongarch)
1399*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1(x) ((x)->regs[4])
1400*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2(x) ((x)->regs[5])
1401*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3(x) ((x)->regs[6])
1402*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4(x) ((x)->regs[7])
1403*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5(x) ((x)->regs[8])
1404*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6(x) ((x)->regs[9])
1405*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RET(x) ((x)->regs[1])
1406*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_FP(x) ((x)->regs[22]) /* Works only with CONFIG_FRAME_POINTER */
1407*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_RC(x) ((x)->regs[4])
1408*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SP(x) ((x)->regs[3])
1409*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_IP(x) ((x)->csr_era)
1410*387f9dfdSAndroid Build Coastguard Worker #else
1411*387f9dfdSAndroid Build Coastguard Worker #error "bcc does not support this platform yet"
1412*387f9dfdSAndroid Build Coastguard Worker #endif
1413*387f9dfdSAndroid Build Coastguard Worker 
1414*387f9dfdSAndroid Build Coastguard Worker #if defined(CONFIG_ARCH_HAS_SYSCALL_WRAPPER) && !defined(__s390x__)
1415*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SYSCALL_CTX(ctx)	((struct pt_regs *)PT_REGS_PARM1(ctx))
1416*387f9dfdSAndroid Build Coastguard Worker #else
1417*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_SYSCALL_CTX(ctx)	(ctx)
1418*387f9dfdSAndroid Build Coastguard Worker #endif
1419*387f9dfdSAndroid Build Coastguard Worker /* Helpers for syscall params. Pass in a ctx returned from PT_REGS_SYSCALL_CTX.
1420*387f9dfdSAndroid Build Coastguard Worker  */
1421*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM1_SYSCALL(ctx)	PT_REGS_PARM1(ctx)
1422*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM2_SYSCALL(ctx)	PT_REGS_PARM2(ctx)
1423*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM3_SYSCALL(ctx)	PT_REGS_PARM3(ctx)
1424*387f9dfdSAndroid Build Coastguard Worker #if defined(bpf_target_x86)
1425*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4_SYSCALL(ctx)	((ctx)->r10) /* for syscall only */
1426*387f9dfdSAndroid Build Coastguard Worker #else
1427*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM4_SYSCALL(ctx)	PT_REGS_PARM4(ctx)
1428*387f9dfdSAndroid Build Coastguard Worker #endif
1429*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM5_SYSCALL(ctx)	PT_REGS_PARM5(ctx)
1430*387f9dfdSAndroid Build Coastguard Worker #ifdef PT_REGS_PARM6
1431*387f9dfdSAndroid Build Coastguard Worker #define PT_REGS_PARM6_SYSCALL(ctx)	PT_REGS_PARM6(ctx)
1432*387f9dfdSAndroid Build Coastguard Worker #endif
1433*387f9dfdSAndroid Build Coastguard Worker 
1434*387f9dfdSAndroid Build Coastguard Worker #define lock_xadd(ptr, val) ((void)__sync_fetch_and_add(ptr, val))
1435*387f9dfdSAndroid Build Coastguard Worker 
1436*387f9dfdSAndroid Build Coastguard Worker #define TRACEPOINT_PROBE(category, event) \
1437*387f9dfdSAndroid Build Coastguard Worker int tracepoint__##category##__##event(struct tracepoint__##category##__##event *args)
1438*387f9dfdSAndroid Build Coastguard Worker 
1439*387f9dfdSAndroid Build Coastguard Worker #define RAW_TRACEPOINT_PROBE(event) \
1440*387f9dfdSAndroid Build Coastguard Worker int raw_tracepoint__##event(struct bpf_raw_tracepoint_args *ctx)
1441*387f9dfdSAndroid Build Coastguard Worker 
1442*387f9dfdSAndroid Build Coastguard Worker /* BPF_PROG macro allows to define trampoline function,
1443*387f9dfdSAndroid Build Coastguard Worker  * borrowed from kernel bpf selftest code.
1444*387f9dfdSAndroid Build Coastguard Worker  */
1445*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_concat(a, b) a ## b
1446*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_apply(fn, n) ___bpf_concat(fn, n)
1447*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N
1448*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_narg(...) \
1449*387f9dfdSAndroid Build Coastguard Worker         ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
1450*387f9dfdSAndroid Build Coastguard Worker 
1451*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast0() ctx
1452*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0]
1453*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1]
1454*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2]
1455*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3]
1456*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4]
1457*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5]
1458*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6]
1459*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7]
1460*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8]
1461*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9]
1462*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10]
1463*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11]
1464*387f9dfdSAndroid Build Coastguard Worker #define ___bpf_ctx_cast(args...) \
1465*387f9dfdSAndroid Build Coastguard Worker         ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args)
1466*387f9dfdSAndroid Build Coastguard Worker 
1467*387f9dfdSAndroid Build Coastguard Worker #define BPF_PROG(name, args...)                                 \
1468*387f9dfdSAndroid Build Coastguard Worker int name(unsigned long long *ctx);                              \
1469*387f9dfdSAndroid Build Coastguard Worker __attribute__((always_inline))                                  \
1470*387f9dfdSAndroid Build Coastguard Worker static int ____##name(unsigned long long *ctx, ##args);         \
1471*387f9dfdSAndroid Build Coastguard Worker int name(unsigned long long *ctx)                               \
1472*387f9dfdSAndroid Build Coastguard Worker {                                                               \
1473*387f9dfdSAndroid Build Coastguard Worker         int __ret;                                              \
1474*387f9dfdSAndroid Build Coastguard Worker                                                                 \
1475*387f9dfdSAndroid Build Coastguard Worker         _Pragma("GCC diagnostic push")                          \
1476*387f9dfdSAndroid Build Coastguard Worker         _Pragma("GCC diagnostic ignored \"-Wint-conversion\"")  \
1477*387f9dfdSAndroid Build Coastguard Worker         __ret = ____##name(___bpf_ctx_cast(args));              \
1478*387f9dfdSAndroid Build Coastguard Worker         _Pragma("GCC diagnostic pop")                           \
1479*387f9dfdSAndroid Build Coastguard Worker         return __ret;                                           \
1480*387f9dfdSAndroid Build Coastguard Worker }                                                               \
1481*387f9dfdSAndroid Build Coastguard Worker static int ____##name(unsigned long long *ctx, ##args)
1482*387f9dfdSAndroid Build Coastguard Worker 
1483*387f9dfdSAndroid Build Coastguard Worker #define KFUNC_PROBE(event, args...) \
1484*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(kfunc__vmlinux__ ## event, ##args)
1485*387f9dfdSAndroid Build Coastguard Worker 
1486*387f9dfdSAndroid Build Coastguard Worker #define KRETFUNC_PROBE(event, args...) \
1487*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(kretfunc__vmlinux__ ## event, ##args)
1488*387f9dfdSAndroid Build Coastguard Worker 
1489*387f9dfdSAndroid Build Coastguard Worker #define MODULE_KFUNC_PROBE(module, event, args...) \
1490*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(kfunc__ ## module ## __ ## event, ##args)
1491*387f9dfdSAndroid Build Coastguard Worker 
1492*387f9dfdSAndroid Build Coastguard Worker #define MODULE_KRETFUNC_PROBE(module, event, args...) \
1493*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(kretfunc__ ## module ## __ ## event, ##args)
1494*387f9dfdSAndroid Build Coastguard Worker 
1495*387f9dfdSAndroid Build Coastguard Worker #define KMOD_RET(event, args...) \
1496*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(kmod_ret__ ## event, ##args)
1497*387f9dfdSAndroid Build Coastguard Worker 
1498*387f9dfdSAndroid Build Coastguard Worker #define LSM_PROBE(event, args...) \
1499*387f9dfdSAndroid Build Coastguard Worker         BPF_PROG(lsm__ ## event, ##args)
1500*387f9dfdSAndroid Build Coastguard Worker 
1501*387f9dfdSAndroid Build Coastguard Worker #define BPF_ITER(target) \
1502*387f9dfdSAndroid Build Coastguard Worker         int bpf_iter__ ## target (struct bpf_iter__ ## target *ctx)
1503*387f9dfdSAndroid Build Coastguard Worker 
1504*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ_CONST(dst, field, length)                        \
1505*387f9dfdSAndroid Build Coastguard Worker         do {                                                              \
1506*387f9dfdSAndroid Build Coastguard Worker             unsigned short __offset = args->data_loc_##field & 0xFFFF;    \
1507*387f9dfdSAndroid Build Coastguard Worker             bpf_probe_read((void *)dst, length, (char *)args + __offset); \
1508*387f9dfdSAndroid Build Coastguard Worker         } while (0)
1509*387f9dfdSAndroid Build Coastguard Worker 
1510*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ(dst, field)                                        \
1511*387f9dfdSAndroid Build Coastguard Worker         do {                                                                \
1512*387f9dfdSAndroid Build Coastguard Worker             unsigned short __offset = args->data_loc_##field & 0xFFFF;      \
1513*387f9dfdSAndroid Build Coastguard Worker             unsigned short __length = args->data_loc_##field >> 16;         \
1514*387f9dfdSAndroid Build Coastguard Worker             bpf_probe_read((void *)dst, __length, (char *)args + __offset); \
1515*387f9dfdSAndroid Build Coastguard Worker         } while (0)
1516*387f9dfdSAndroid Build Coastguard Worker 
1517*387f9dfdSAndroid Build Coastguard Worker #define TP_DATA_LOC_READ_STR(dst, field, length)                                \
1518*387f9dfdSAndroid Build Coastguard Worker         do {                                                                    \
1519*387f9dfdSAndroid Build Coastguard Worker             unsigned short __offset = args->data_loc_##field & 0xFFFF;          \
1520*387f9dfdSAndroid Build Coastguard Worker             bpf_probe_read_str((void *)dst, length, (char *)args + __offset);   \
1521*387f9dfdSAndroid Build Coastguard Worker         } while (0)
1522*387f9dfdSAndroid Build Coastguard Worker 
1523*387f9dfdSAndroid Build Coastguard Worker #endif
1524*387f9dfdSAndroid Build Coastguard Worker )********"
1525