xref: /aosp_15_r20/external/strace/tests/bpf.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check bpf syscall decoding.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2015-2017 Dmitry V. Levin <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2015-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker 
33*cf84ac9aSAndroid Build Coastguard Worker #include <stddef.h>
34*cf84ac9aSAndroid Build Coastguard Worker #include <stdio.h>
35*cf84ac9aSAndroid Build Coastguard Worker #include <stdint.h>
36*cf84ac9aSAndroid Build Coastguard Worker #include <string.h>
37*cf84ac9aSAndroid Build Coastguard Worker #include <unistd.h>
38*cf84ac9aSAndroid Build Coastguard Worker 
39*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
40*cf84ac9aSAndroid Build Coastguard Worker #include "scno.h"
41*cf84ac9aSAndroid Build Coastguard Worker 
42*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_LINUX_BPF_H
43*cf84ac9aSAndroid Build Coastguard Worker # include <linux/bpf.h>
44*cf84ac9aSAndroid Build Coastguard Worker #endif
45*cf84ac9aSAndroid Build Coastguard Worker 
46*cf84ac9aSAndroid Build Coastguard Worker #include "bpf_attr.h"
47*cf84ac9aSAndroid Build Coastguard Worker #include "print_fields.h"
48*cf84ac9aSAndroid Build Coastguard Worker 
49*cf84ac9aSAndroid Build Coastguard Worker #include "xlat.h"
50*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/bpf_commands.h"
51*cf84ac9aSAndroid Build Coastguard Worker 
52*cf84ac9aSAndroid Build Coastguard Worker #if defined MPERS_IS_m32 || SIZEOF_KERNEL_LONG_T > 4
53*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR(addr64_, addr32_) addr64_
54*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR_MAYBE(addr_)
55*cf84ac9aSAndroid Build Coastguard Worker #elif defined __arm__ || defined __i386__ || defined __mips__ \
56*cf84ac9aSAndroid Build Coastguard Worker    || defined __powerpc__ || defined __riscv__ || defined __s390__ \
57*cf84ac9aSAndroid Build Coastguard Worker    || defined __sparc__ || defined __tile__
58*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR(addr64_, addr32_) addr64_ " or " addr32_
59*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR_MAYBE(addr_) addr_ " or "
60*cf84ac9aSAndroid Build Coastguard Worker #else
61*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR(addr64_, addr32_) addr32_
62*cf84ac9aSAndroid Build Coastguard Worker # define BIG_ADDR_MAYBE(addr_)
63*cf84ac9aSAndroid Build Coastguard Worker #endif
64*cf84ac9aSAndroid Build Coastguard Worker 
65*cf84ac9aSAndroid Build Coastguard Worker #ifndef HAVE_STRUCT_BPF_INSN
66*cf84ac9aSAndroid Build Coastguard Worker struct bpf_insn {
67*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t	code;
68*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t	dst_reg:4;
69*cf84ac9aSAndroid Build Coastguard Worker 	uint8_t	src_reg:4;
70*cf84ac9aSAndroid Build Coastguard Worker 	int16_t	off;
71*cf84ac9aSAndroid Build Coastguard Worker 	int32_t	imm;
72*cf84ac9aSAndroid Build Coastguard Worker };
73*cf84ac9aSAndroid Build Coastguard Worker #endif
74*cf84ac9aSAndroid Build Coastguard Worker 
75*cf84ac9aSAndroid Build Coastguard Worker #define BPF_ATTR_DATA_FIELD(cmd_) struct cmd_ ## _struct cmd_ ## _data
76*cf84ac9aSAndroid Build Coastguard Worker 
77*cf84ac9aSAndroid Build Coastguard Worker union bpf_attr_data {
78*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_CREATE);
79*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_LOOKUP_ELEM);
80*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_UPDATE_ELEM);
81*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_DELETE_ELEM);
82*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_GET_NEXT_KEY);
83*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_LOAD);
84*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_OBJ_PIN);
85*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_ATTACH);
86*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_DETACH);
87*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_TEST_RUN);
88*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_GET_NEXT_ID);
89*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_GET_FD_BY_ID);
90*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_MAP_GET_FD_BY_ID);
91*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_OBJ_GET_INFO_BY_FD);
92*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_PROG_QUERY);
93*cf84ac9aSAndroid Build Coastguard Worker 	BPF_ATTR_DATA_FIELD(BPF_RAW_TRACEPOINT_OPEN);
94*cf84ac9aSAndroid Build Coastguard Worker 	char char_data[256];
95*cf84ac9aSAndroid Build Coastguard Worker };
96*cf84ac9aSAndroid Build Coastguard Worker 
97*cf84ac9aSAndroid Build Coastguard Worker struct bpf_attr_check {
98*cf84ac9aSAndroid Build Coastguard Worker 	union bpf_attr_data data;
99*cf84ac9aSAndroid Build Coastguard Worker 	size_t size;
100*cf84ac9aSAndroid Build Coastguard Worker 	const char *str;
101*cf84ac9aSAndroid Build Coastguard Worker 	void (*init_fn)(struct bpf_attr_check *check);
102*cf84ac9aSAndroid Build Coastguard Worker 	void (*print_fn)(const struct bpf_attr_check *check,
103*cf84ac9aSAndroid Build Coastguard Worker 			 unsigned long addr);
104*cf84ac9aSAndroid Build Coastguard Worker };
105*cf84ac9aSAndroid Build Coastguard Worker 
106*cf84ac9aSAndroid Build Coastguard Worker struct bpf_check {
107*cf84ac9aSAndroid Build Coastguard Worker 	kernel_ulong_t cmd;
108*cf84ac9aSAndroid Build Coastguard Worker 	const char *cmd_str;
109*cf84ac9aSAndroid Build Coastguard Worker 	const struct bpf_attr_check *checks;
110*cf84ac9aSAndroid Build Coastguard Worker 	size_t count;
111*cf84ac9aSAndroid Build Coastguard Worker };
112*cf84ac9aSAndroid Build Coastguard Worker 
113*cf84ac9aSAndroid Build Coastguard Worker static const kernel_ulong_t long_bits = (kernel_ulong_t) 0xfacefeed00000000ULL;
114*cf84ac9aSAndroid Build Coastguard Worker static const char *errstr;
115*cf84ac9aSAndroid Build Coastguard Worker static unsigned int sizeof_attr = sizeof(union bpf_attr_data);
116*cf84ac9aSAndroid Build Coastguard Worker static unsigned int page_size;
117*cf84ac9aSAndroid Build Coastguard Worker static unsigned long end_of_page;
118*cf84ac9aSAndroid Build Coastguard Worker 
119*cf84ac9aSAndroid Build Coastguard Worker static long
sys_bpf(kernel_ulong_t cmd,kernel_ulong_t attr,kernel_ulong_t size)120*cf84ac9aSAndroid Build Coastguard Worker sys_bpf(kernel_ulong_t cmd, kernel_ulong_t attr, kernel_ulong_t size)
121*cf84ac9aSAndroid Build Coastguard Worker {
122*cf84ac9aSAndroid Build Coastguard Worker 	long rc = syscall(__NR_bpf, cmd, attr, size);
123*cf84ac9aSAndroid Build Coastguard Worker 
124*cf84ac9aSAndroid Build Coastguard Worker 	errstr = sprintrc(rc);
125*cf84ac9aSAndroid Build Coastguard Worker 
126*cf84ac9aSAndroid Build Coastguard Worker #ifdef INJECT_RETVAL
127*cf84ac9aSAndroid Build Coastguard Worker 	if (rc != INJECT_RETVAL)
128*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("Got a return value of %ld != %d",
129*cf84ac9aSAndroid Build Coastguard Worker 				   rc, INJECT_RETVAL);
130*cf84ac9aSAndroid Build Coastguard Worker 
131*cf84ac9aSAndroid Build Coastguard Worker 	static char inj_errstr[4096];
132*cf84ac9aSAndroid Build Coastguard Worker 
133*cf84ac9aSAndroid Build Coastguard Worker 	snprintf(inj_errstr, sizeof(inj_errstr), "%s (INJECTED)", errstr);
134*cf84ac9aSAndroid Build Coastguard Worker 	errstr = inj_errstr;
135*cf84ac9aSAndroid Build Coastguard Worker #endif
136*cf84ac9aSAndroid Build Coastguard Worker 
137*cf84ac9aSAndroid Build Coastguard Worker 	return rc;
138*cf84ac9aSAndroid Build Coastguard Worker }
139*cf84ac9aSAndroid Build Coastguard Worker 
140*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
141*cf84ac9aSAndroid Build Coastguard Worker # define print_extra_data(addr_, offs_, size_) \
142*cf84ac9aSAndroid Build Coastguard Worker 	do { \
143*cf84ac9aSAndroid Build Coastguard Worker 		printf("/* bytes %u..%u */ ", (offs_), (size_) + (offs_) - 1); \
144*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((addr_) + (offs_), (size_)); \
145*cf84ac9aSAndroid Build Coastguard Worker 	} while (0)
146*cf84ac9aSAndroid Build Coastguard Worker #else
147*cf84ac9aSAndroid Build Coastguard Worker # define print_extra_data(addr_, offs_, size_) printf("...")
148*cf84ac9aSAndroid Build Coastguard Worker #endif
149*cf84ac9aSAndroid Build Coastguard Worker 
150*cf84ac9aSAndroid Build Coastguard Worker static void
print_bpf_attr(const struct bpf_attr_check * check,unsigned long addr)151*cf84ac9aSAndroid Build Coastguard Worker print_bpf_attr(const struct bpf_attr_check *check, unsigned long addr)
152*cf84ac9aSAndroid Build Coastguard Worker {
153*cf84ac9aSAndroid Build Coastguard Worker 	if (check->print_fn)
154*cf84ac9aSAndroid Build Coastguard Worker 		check->print_fn(check, addr);
155*cf84ac9aSAndroid Build Coastguard Worker 	else
156*cf84ac9aSAndroid Build Coastguard Worker 		printf("%s", check->str);
157*cf84ac9aSAndroid Build Coastguard Worker }
158*cf84ac9aSAndroid Build Coastguard Worker 
159*cf84ac9aSAndroid Build Coastguard Worker static void
test_bpf(const struct bpf_check * cmd_check)160*cf84ac9aSAndroid Build Coastguard Worker test_bpf(const struct bpf_check *cmd_check)
161*cf84ac9aSAndroid Build Coastguard Worker {
162*cf84ac9aSAndroid Build Coastguard Worker 	const struct bpf_attr_check *check = 0;
163*cf84ac9aSAndroid Build Coastguard Worker 	const union bpf_attr_data *data = 0;
164*cf84ac9aSAndroid Build Coastguard Worker 	unsigned int offset = 0;
165*cf84ac9aSAndroid Build Coastguard Worker 
166*cf84ac9aSAndroid Build Coastguard Worker 	/* zero addr */
167*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, 0, long_bits | sizeof(union bpf_attr_data));
168*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, NULL, %u) = %s\n",
169*cf84ac9aSAndroid Build Coastguard Worker 	       cmd_check->cmd_str, sizeof_attr, errstr);
170*cf84ac9aSAndroid Build Coastguard Worker 
171*cf84ac9aSAndroid Build Coastguard Worker 	/* zero size */
172*cf84ac9aSAndroid Build Coastguard Worker 	unsigned long addr = end_of_page - sizeof_attr;
173*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, addr, long_bits);
174*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, %#lx, 0) = %s\n",
175*cf84ac9aSAndroid Build Coastguard Worker 	       cmd_check->cmd_str, addr, errstr);
176*cf84ac9aSAndroid Build Coastguard Worker 
177*cf84ac9aSAndroid Build Coastguard Worker 	for (size_t i = 0; i < cmd_check->count; i++) {
178*cf84ac9aSAndroid Build Coastguard Worker 		check = &cmd_check->checks[i];
179*cf84ac9aSAndroid Build Coastguard Worker 		if (check->init_fn)
180*cf84ac9aSAndroid Build Coastguard Worker 			check->init_fn((struct bpf_attr_check *) check);
181*cf84ac9aSAndroid Build Coastguard Worker 		data = &check->data;
182*cf84ac9aSAndroid Build Coastguard Worker 		offset = check->size;
183*cf84ac9aSAndroid Build Coastguard Worker 
184*cf84ac9aSAndroid Build Coastguard Worker 		addr = end_of_page - offset;
185*cf84ac9aSAndroid Build Coastguard Worker 		memcpy((void *) addr, data, offset);
186*cf84ac9aSAndroid Build Coastguard Worker 
187*cf84ac9aSAndroid Build Coastguard Worker 		/* starting piece of bpf_attr_data */
188*cf84ac9aSAndroid Build Coastguard Worker 		sys_bpf(cmd_check->cmd, addr, offset);
189*cf84ac9aSAndroid Build Coastguard Worker 		printf("bpf(%s, {", cmd_check->cmd_str);
190*cf84ac9aSAndroid Build Coastguard Worker 		print_bpf_attr(check, addr);
191*cf84ac9aSAndroid Build Coastguard Worker 		printf("}, %u) = %s\n", offset, errstr);
192*cf84ac9aSAndroid Build Coastguard Worker 
193*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of the starting piece */
194*cf84ac9aSAndroid Build Coastguard Worker 		sys_bpf(cmd_check->cmd, addr + 1, offset);
195*cf84ac9aSAndroid Build Coastguard Worker 		printf("bpf(%s, %#lx, %u) = %s\n",
196*cf84ac9aSAndroid Build Coastguard Worker 		       cmd_check->cmd_str, addr + 1, offset, errstr);
197*cf84ac9aSAndroid Build Coastguard Worker 	}
198*cf84ac9aSAndroid Build Coastguard Worker 
199*cf84ac9aSAndroid Build Coastguard Worker 	if (offset < sizeof_attr) {
200*cf84ac9aSAndroid Build Coastguard Worker 		/* short read of the whole bpf_attr_data */
201*cf84ac9aSAndroid Build Coastguard Worker 		memcpy((void *) end_of_page - sizeof_attr + 1, data, offset);
202*cf84ac9aSAndroid Build Coastguard Worker 		addr = end_of_page - sizeof_attr + 1;
203*cf84ac9aSAndroid Build Coastguard Worker 		memset((void *) addr + offset, 0, sizeof_attr - offset - 1);
204*cf84ac9aSAndroid Build Coastguard Worker 		sys_bpf(cmd_check->cmd, addr, sizeof_attr);
205*cf84ac9aSAndroid Build Coastguard Worker 		printf("bpf(%s, %#lx, %u) = %s\n",
206*cf84ac9aSAndroid Build Coastguard Worker 		       cmd_check->cmd_str, addr, sizeof_attr, errstr);
207*cf84ac9aSAndroid Build Coastguard Worker 
208*cf84ac9aSAndroid Build Coastguard Worker 		/* the whole bpf_attr_data */
209*cf84ac9aSAndroid Build Coastguard Worker 		memcpy((void *) end_of_page - sizeof_attr, data, offset);
210*cf84ac9aSAndroid Build Coastguard Worker 		addr = end_of_page - sizeof_attr;
211*cf84ac9aSAndroid Build Coastguard Worker 		memset((void *) addr + offset, 0, sizeof_attr - offset);
212*cf84ac9aSAndroid Build Coastguard Worker 		sys_bpf(cmd_check->cmd, addr, sizeof_attr);
213*cf84ac9aSAndroid Build Coastguard Worker 		printf("bpf(%s, {", cmd_check->cmd_str);
214*cf84ac9aSAndroid Build Coastguard Worker 		print_bpf_attr(check, addr);
215*cf84ac9aSAndroid Build Coastguard Worker 		printf("}, %u) = %s\n", sizeof_attr, errstr);
216*cf84ac9aSAndroid Build Coastguard Worker 
217*cf84ac9aSAndroid Build Coastguard Worker 		/* non-zero bytes after the relevant part */
218*cf84ac9aSAndroid Build Coastguard Worker 		fill_memory_ex((void *) addr + offset,
219*cf84ac9aSAndroid Build Coastguard Worker 			       sizeof_attr - offset, '0', 10);
220*cf84ac9aSAndroid Build Coastguard Worker 		sys_bpf(cmd_check->cmd, addr, sizeof_attr);
221*cf84ac9aSAndroid Build Coastguard Worker 		printf("bpf(%s, {", cmd_check->cmd_str);
222*cf84ac9aSAndroid Build Coastguard Worker 		print_bpf_attr(check, addr);
223*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
224*cf84ac9aSAndroid Build Coastguard Worker 		print_extra_data((char *) addr, offset,
225*cf84ac9aSAndroid Build Coastguard Worker 				 sizeof_attr - offset);
226*cf84ac9aSAndroid Build Coastguard Worker 		printf("}, %u) = %s\n", sizeof_attr, errstr);
227*cf84ac9aSAndroid Build Coastguard Worker 	}
228*cf84ac9aSAndroid Build Coastguard Worker 
229*cf84ac9aSAndroid Build Coastguard Worker 	/* short read of the whole page */
230*cf84ac9aSAndroid Build Coastguard Worker 	memcpy((void *) end_of_page - page_size + 1, data, offset);
231*cf84ac9aSAndroid Build Coastguard Worker 	addr = end_of_page - page_size + 1;
232*cf84ac9aSAndroid Build Coastguard Worker 	memset((void *) addr + offset, 0, page_size - offset - 1);
233*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, addr, page_size);
234*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, %#lx, %u) = %s\n",
235*cf84ac9aSAndroid Build Coastguard Worker 	       cmd_check->cmd_str, addr, page_size, errstr);
236*cf84ac9aSAndroid Build Coastguard Worker 
237*cf84ac9aSAndroid Build Coastguard Worker 	/* the whole page */
238*cf84ac9aSAndroid Build Coastguard Worker 	memcpy((void *) end_of_page - page_size, data, offset);
239*cf84ac9aSAndroid Build Coastguard Worker 	addr = end_of_page - page_size;
240*cf84ac9aSAndroid Build Coastguard Worker 	memset((void *) addr + offset, 0, page_size - offset);
241*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, addr, page_size);
242*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, {", cmd_check->cmd_str);
243*cf84ac9aSAndroid Build Coastguard Worker 	print_bpf_attr(check, addr);
244*cf84ac9aSAndroid Build Coastguard Worker 	printf("}, %u) = %s\n", page_size, errstr);
245*cf84ac9aSAndroid Build Coastguard Worker 
246*cf84ac9aSAndroid Build Coastguard Worker 	/* non-zero bytes after the whole bpf_attr_data */
247*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory_ex((void *) addr + offset,
248*cf84ac9aSAndroid Build Coastguard Worker 		       page_size - offset, '0', 10);
249*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, addr, page_size);
250*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, {", cmd_check->cmd_str);
251*cf84ac9aSAndroid Build Coastguard Worker 	print_bpf_attr(check, addr);
252*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ");
253*cf84ac9aSAndroid Build Coastguard Worker 	print_extra_data((char *) addr, offset,
254*cf84ac9aSAndroid Build Coastguard Worker 			 page_size - offset);
255*cf84ac9aSAndroid Build Coastguard Worker 	printf("}, %u) = %s\n", page_size, errstr);
256*cf84ac9aSAndroid Build Coastguard Worker 
257*cf84ac9aSAndroid Build Coastguard Worker 	/* more than a page */
258*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(cmd_check->cmd, addr, page_size + 1);
259*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(%s, %#lx, %u) = %s\n",
260*cf84ac9aSAndroid Build Coastguard Worker 	       cmd_check->cmd_str, addr, page_size + 1, errstr);
261*cf84ac9aSAndroid Build Coastguard Worker }
262*cf84ac9aSAndroid Build Coastguard Worker 
263*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_MAP_CREATE_attr7(struct bpf_attr_check * check)264*cf84ac9aSAndroid Build Coastguard Worker init_BPF_MAP_CREATE_attr7(struct bpf_attr_check *check)
265*cf84ac9aSAndroid Build Coastguard Worker {
266*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_MAP_CREATE_struct *attr = &check->data.BPF_MAP_CREATE_data;
267*cf84ac9aSAndroid Build Coastguard Worker 	attr->map_ifindex = ifindex_lo();
268*cf84ac9aSAndroid Build Coastguard Worker }
269*cf84ac9aSAndroid Build Coastguard Worker 
270*cf84ac9aSAndroid Build Coastguard Worker static struct bpf_attr_check BPF_MAP_CREATE_checks[] = {
271*cf84ac9aSAndroid Build Coastguard Worker 	{
272*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = { .map_type = 2 } },
273*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, map_type),
274*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=BPF_MAP_TYPE_ARRAY, key_size=0, value_size=0"
275*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=0"
276*cf84ac9aSAndroid Build Coastguard Worker 	},
277*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 1 */
278*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
279*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 20,
280*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 4,
281*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 8,
282*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 256,
283*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 63,
284*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = -1,
285*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = 3141592653,
286*cf84ac9aSAndroid Build Coastguard Worker 			.map_name = "0123456789abcde",
287*cf84ac9aSAndroid Build Coastguard Worker 		} },
288*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetof(struct BPF_MAP_CREATE_struct, map_name) + 8,
289*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, key_size=4"
290*cf84ac9aSAndroid Build Coastguard Worker 		       ", value_size=8, max_entries=256"
291*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NO_COMMON_LRU"
292*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_NUMA_NODE|BPF_F_RDONLY|BPF_F_WRONLY"
293*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_STACK_BUILD_ID"
294*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1"
295*cf84ac9aSAndroid Build Coastguard Worker 		       ", numa_node=3141592653"
296*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_name=\"0123456\"...",
297*cf84ac9aSAndroid Build Coastguard Worker 
298*cf84ac9aSAndroid Build Coastguard Worker 	},
299*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 2 */
300*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
301*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 21,
302*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
303*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
304*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
305*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xffffffc0,
306*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
307*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
308*cf84ac9aSAndroid Build Coastguard Worker 			.map_name = "",
309*cf84ac9aSAndroid Build Coastguard Worker 			.map_ifindex = 3141592653,
310*cf84ac9aSAndroid Build Coastguard Worker 		} },
311*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, map_ifindex),
312*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0x15 /* BPF_MAP_TYPE_??? */"
313*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
314*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
315*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=0xffffffc0 /* BPF_F_??? */"
316*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1576685468"
317*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_name=\"\", map_ifindex=3141592653",
318*cf84ac9aSAndroid Build Coastguard Worker 
319*cf84ac9aSAndroid Build Coastguard Worker 	},
320*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 3 */
321*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
322*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 0xdeadf00d,
323*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
324*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
325*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
326*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xc0dedead,
327*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
328*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
329*cf84ac9aSAndroid Build Coastguard Worker 		} },
330*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, map_flags),
331*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0xdeadf00d /* BPF_MAP_TYPE_??? */"
332*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
333*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
334*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NUMA_NODE"
335*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_RDONLY|BPF_F_STACK_BUILD_ID"
336*cf84ac9aSAndroid Build Coastguard Worker 				   "|0xc0dede80",
337*cf84ac9aSAndroid Build Coastguard Worker 	},
338*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 4 */
339*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
340*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 0xdeadf00d,
341*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
342*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
343*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
344*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xc0dedead,
345*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
346*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
347*cf84ac9aSAndroid Build Coastguard Worker 		} },
348*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, inner_map_fd),
349*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0xdeadf00d /* BPF_MAP_TYPE_??? */"
350*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
351*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
352*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NUMA_NODE"
353*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_RDONLY|BPF_F_STACK_BUILD_ID"
354*cf84ac9aSAndroid Build Coastguard Worker 				   "|0xc0dede80"
355*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1576685468",
356*cf84ac9aSAndroid Build Coastguard Worker 	},
357*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 5 */
358*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
359*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 0xdeadf00d,
360*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
361*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
362*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
363*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xc0dedead,
364*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
365*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
366*cf84ac9aSAndroid Build Coastguard Worker 		} },
367*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, numa_node),
368*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0xdeadf00d /* BPF_MAP_TYPE_??? */"
369*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
370*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
371*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NUMA_NODE"
372*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_RDONLY|BPF_F_STACK_BUILD_ID"
373*cf84ac9aSAndroid Build Coastguard Worker 				   "|0xc0dede80"
374*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1576685468"
375*cf84ac9aSAndroid Build Coastguard Worker 		       ", numa_node=4294967295 /* NUMA_NO_NODE */",
376*cf84ac9aSAndroid Build Coastguard Worker 	},
377*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 6 */
378*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
379*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 0xdeadf00d,
380*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
381*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
382*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
383*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xc0dedead,
384*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
385*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
386*cf84ac9aSAndroid Build Coastguard Worker 			.map_name = "fedcba9876543210",
387*cf84ac9aSAndroid Build Coastguard Worker 		} },
388*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, map_name),
389*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0xdeadf00d /* BPF_MAP_TYPE_??? */"
390*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
391*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
392*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NUMA_NODE"
393*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_RDONLY|BPF_F_STACK_BUILD_ID"
394*cf84ac9aSAndroid Build Coastguard Worker 				   "|0xc0dede80"
395*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1576685468"
396*cf84ac9aSAndroid Build Coastguard Worker 		       ", numa_node=4294967295 /* NUMA_NO_NODE */"
397*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_name=\"fedcba987654321\"...",
398*cf84ac9aSAndroid Build Coastguard Worker 	},
399*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 7 */
400*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_CREATE_data = {
401*cf84ac9aSAndroid Build Coastguard Worker 			.map_type = 0xdeadf00d,
402*cf84ac9aSAndroid Build Coastguard Worker 			.key_size = 0xface1e55,
403*cf84ac9aSAndroid Build Coastguard Worker 			.value_size = 0xbadc0ded,
404*cf84ac9aSAndroid Build Coastguard Worker 			.max_entries = 0xbeefcafe,
405*cf84ac9aSAndroid Build Coastguard Worker 			.map_flags = 0xc0dedead,
406*cf84ac9aSAndroid Build Coastguard Worker 			.inner_map_fd = 2718281828,
407*cf84ac9aSAndroid Build Coastguard Worker 			.numa_node = -1,
408*cf84ac9aSAndroid Build Coastguard Worker 			.map_name = "0123456789abcde",
409*cf84ac9aSAndroid Build Coastguard Worker 		} },
410*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_CREATE_struct, map_ifindex),
411*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_type=0xdeadf00d /* BPF_MAP_TYPE_??? */"
412*cf84ac9aSAndroid Build Coastguard Worker 		       ", key_size=4207812181, value_size=3134983661"
413*cf84ac9aSAndroid Build Coastguard Worker 		       ", max_entries=3203386110"
414*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_flags=BPF_F_NO_PREALLOC|BPF_F_NUMA_NODE"
415*cf84ac9aSAndroid Build Coastguard Worker 				   "|BPF_F_RDONLY|BPF_F_STACK_BUILD_ID"
416*cf84ac9aSAndroid Build Coastguard Worker 				   "|0xc0dede80"
417*cf84ac9aSAndroid Build Coastguard Worker 		       ", inner_map_fd=-1576685468"
418*cf84ac9aSAndroid Build Coastguard Worker 		       ", numa_node=4294967295 /* NUMA_NO_NODE */"
419*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_name=\"0123456789abcde\""
420*cf84ac9aSAndroid Build Coastguard Worker 		       ", map_ifindex=" IFINDEX_LO_STR,
421*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_MAP_CREATE_attr7,
422*cf84ac9aSAndroid Build Coastguard Worker 	},
423*cf84ac9aSAndroid Build Coastguard Worker };
424*cf84ac9aSAndroid Build Coastguard Worker 
425*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_MAP_LOOKUP_ELEM_checks[] = {
426*cf84ac9aSAndroid Build Coastguard Worker 	{
427*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_LOOKUP_ELEM_data = { .map_fd = -1 } },
428*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_LOOKUP_ELEM_struct, map_fd),
429*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=NULL, value=NULL"
430*cf84ac9aSAndroid Build Coastguard Worker 	},
431*cf84ac9aSAndroid Build Coastguard Worker 	{
432*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_LOOKUP_ELEM_data = {
433*cf84ac9aSAndroid Build Coastguard Worker 			.map_fd = -1,
434*cf84ac9aSAndroid Build Coastguard Worker 			.key = 0xdeadbeef,
435*cf84ac9aSAndroid Build Coastguard Worker 			.value = 0xbadc0ded
436*cf84ac9aSAndroid Build Coastguard Worker 		} },
437*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_LOOKUP_ELEM_struct, value),
438*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=0xdeadbeef, value=0xbadc0ded"
439*cf84ac9aSAndroid Build Coastguard Worker 	}
440*cf84ac9aSAndroid Build Coastguard Worker };
441*cf84ac9aSAndroid Build Coastguard Worker 
442*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_MAP_UPDATE_ELEM_checks[] = {
443*cf84ac9aSAndroid Build Coastguard Worker 	{
444*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_UPDATE_ELEM_data = { .map_fd = -1 } },
445*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_UPDATE_ELEM_struct, map_fd),
446*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=NULL, value=NULL, flags=BPF_ANY"
447*cf84ac9aSAndroid Build Coastguard Worker 	},
448*cf84ac9aSAndroid Build Coastguard Worker 	{
449*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_UPDATE_ELEM_data = {
450*cf84ac9aSAndroid Build Coastguard Worker 			.map_fd = -1,
451*cf84ac9aSAndroid Build Coastguard Worker 			.key = 0xdeadbeef,
452*cf84ac9aSAndroid Build Coastguard Worker 			.value = 0xbadc0ded,
453*cf84ac9aSAndroid Build Coastguard Worker 			.flags = 2
454*cf84ac9aSAndroid Build Coastguard Worker 		} },
455*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_UPDATE_ELEM_struct, flags),
456*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=0xdeadbeef, value=0xbadc0ded"
457*cf84ac9aSAndroid Build Coastguard Worker 		       ", flags=BPF_EXIST"
458*cf84ac9aSAndroid Build Coastguard Worker 	}
459*cf84ac9aSAndroid Build Coastguard Worker };
460*cf84ac9aSAndroid Build Coastguard Worker 
461*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_MAP_DELETE_ELEM_checks[] = {
462*cf84ac9aSAndroid Build Coastguard Worker 	{
463*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_DELETE_ELEM_data = { .map_fd = -1 } },
464*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_DELETE_ELEM_struct, map_fd),
465*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=NULL"
466*cf84ac9aSAndroid Build Coastguard Worker 	},
467*cf84ac9aSAndroid Build Coastguard Worker 	{
468*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_DELETE_ELEM_data = {
469*cf84ac9aSAndroid Build Coastguard Worker 			.map_fd = -1,
470*cf84ac9aSAndroid Build Coastguard Worker 			.key = 0xdeadbeef
471*cf84ac9aSAndroid Build Coastguard Worker 		} },
472*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_DELETE_ELEM_struct, key),
473*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=0xdeadbeef"
474*cf84ac9aSAndroid Build Coastguard Worker 	}
475*cf84ac9aSAndroid Build Coastguard Worker };
476*cf84ac9aSAndroid Build Coastguard Worker 
477*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_MAP_GET_NEXT_KEY_checks[] = {
478*cf84ac9aSAndroid Build Coastguard Worker 	{
479*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_GET_NEXT_KEY_data = { .map_fd = -1 } },
480*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_GET_NEXT_KEY_struct, map_fd),
481*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=NULL, next_key=NULL"
482*cf84ac9aSAndroid Build Coastguard Worker 	},
483*cf84ac9aSAndroid Build Coastguard Worker 	{
484*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_GET_NEXT_KEY_data = {
485*cf84ac9aSAndroid Build Coastguard Worker 			.map_fd = -1,
486*cf84ac9aSAndroid Build Coastguard Worker 			.key = 0xdeadbeef,
487*cf84ac9aSAndroid Build Coastguard Worker 			.next_key = 0xbadc0ded
488*cf84ac9aSAndroid Build Coastguard Worker 		} },
489*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_GET_NEXT_KEY_struct, next_key),
490*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_fd=-1, key=0xdeadbeef, next_key=0xbadc0ded"
491*cf84ac9aSAndroid Build Coastguard Worker 	}
492*cf84ac9aSAndroid Build Coastguard Worker };
493*cf84ac9aSAndroid Build Coastguard Worker 
494*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_insn insns[] = {
495*cf84ac9aSAndroid Build Coastguard Worker 	{
496*cf84ac9aSAndroid Build Coastguard Worker 		.code = 0x95,
497*cf84ac9aSAndroid Build Coastguard Worker 		.dst_reg = 10,
498*cf84ac9aSAndroid Build Coastguard Worker 		.src_reg = 11,
499*cf84ac9aSAndroid Build Coastguard Worker 		.off = 0xdead,
500*cf84ac9aSAndroid Build Coastguard Worker 		.imm = 0xbadc0ded,
501*cf84ac9aSAndroid Build Coastguard Worker 	},
502*cf84ac9aSAndroid Build Coastguard Worker };
503*cf84ac9aSAndroid Build Coastguard Worker static const char license[] = "GPL";
504*cf84ac9aSAndroid Build Coastguard Worker static const char pathname[] = "/sys/fs/bpf/foo/bar";
505*cf84ac9aSAndroid Build Coastguard Worker 
506*cf84ac9aSAndroid Build Coastguard Worker static char *log_buf;
507*cf84ac9aSAndroid Build Coastguard Worker /*
508*cf84ac9aSAndroid Build Coastguard Worker  * This has to be a macro, otherwise the compiler complains that
509*cf84ac9aSAndroid Build Coastguard Worker  * initializer element is not constant.
510*cf84ac9aSAndroid Build Coastguard Worker  */
511*cf84ac9aSAndroid Build Coastguard Worker #define log_buf_size 4096U
512*cf84ac9aSAndroid Build Coastguard Worker 
513*cf84ac9aSAndroid Build Coastguard Worker static inline char *
get_log_buf(void)514*cf84ac9aSAndroid Build Coastguard Worker get_log_buf(void)
515*cf84ac9aSAndroid Build Coastguard Worker {
516*cf84ac9aSAndroid Build Coastguard Worker 	if (!log_buf)
517*cf84ac9aSAndroid Build Coastguard Worker 		log_buf = tail_alloc(log_buf_size);
518*cf84ac9aSAndroid Build Coastguard Worker 	return log_buf;
519*cf84ac9aSAndroid Build Coastguard Worker }
520*cf84ac9aSAndroid Build Coastguard Worker 
521*cf84ac9aSAndroid Build Coastguard Worker static inline char *
get_log_buf_tail(void)522*cf84ac9aSAndroid Build Coastguard Worker get_log_buf_tail(void)
523*cf84ac9aSAndroid Build Coastguard Worker {
524*cf84ac9aSAndroid Build Coastguard Worker 	return get_log_buf() + log_buf_size;
525*cf84ac9aSAndroid Build Coastguard Worker }
526*cf84ac9aSAndroid Build Coastguard Worker 
527*cf84ac9aSAndroid Build Coastguard Worker #if VERBOSE
528*cf84ac9aSAndroid Build Coastguard Worker # define INSNS_FMT \
529*cf84ac9aSAndroid Build Coastguard Worker 	"[{code=BPF_JMP|BPF_K|BPF_EXIT, dst_reg=BPF_REG_10" \
530*cf84ac9aSAndroid Build Coastguard Worker 	", src_reg=0xb /* BPF_REG_??? */, off=%d, imm=%#x}]"
531*cf84ac9aSAndroid Build Coastguard Worker # define INSNS_ARG insns[0].off, insns[0].imm
532*cf84ac9aSAndroid Build Coastguard Worker #else
533*cf84ac9aSAndroid Build Coastguard Worker # define INSNS_FMT "%p"
534*cf84ac9aSAndroid Build Coastguard Worker # define INSNS_ARG insns
535*cf84ac9aSAndroid Build Coastguard Worker #endif
536*cf84ac9aSAndroid Build Coastguard Worker 
537*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_PROG_LOAD_attr3(struct bpf_attr_check * check)538*cf84ac9aSAndroid Build Coastguard Worker init_BPF_PROG_LOAD_attr3(struct bpf_attr_check *check)
539*cf84ac9aSAndroid Build Coastguard Worker {
540*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_PROG_LOAD_struct *attr = &check->data.BPF_PROG_LOAD_data;
541*cf84ac9aSAndroid Build Coastguard Worker 
542*cf84ac9aSAndroid Build Coastguard Worker 	attr->insns = (uintptr_t) insns;
543*cf84ac9aSAndroid Build Coastguard Worker 	attr->license = (uintptr_t) license;
544*cf84ac9aSAndroid Build Coastguard Worker 	attr->log_buf = (uintptr_t) get_log_buf_tail();
545*cf84ac9aSAndroid Build Coastguard Worker }
546*cf84ac9aSAndroid Build Coastguard Worker 
547*cf84ac9aSAndroid Build Coastguard Worker static void
print_BPF_PROG_LOAD_attr3(const struct bpf_attr_check * check,unsigned long addr)548*cf84ac9aSAndroid Build Coastguard Worker print_BPF_PROG_LOAD_attr3(const struct bpf_attr_check *check, unsigned long addr)
549*cf84ac9aSAndroid Build Coastguard Worker {
550*cf84ac9aSAndroid Build Coastguard Worker 	printf("prog_type=BPF_PROG_TYPE_SOCKET_FILTER, insn_cnt=%u"
551*cf84ac9aSAndroid Build Coastguard Worker 	       ", insns=" INSNS_FMT ", license=\"%s\", log_level=2718281828"
552*cf84ac9aSAndroid Build Coastguard Worker 	       ", log_size=%u, log_buf=%p"
553*cf84ac9aSAndroid Build Coastguard Worker 	       ", kern_version=KERNEL_VERSION(51966, 240, 13)"
554*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_flags=0x2 /* BPF_F_??? */"
555*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_name=\"0123456789abcde\"..., prog_ifindex=3203399405",
556*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) ARRAY_SIZE(insns), INSNS_ARG, license,
557*cf84ac9aSAndroid Build Coastguard Worker 	       log_buf_size, get_log_buf_tail());
558*cf84ac9aSAndroid Build Coastguard Worker }
559*cf84ac9aSAndroid Build Coastguard Worker 
560*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_PROG_LOAD_attr4(struct bpf_attr_check * check)561*cf84ac9aSAndroid Build Coastguard Worker init_BPF_PROG_LOAD_attr4(struct bpf_attr_check *check)
562*cf84ac9aSAndroid Build Coastguard Worker {
563*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_PROG_LOAD_struct *attr = &check->data.BPF_PROG_LOAD_data;
564*cf84ac9aSAndroid Build Coastguard Worker 
565*cf84ac9aSAndroid Build Coastguard Worker 	attr->insns = (uintptr_t) insns;
566*cf84ac9aSAndroid Build Coastguard Worker 	attr->license = (uintptr_t) license;
567*cf84ac9aSAndroid Build Coastguard Worker 	attr->log_buf = (uintptr_t) get_log_buf();
568*cf84ac9aSAndroid Build Coastguard Worker 	attr->prog_ifindex = ifindex_lo();
569*cf84ac9aSAndroid Build Coastguard Worker 
570*cf84ac9aSAndroid Build Coastguard Worker 	strncpy(log_buf, "log test", 9);
571*cf84ac9aSAndroid Build Coastguard Worker }
572*cf84ac9aSAndroid Build Coastguard Worker 
573*cf84ac9aSAndroid Build Coastguard Worker static void
print_BPF_PROG_LOAD_attr4(const struct bpf_attr_check * check,unsigned long addr)574*cf84ac9aSAndroid Build Coastguard Worker print_BPF_PROG_LOAD_attr4(const struct bpf_attr_check *check, unsigned long addr)
575*cf84ac9aSAndroid Build Coastguard Worker {
576*cf84ac9aSAndroid Build Coastguard Worker 	printf("prog_type=BPF_PROG_TYPE_UNSPEC, insn_cnt=%u, insns=" INSNS_FMT
577*cf84ac9aSAndroid Build Coastguard Worker 	       ", license=\"%s\", log_level=2718281828, log_size=4"
578*cf84ac9aSAndroid Build Coastguard Worker 	       ", log_buf=\"log \"..."
579*cf84ac9aSAndroid Build Coastguard Worker 	       ", kern_version=KERNEL_VERSION(51966, 240, 13)"
580*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_flags=BPF_F_STRICT_ALIGNMENT|0x2"
581*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_name=\"0123456789abcde\"..., prog_ifindex=%s"
582*cf84ac9aSAndroid Build Coastguard Worker 	       ", expected_attach_type=BPF_CGROUP_INET6_BIND",
583*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned int) ARRAY_SIZE(insns), INSNS_ARG,
584*cf84ac9aSAndroid Build Coastguard Worker 	       license, IFINDEX_LO_STR);
585*cf84ac9aSAndroid Build Coastguard Worker }
586*cf84ac9aSAndroid Build Coastguard Worker 
587*cf84ac9aSAndroid Build Coastguard Worker static struct bpf_attr_check BPF_PROG_LOAD_checks[] = {
588*cf84ac9aSAndroid Build Coastguard Worker 	{
589*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_LOAD_data = { .prog_type = 1 } },
590*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_type),
591*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_type=BPF_PROG_TYPE_SOCKET_FILTER"
592*cf84ac9aSAndroid Build Coastguard Worker 		       ", insn_cnt=0, insns=NULL, license=NULL"
593*cf84ac9aSAndroid Build Coastguard Worker 	},
594*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 1 */
595*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_LOAD_data = {
596*cf84ac9aSAndroid Build Coastguard Worker 			.prog_type = 21,
597*cf84ac9aSAndroid Build Coastguard Worker 			.insn_cnt = 0xbadc0ded,
598*cf84ac9aSAndroid Build Coastguard Worker 			.insns = 0,
599*cf84ac9aSAndroid Build Coastguard Worker 			.license = 0,
600*cf84ac9aSAndroid Build Coastguard Worker 			.log_level = 42,
601*cf84ac9aSAndroid Build Coastguard Worker 			.log_size = 3141592653U,
602*cf84ac9aSAndroid Build Coastguard Worker 			.log_buf = 0,
603*cf84ac9aSAndroid Build Coastguard Worker 			.kern_version = 0xcafef00d,
604*cf84ac9aSAndroid Build Coastguard Worker 			.prog_flags = 0,
605*cf84ac9aSAndroid Build Coastguard Worker 		} },
606*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_flags),
607*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_type=0x15 /* BPF_PROG_TYPE_??? */"
608*cf84ac9aSAndroid Build Coastguard Worker 		       ", insn_cnt=3134983661, insns=NULL, license=NULL"
609*cf84ac9aSAndroid Build Coastguard Worker 		       ", log_level=42, log_size=3141592653, log_buf=NULL"
610*cf84ac9aSAndroid Build Coastguard Worker 		       ", kern_version=KERNEL_VERSION(51966, 240, 13)"
611*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_flags=0",
612*cf84ac9aSAndroid Build Coastguard Worker 	},
613*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 2 */
614*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_LOAD_data = {
615*cf84ac9aSAndroid Build Coastguard Worker 			.prog_type = 20,
616*cf84ac9aSAndroid Build Coastguard Worker 			.insn_cnt = 0xbadc0ded,
617*cf84ac9aSAndroid Build Coastguard Worker 			.insns = 0xffffffff00000000,
618*cf84ac9aSAndroid Build Coastguard Worker 			.license = 0xffffffff00000000,
619*cf84ac9aSAndroid Build Coastguard Worker 			.log_level = 2718281828U,
620*cf84ac9aSAndroid Build Coastguard Worker 			.log_size = log_buf_size,
621*cf84ac9aSAndroid Build Coastguard Worker 			.log_buf = 0xffffffff00000000,
622*cf84ac9aSAndroid Build Coastguard Worker 			.kern_version = 0xcafef00d,
623*cf84ac9aSAndroid Build Coastguard Worker 			.prog_flags = 1,
624*cf84ac9aSAndroid Build Coastguard Worker 			.prog_name = "fedcba987654321",
625*cf84ac9aSAndroid Build Coastguard Worker 		} },
626*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_name),
627*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_type=BPF_PROG_TYPE_SK_REUSEPORT"
628*cf84ac9aSAndroid Build Coastguard Worker 		       ", insn_cnt=3134983661"
629*cf84ac9aSAndroid Build Coastguard Worker 		       ", insns=" BIG_ADDR("0xffffffff00000000", "NULL")
630*cf84ac9aSAndroid Build Coastguard Worker 		       ", license=" BIG_ADDR("0xffffffff00000000", "NULL")
631*cf84ac9aSAndroid Build Coastguard Worker 		       ", log_level=2718281828, log_size=4096"
632*cf84ac9aSAndroid Build Coastguard Worker 		       ", log_buf=" BIG_ADDR("0xffffffff00000000", "NULL")
633*cf84ac9aSAndroid Build Coastguard Worker 		       ", kern_version=KERNEL_VERSION(51966, 240, 13)"
634*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_flags=BPF_F_STRICT_ALIGNMENT"
635*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_name=\"fedcba987654321\"",
636*cf84ac9aSAndroid Build Coastguard Worker 	},
637*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 3 */
638*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_LOAD_data = {
639*cf84ac9aSAndroid Build Coastguard Worker 			.prog_type = 1,
640*cf84ac9aSAndroid Build Coastguard Worker 			.insn_cnt = ARRAY_SIZE(insns),
641*cf84ac9aSAndroid Build Coastguard Worker 			.log_level = 2718281828U,
642*cf84ac9aSAndroid Build Coastguard Worker 			.log_size = log_buf_size,
643*cf84ac9aSAndroid Build Coastguard Worker 			.kern_version = 0xcafef00d,
644*cf84ac9aSAndroid Build Coastguard Worker 			.prog_flags = 2,
645*cf84ac9aSAndroid Build Coastguard Worker 			.prog_name = "0123456789abcdef",
646*cf84ac9aSAndroid Build Coastguard Worker 			.prog_ifindex = 0xbeeffeed,
647*cf84ac9aSAndroid Build Coastguard Worker 		} },
648*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_LOAD_struct, prog_ifindex),
649*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_PROG_LOAD_attr3,
650*cf84ac9aSAndroid Build Coastguard Worker 		.print_fn = print_BPF_PROG_LOAD_attr3
651*cf84ac9aSAndroid Build Coastguard Worker 	},
652*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 4 */
653*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_LOAD_data = {
654*cf84ac9aSAndroid Build Coastguard Worker 			.prog_type = 0,
655*cf84ac9aSAndroid Build Coastguard Worker 			.insn_cnt = ARRAY_SIZE(insns),
656*cf84ac9aSAndroid Build Coastguard Worker 			.log_level = 2718281828U,
657*cf84ac9aSAndroid Build Coastguard Worker 			.log_size = 4,
658*cf84ac9aSAndroid Build Coastguard Worker 			.kern_version = 0xcafef00d,
659*cf84ac9aSAndroid Build Coastguard Worker 			.prog_flags = 3,
660*cf84ac9aSAndroid Build Coastguard Worker 			.prog_name = "0123456789abcdef",
661*cf84ac9aSAndroid Build Coastguard Worker 			.expected_attach_type = 9,
662*cf84ac9aSAndroid Build Coastguard Worker 		} },
663*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_LOAD_struct,
664*cf84ac9aSAndroid Build Coastguard Worker 				    expected_attach_type),
665*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_PROG_LOAD_attr4,
666*cf84ac9aSAndroid Build Coastguard Worker 		.print_fn = print_BPF_PROG_LOAD_attr4
667*cf84ac9aSAndroid Build Coastguard Worker 	},
668*cf84ac9aSAndroid Build Coastguard Worker };
669*cf84ac9aSAndroid Build Coastguard Worker 
670*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_OBJ_PIN_attr(struct bpf_attr_check * check)671*cf84ac9aSAndroid Build Coastguard Worker init_BPF_OBJ_PIN_attr(struct bpf_attr_check *check)
672*cf84ac9aSAndroid Build Coastguard Worker {
673*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_OBJ_PIN_struct *attr = &check->data.BPF_OBJ_PIN_data;
674*cf84ac9aSAndroid Build Coastguard Worker 	attr->pathname = (uintptr_t) pathname;
675*cf84ac9aSAndroid Build Coastguard Worker }
676*cf84ac9aSAndroid Build Coastguard Worker 
677*cf84ac9aSAndroid Build Coastguard Worker static struct bpf_attr_check BPF_OBJ_PIN_checks[] = {
678*cf84ac9aSAndroid Build Coastguard Worker 	{
679*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_PIN_data = { .pathname = 0 } },
680*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_PIN_struct, pathname),
681*cf84ac9aSAndroid Build Coastguard Worker 		.str = "pathname=NULL, bpf_fd=0"
682*cf84ac9aSAndroid Build Coastguard Worker 	},
683*cf84ac9aSAndroid Build Coastguard Worker 	{
684*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_PIN_data = {
685*cf84ac9aSAndroid Build Coastguard Worker 			.pathname = 0xFFFFFFFFFFFFFFFFULL
686*cf84ac9aSAndroid Build Coastguard Worker 		} },
687*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_PIN_struct, pathname),
688*cf84ac9aSAndroid Build Coastguard Worker 		.str = "pathname=" BIG_ADDR("0xffffffffffffffff", "0xffffffff")
689*cf84ac9aSAndroid Build Coastguard Worker 		       ", bpf_fd=0",
690*cf84ac9aSAndroid Build Coastguard Worker 	},
691*cf84ac9aSAndroid Build Coastguard Worker 	{
692*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_PIN_data = { .bpf_fd = -1 } },
693*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_PIN_struct, bpf_fd),
694*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_OBJ_PIN_attr,
695*cf84ac9aSAndroid Build Coastguard Worker 		.str = "pathname=\"/sys/fs/bpf/foo/bar\", bpf_fd=-1"
696*cf84ac9aSAndroid Build Coastguard Worker 	},
697*cf84ac9aSAndroid Build Coastguard Worker 	{
698*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_PIN_data = {
699*cf84ac9aSAndroid Build Coastguard Worker 			.bpf_fd = -1,
700*cf84ac9aSAndroid Build Coastguard Worker 			.file_flags = 0x18
701*cf84ac9aSAndroid Build Coastguard Worker 		} },
702*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_PIN_struct, file_flags),
703*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_OBJ_PIN_attr,
704*cf84ac9aSAndroid Build Coastguard Worker 		.str = "pathname=\"/sys/fs/bpf/foo/bar\", bpf_fd=-1"
705*cf84ac9aSAndroid Build Coastguard Worker 		       ", file_flags=BPF_F_RDONLY|BPF_F_WRONLY"
706*cf84ac9aSAndroid Build Coastguard Worker 	}
707*cf84ac9aSAndroid Build Coastguard Worker };
708*cf84ac9aSAndroid Build Coastguard Worker 
709*cf84ac9aSAndroid Build Coastguard Worker #define BPF_OBJ_GET_checks BPF_OBJ_PIN_checks
710*cf84ac9aSAndroid Build Coastguard Worker 
711*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_PROG_ATTACH_checks[] = {
712*cf84ac9aSAndroid Build Coastguard Worker 	{
713*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_ATTACH_data = { .target_fd = -1 } },
714*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_ATTACH_struct, target_fd),
715*cf84ac9aSAndroid Build Coastguard Worker 		.str = "target_fd=-1, attach_bpf_fd=0"
716*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=BPF_CGROUP_INET_INGRESS, attach_flags=0"
717*cf84ac9aSAndroid Build Coastguard Worker 	},
718*cf84ac9aSAndroid Build Coastguard Worker 	{
719*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_ATTACH_data = {
720*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = -1,
721*cf84ac9aSAndroid Build Coastguard Worker 			.attach_bpf_fd = -2,
722*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 2,
723*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 1
724*cf84ac9aSAndroid Build Coastguard Worker 		} },
725*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_ATTACH_struct, attach_flags),
726*cf84ac9aSAndroid Build Coastguard Worker 		.str = "target_fd=-1, attach_bpf_fd=-2"
727*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=BPF_CGROUP_INET_SOCK_CREATE"
728*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_flags=BPF_F_ALLOW_OVERRIDE"
729*cf84ac9aSAndroid Build Coastguard Worker 	}
730*cf84ac9aSAndroid Build Coastguard Worker };
731*cf84ac9aSAndroid Build Coastguard Worker 
732*cf84ac9aSAndroid Build Coastguard Worker 
733*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_PROG_DETACH_checks[] = {
734*cf84ac9aSAndroid Build Coastguard Worker 	{
735*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_DETACH_data = { .target_fd = -1 } },
736*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_DETACH_struct, target_fd),
737*cf84ac9aSAndroid Build Coastguard Worker 		.str = "target_fd=-1, attach_type=BPF_CGROUP_INET_INGRESS"
738*cf84ac9aSAndroid Build Coastguard Worker 	},
739*cf84ac9aSAndroid Build Coastguard Worker 	{
740*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_DETACH_data = {
741*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = -1,
742*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 2
743*cf84ac9aSAndroid Build Coastguard Worker 		} },
744*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_DETACH_struct, attach_type),
745*cf84ac9aSAndroid Build Coastguard Worker 		.str = "target_fd=-1, attach_type=BPF_CGROUP_INET_SOCK_CREATE"
746*cf84ac9aSAndroid Build Coastguard Worker 	}
747*cf84ac9aSAndroid Build Coastguard Worker };
748*cf84ac9aSAndroid Build Coastguard Worker 
749*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_PROG_TEST_RUN_checks[] = {
750*cf84ac9aSAndroid Build Coastguard Worker 	{
751*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_TEST_RUN_data = { .prog_fd = -1 } },
752*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_TEST_RUN_struct, prog_fd),
753*cf84ac9aSAndroid Build Coastguard Worker 		.str = "test={prog_fd=-1, retval=0, data_size_in=0"
754*cf84ac9aSAndroid Build Coastguard Worker 		       ", data_size_out=0, data_in=NULL, data_out=NULL"
755*cf84ac9aSAndroid Build Coastguard Worker 		       ", repeat=0, duration=0}"
756*cf84ac9aSAndroid Build Coastguard Worker 	},
757*cf84ac9aSAndroid Build Coastguard Worker 	{
758*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_TEST_RUN_data = {
759*cf84ac9aSAndroid Build Coastguard Worker 			.prog_fd = -1,
760*cf84ac9aSAndroid Build Coastguard Worker 			.retval = 0xfac1fed2,
761*cf84ac9aSAndroid Build Coastguard Worker 			.data_size_in = 0xfac3fed4,
762*cf84ac9aSAndroid Build Coastguard Worker 			.data_size_out = 0xfac5fed6,
763*cf84ac9aSAndroid Build Coastguard Worker 			.data_in = (uint64_t) 0xfacef11dbadc2dedULL,
764*cf84ac9aSAndroid Build Coastguard Worker 			.data_out = (uint64_t) 0xfacef33dbadc4dedULL,
765*cf84ac9aSAndroid Build Coastguard Worker 			.repeat = 0xfac7fed8,
766*cf84ac9aSAndroid Build Coastguard Worker 			.duration = 0xfac9feda
767*cf84ac9aSAndroid Build Coastguard Worker 		} },
768*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_TEST_RUN_struct, duration),
769*cf84ac9aSAndroid Build Coastguard Worker 		.str = "test={prog_fd=-1, retval=4207017682"
770*cf84ac9aSAndroid Build Coastguard Worker 		       ", data_size_in=4207148756, data_size_out=4207279830"
771*cf84ac9aSAndroid Build Coastguard Worker 		       ", data_in=0xfacef11dbadc2ded"
772*cf84ac9aSAndroid Build Coastguard Worker 		       ", data_out=0xfacef33dbadc4ded"
773*cf84ac9aSAndroid Build Coastguard Worker 		       ", repeat=4207410904, duration=4207541978}"
774*cf84ac9aSAndroid Build Coastguard Worker 	}
775*cf84ac9aSAndroid Build Coastguard Worker };
776*cf84ac9aSAndroid Build Coastguard Worker 
777*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_PROG_GET_NEXT_ID_checks[] = {
778*cf84ac9aSAndroid Build Coastguard Worker 	{
779*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_NEXT_ID_data = {
780*cf84ac9aSAndroid Build Coastguard Worker 			.start_id = 0xdeadbeef
781*cf84ac9aSAndroid Build Coastguard Worker 		} },
782*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, start_id),
783*cf84ac9aSAndroid Build Coastguard Worker 		.str = "start_id=3735928559, next_id=0"
784*cf84ac9aSAndroid Build Coastguard Worker 	},
785*cf84ac9aSAndroid Build Coastguard Worker 	{
786*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_NEXT_ID_data = {
787*cf84ac9aSAndroid Build Coastguard Worker 			.start_id = 0xdeadbeef
788*cf84ac9aSAndroid Build Coastguard Worker 		} },
789*cf84ac9aSAndroid Build Coastguard Worker 		.size = 1,
790*cf84ac9aSAndroid Build Coastguard Worker 		.str = "start_id="
791*cf84ac9aSAndroid Build Coastguard Worker #if WORDS_BIGENDIAN
792*cf84ac9aSAndroid Build Coastguard Worker 		       "3724541952"	/* 0xde000000 */
793*cf84ac9aSAndroid Build Coastguard Worker #else
794*cf84ac9aSAndroid Build Coastguard Worker 		       "239"		/* 0x000000ef */
795*cf84ac9aSAndroid Build Coastguard Worker #endif
796*cf84ac9aSAndroid Build Coastguard Worker 		       ", next_id=0"
797*cf84ac9aSAndroid Build Coastguard Worker 	},
798*cf84ac9aSAndroid Build Coastguard Worker 	{
799*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_NEXT_ID_data = {
800*cf84ac9aSAndroid Build Coastguard Worker 			.start_id = 0xbadc0ded,
801*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d
802*cf84ac9aSAndroid Build Coastguard Worker 		} },
803*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, next_id),
804*cf84ac9aSAndroid Build Coastguard Worker 		.str = "start_id=3134983661, next_id=3405705229"
805*cf84ac9aSAndroid Build Coastguard Worker 	},
806*cf84ac9aSAndroid Build Coastguard Worker 	{
807*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_NEXT_ID_data = {
808*cf84ac9aSAndroid Build Coastguard Worker 			.start_id = 0xbadc0ded,
809*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d,
810*cf84ac9aSAndroid Build Coastguard Worker 			.open_flags = 0xffffff27
811*cf84ac9aSAndroid Build Coastguard Worker 		} },
812*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_NEXT_ID_struct, open_flags),
813*cf84ac9aSAndroid Build Coastguard Worker 		.str = "start_id=3134983661, next_id=3405705229"
814*cf84ac9aSAndroid Build Coastguard Worker 		       ", open_flags=0xffffff27 /* BPF_F_??? */"
815*cf84ac9aSAndroid Build Coastguard Worker 	}
816*cf84ac9aSAndroid Build Coastguard Worker };
817*cf84ac9aSAndroid Build Coastguard Worker 
818*cf84ac9aSAndroid Build Coastguard Worker #define BPF_MAP_GET_NEXT_ID_checks BPF_PROG_GET_NEXT_ID_checks
819*cf84ac9aSAndroid Build Coastguard Worker 
820*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_PROG_GET_FD_BY_ID_checks[] = {
821*cf84ac9aSAndroid Build Coastguard Worker 	{
822*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_FD_BY_ID_data = {
823*cf84ac9aSAndroid Build Coastguard Worker 			.prog_id = 0xdeadbeef
824*cf84ac9aSAndroid Build Coastguard Worker 		} },
825*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, prog_id),
826*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_id=3735928559, next_id=0"
827*cf84ac9aSAndroid Build Coastguard Worker 	},
828*cf84ac9aSAndroid Build Coastguard Worker 	{
829*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_FD_BY_ID_data = {
830*cf84ac9aSAndroid Build Coastguard Worker 			.prog_id = 0xbadc0ded,
831*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d
832*cf84ac9aSAndroid Build Coastguard Worker 		} },
833*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, next_id),
834*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_id=3134983661, next_id=3405705229"
835*cf84ac9aSAndroid Build Coastguard Worker 	},
836*cf84ac9aSAndroid Build Coastguard Worker 	{
837*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_GET_FD_BY_ID_data = {
838*cf84ac9aSAndroid Build Coastguard Worker 			.prog_id = 0xbadc0ded,
839*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d,
840*cf84ac9aSAndroid Build Coastguard Worker 			.open_flags = 0xffffff27
841*cf84ac9aSAndroid Build Coastguard Worker 		} },
842*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_GET_FD_BY_ID_struct, open_flags),
843*cf84ac9aSAndroid Build Coastguard Worker 		.str = "prog_id=3134983661, next_id=3405705229"
844*cf84ac9aSAndroid Build Coastguard Worker 		       ", open_flags=0xffffff27 /* BPF_F_??? */"
845*cf84ac9aSAndroid Build Coastguard Worker 	}
846*cf84ac9aSAndroid Build Coastguard Worker };
847*cf84ac9aSAndroid Build Coastguard Worker 
848*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_MAP_GET_FD_BY_ID_checks[] = {
849*cf84ac9aSAndroid Build Coastguard Worker 	{
850*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_GET_FD_BY_ID_data = {
851*cf84ac9aSAndroid Build Coastguard Worker 			.map_id = 0xdeadbeef
852*cf84ac9aSAndroid Build Coastguard Worker 		} },
853*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, map_id),
854*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_id=3735928559, next_id=0"
855*cf84ac9aSAndroid Build Coastguard Worker 	},
856*cf84ac9aSAndroid Build Coastguard Worker 	{
857*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_GET_FD_BY_ID_data = {
858*cf84ac9aSAndroid Build Coastguard Worker 			.map_id = 0xbadc0ded,
859*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d
860*cf84ac9aSAndroid Build Coastguard Worker 		} },
861*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, next_id),
862*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_id=3134983661, next_id=3405705229"
863*cf84ac9aSAndroid Build Coastguard Worker 	},
864*cf84ac9aSAndroid Build Coastguard Worker 	{
865*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_MAP_GET_FD_BY_ID_data = {
866*cf84ac9aSAndroid Build Coastguard Worker 			.map_id = 0xbadc0ded,
867*cf84ac9aSAndroid Build Coastguard Worker 			.next_id = 0xcafef00d,
868*cf84ac9aSAndroid Build Coastguard Worker 			.open_flags = 0xffffff27
869*cf84ac9aSAndroid Build Coastguard Worker 		} },
870*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_MAP_GET_FD_BY_ID_struct, open_flags),
871*cf84ac9aSAndroid Build Coastguard Worker 		.str = "map_id=3134983661, next_id=3405705229"
872*cf84ac9aSAndroid Build Coastguard Worker 		       ", open_flags=0xffffff27 /* BPF_F_??? */"
873*cf84ac9aSAndroid Build Coastguard Worker 	}
874*cf84ac9aSAndroid Build Coastguard Worker };
875*cf84ac9aSAndroid Build Coastguard Worker 
876*cf84ac9aSAndroid Build Coastguard Worker static const struct bpf_attr_check BPF_OBJ_GET_INFO_BY_FD_checks[] = {
877*cf84ac9aSAndroid Build Coastguard Worker 	{
878*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_GET_INFO_BY_FD_data = { .bpf_fd = -1 } },
879*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_GET_INFO_BY_FD_struct, bpf_fd),
880*cf84ac9aSAndroid Build Coastguard Worker 		.str = "info={bpf_fd=-1, info_len=0, info=NULL}"
881*cf84ac9aSAndroid Build Coastguard Worker 	},
882*cf84ac9aSAndroid Build Coastguard Worker 	{
883*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_OBJ_GET_INFO_BY_FD_data = {
884*cf84ac9aSAndroid Build Coastguard Worker 			.bpf_fd = -1,
885*cf84ac9aSAndroid Build Coastguard Worker 			.info_len = 0xdeadbeef,
886*cf84ac9aSAndroid Build Coastguard Worker 			.info = (uint64_t) 0xfacefeedbadc0dedULL
887*cf84ac9aSAndroid Build Coastguard Worker 		} },
888*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_OBJ_GET_INFO_BY_FD_struct, info),
889*cf84ac9aSAndroid Build Coastguard Worker 		.str = "info={bpf_fd=-1, info_len=3735928559"
890*cf84ac9aSAndroid Build Coastguard Worker 		       ", info=0xfacefeedbadc0ded}"
891*cf84ac9aSAndroid Build Coastguard Worker 	}
892*cf84ac9aSAndroid Build Coastguard Worker };
893*cf84ac9aSAndroid Build Coastguard Worker 
894*cf84ac9aSAndroid Build Coastguard Worker 
895*cf84ac9aSAndroid Build Coastguard Worker static uint32_t prog_load_ids[] = { 0, 1, 0xffffffff, 2718281828, };
896*cf84ac9aSAndroid Build Coastguard Worker uint32_t *prog_load_ids_ptr;
897*cf84ac9aSAndroid Build Coastguard Worker 
898*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_PROG_QUERY_attr4(struct bpf_attr_check * check)899*cf84ac9aSAndroid Build Coastguard Worker init_BPF_PROG_QUERY_attr4(struct bpf_attr_check *check)
900*cf84ac9aSAndroid Build Coastguard Worker {
901*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_PROG_QUERY_struct *attr = &check->data.BPF_PROG_QUERY_data;
902*cf84ac9aSAndroid Build Coastguard Worker 
903*cf84ac9aSAndroid Build Coastguard Worker 	if (!prog_load_ids_ptr)
904*cf84ac9aSAndroid Build Coastguard Worker 		prog_load_ids_ptr = tail_memdup(prog_load_ids,
905*cf84ac9aSAndroid Build Coastguard Worker 						sizeof(prog_load_ids));
906*cf84ac9aSAndroid Build Coastguard Worker 
907*cf84ac9aSAndroid Build Coastguard Worker 	attr->prog_ids = (uintptr_t) prog_load_ids_ptr;
908*cf84ac9aSAndroid Build Coastguard Worker 	attr->prog_cnt = ARRAY_SIZE(prog_load_ids);
909*cf84ac9aSAndroid Build Coastguard Worker }
910*cf84ac9aSAndroid Build Coastguard Worker 
911*cf84ac9aSAndroid Build Coastguard Worker static void
print_BPF_PROG_QUERY_attr4(const struct bpf_attr_check * check,unsigned long addr)912*cf84ac9aSAndroid Build Coastguard Worker print_BPF_PROG_QUERY_attr4(const struct bpf_attr_check *check, unsigned long addr)
913*cf84ac9aSAndroid Build Coastguard Worker {
914*cf84ac9aSAndroid Build Coastguard Worker 	printf("query={target_fd=-1153374643"
915*cf84ac9aSAndroid Build Coastguard Worker 	       ", attach_type=0xfeedface /* BPF_??? */"
916*cf84ac9aSAndroid Build Coastguard Worker 	       ", query_flags=BPF_F_QUERY_EFFECTIVE|0xdeadf00c"
917*cf84ac9aSAndroid Build Coastguard Worker 	       ", attach_flags=BPF_F_ALLOW_MULTI|0xbeefcafc"
918*cf84ac9aSAndroid Build Coastguard Worker #if defined(INJECT_RETVAL) && INJECT_RETVAL > 0
919*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_ids=[0, 1, 4294967295, 2718281828], prog_cnt=4}"
920*cf84ac9aSAndroid Build Coastguard Worker #else
921*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_ids=%p, prog_cnt=4}", prog_load_ids_ptr
922*cf84ac9aSAndroid Build Coastguard Worker #endif
923*cf84ac9aSAndroid Build Coastguard Worker 	       );
924*cf84ac9aSAndroid Build Coastguard Worker }
925*cf84ac9aSAndroid Build Coastguard Worker 
926*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_PROG_QUERY_attr5(struct bpf_attr_check * check)927*cf84ac9aSAndroid Build Coastguard Worker init_BPF_PROG_QUERY_attr5(struct bpf_attr_check *check)
928*cf84ac9aSAndroid Build Coastguard Worker {
929*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_PROG_QUERY_struct *attr = &check->data.BPF_PROG_QUERY_data;
930*cf84ac9aSAndroid Build Coastguard Worker 
931*cf84ac9aSAndroid Build Coastguard Worker 	if (!prog_load_ids_ptr)
932*cf84ac9aSAndroid Build Coastguard Worker 		prog_load_ids_ptr = tail_memdup(prog_load_ids,
933*cf84ac9aSAndroid Build Coastguard Worker 						sizeof(prog_load_ids));
934*cf84ac9aSAndroid Build Coastguard Worker 
935*cf84ac9aSAndroid Build Coastguard Worker 	attr->prog_ids = (uintptr_t) prog_load_ids_ptr;
936*cf84ac9aSAndroid Build Coastguard Worker 	attr->prog_cnt = ARRAY_SIZE(prog_load_ids) + 1;
937*cf84ac9aSAndroid Build Coastguard Worker }
938*cf84ac9aSAndroid Build Coastguard Worker 
939*cf84ac9aSAndroid Build Coastguard Worker static void
print_BPF_PROG_QUERY_attr5(const struct bpf_attr_check * check,unsigned long addr)940*cf84ac9aSAndroid Build Coastguard Worker print_BPF_PROG_QUERY_attr5(const struct bpf_attr_check *check, unsigned long addr)
941*cf84ac9aSAndroid Build Coastguard Worker {
942*cf84ac9aSAndroid Build Coastguard Worker 	printf("query={target_fd=-1153374643"
943*cf84ac9aSAndroid Build Coastguard Worker 	       ", attach_type=0xfeedface /* BPF_??? */"
944*cf84ac9aSAndroid Build Coastguard Worker 	       ", query_flags=BPF_F_QUERY_EFFECTIVE|0xdeadf00c"
945*cf84ac9aSAndroid Build Coastguard Worker 	       ", attach_flags=BPF_F_ALLOW_MULTI|0xbeefcafc"
946*cf84ac9aSAndroid Build Coastguard Worker #if defined(INJECT_RETVAL) && INJECT_RETVAL > 0
947*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_ids=[0, 1, 4294967295, 2718281828, ... /* %p */]"
948*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_cnt=5}",
949*cf84ac9aSAndroid Build Coastguard Worker 	       prog_load_ids_ptr + ARRAY_SIZE(prog_load_ids)
950*cf84ac9aSAndroid Build Coastguard Worker #else
951*cf84ac9aSAndroid Build Coastguard Worker 	       ", prog_ids=%p, prog_cnt=5}", prog_load_ids_ptr
952*cf84ac9aSAndroid Build Coastguard Worker #endif
953*cf84ac9aSAndroid Build Coastguard Worker 	       );
954*cf84ac9aSAndroid Build Coastguard Worker }
955*cf84ac9aSAndroid Build Coastguard Worker 
956*cf84ac9aSAndroid Build Coastguard Worker static struct bpf_attr_check BPF_PROG_QUERY_checks[] = {
957*cf84ac9aSAndroid Build Coastguard Worker 	{
958*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = { .target_fd = -1 } },
959*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, target_fd),
960*cf84ac9aSAndroid Build Coastguard Worker 		.str = "query={target_fd=-1"
961*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=BPF_CGROUP_INET_INGRESS, query_flags=0"
962*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_flags=0, prog_ids=NULL, prog_cnt=0}",
963*cf84ac9aSAndroid Build Coastguard Worker 	},
964*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 1 */
965*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = {
966*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = 3141592653U,
967*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 16,
968*cf84ac9aSAndroid Build Coastguard Worker 			.query_flags = 1,
969*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 3,
970*cf84ac9aSAndroid Build Coastguard Worker 		} },
971*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, attach_flags),
972*cf84ac9aSAndroid Build Coastguard Worker 		.str = "query={target_fd=-1153374643"
973*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=BPF_LIRC_MODE2"
974*cf84ac9aSAndroid Build Coastguard Worker 		       ", query_flags=BPF_F_QUERY_EFFECTIVE"
975*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_flags=BPF_F_ALLOW_OVERRIDE|BPF_F_ALLOW_MULTI"
976*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_ids=NULL, prog_cnt=0}",
977*cf84ac9aSAndroid Build Coastguard Worker 	},
978*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 2 */
979*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = {
980*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = 3141592653U,
981*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 17,
982*cf84ac9aSAndroid Build Coastguard Worker 			.query_flags = 0xfffffffe,
983*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 0xfffffffc,
984*cf84ac9aSAndroid Build Coastguard Worker 			.prog_ids = 0xffffffffffffffffULL,
985*cf84ac9aSAndroid Build Coastguard Worker 			.prog_cnt = 2718281828,
986*cf84ac9aSAndroid Build Coastguard Worker 		} },
987*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt),
988*cf84ac9aSAndroid Build Coastguard Worker 		.str = "query={target_fd=-1153374643"
989*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=0x11 /* BPF_??? */"
990*cf84ac9aSAndroid Build Coastguard Worker 		       ", query_flags=0xfffffffe /* BPF_F_QUERY_??? */"
991*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_flags=0xfffffffc /* BPF_F_??? */"
992*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_ids="
993*cf84ac9aSAndroid Build Coastguard Worker 		       BIG_ADDR("0xffffffffffffffff", "0xffffffff")
994*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_cnt=2718281828}",
995*cf84ac9aSAndroid Build Coastguard Worker 	},
996*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 3 */
997*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = {
998*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = 3141592653U,
999*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 0xfeedface,
1000*cf84ac9aSAndroid Build Coastguard Worker 			.query_flags = 0xdeadf00d,
1001*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 0xbeefcafe,
1002*cf84ac9aSAndroid Build Coastguard Worker 			.prog_ids = 0xffffffffffffffffULL,
1003*cf84ac9aSAndroid Build Coastguard Worker 			.prog_cnt = 0,
1004*cf84ac9aSAndroid Build Coastguard Worker 		} },
1005*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt),
1006*cf84ac9aSAndroid Build Coastguard Worker 		.str = "query={target_fd=-1153374643"
1007*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_type=0xfeedface /* BPF_??? */"
1008*cf84ac9aSAndroid Build Coastguard Worker 		       ", query_flags=BPF_F_QUERY_EFFECTIVE|0xdeadf00c"
1009*cf84ac9aSAndroid Build Coastguard Worker 		       ", attach_flags=BPF_F_ALLOW_MULTI|0xbeefcafc"
1010*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_ids=" BIG_ADDR_MAYBE("0xffffffffffffffff") "[]"
1011*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_cnt=0}",
1012*cf84ac9aSAndroid Build Coastguard Worker 	},
1013*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 4 */
1014*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = {
1015*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = 3141592653U,
1016*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 0xfeedface,
1017*cf84ac9aSAndroid Build Coastguard Worker 			.query_flags = 0xdeadf00d,
1018*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 0xbeefcafe,
1019*cf84ac9aSAndroid Build Coastguard Worker 		} },
1020*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt),
1021*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_PROG_QUERY_attr4,
1022*cf84ac9aSAndroid Build Coastguard Worker 		.print_fn = print_BPF_PROG_QUERY_attr4,
1023*cf84ac9aSAndroid Build Coastguard Worker 	},
1024*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 5 */
1025*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_PROG_QUERY_data = {
1026*cf84ac9aSAndroid Build Coastguard Worker 			.target_fd = 3141592653U,
1027*cf84ac9aSAndroid Build Coastguard Worker 			.attach_type = 0xfeedface,
1028*cf84ac9aSAndroid Build Coastguard Worker 			.query_flags = 0xdeadf00d,
1029*cf84ac9aSAndroid Build Coastguard Worker 			.attach_flags = 0xbeefcafe,
1030*cf84ac9aSAndroid Build Coastguard Worker 		} },
1031*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_PROG_QUERY_struct, prog_cnt),
1032*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_PROG_QUERY_attr5,
1033*cf84ac9aSAndroid Build Coastguard Worker 		.print_fn = print_BPF_PROG_QUERY_attr5,
1034*cf84ac9aSAndroid Build Coastguard Worker 	},
1035*cf84ac9aSAndroid Build Coastguard Worker };
1036*cf84ac9aSAndroid Build Coastguard Worker 
1037*cf84ac9aSAndroid Build Coastguard Worker 
1038*cf84ac9aSAndroid Build Coastguard Worker static void
init_BPF_RAW_TRACEPOINT_attr2(struct bpf_attr_check * check)1039*cf84ac9aSAndroid Build Coastguard Worker init_BPF_RAW_TRACEPOINT_attr2(struct bpf_attr_check *check)
1040*cf84ac9aSAndroid Build Coastguard Worker {
1041*cf84ac9aSAndroid Build Coastguard Worker 	/* TODO: test the 128 byte limit */
1042*cf84ac9aSAndroid Build Coastguard Worker 	static const char tp_name[] = "0123456789qwertyuiop0123456789qwe";
1043*cf84ac9aSAndroid Build Coastguard Worker 
1044*cf84ac9aSAndroid Build Coastguard Worker 	struct BPF_RAW_TRACEPOINT_OPEN_struct *attr =
1045*cf84ac9aSAndroid Build Coastguard Worker 		&check->data.BPF_RAW_TRACEPOINT_OPEN_data;
1046*cf84ac9aSAndroid Build Coastguard Worker 
1047*cf84ac9aSAndroid Build Coastguard Worker 	attr->name = (uintptr_t) tp_name;
1048*cf84ac9aSAndroid Build Coastguard Worker }
1049*cf84ac9aSAndroid Build Coastguard Worker 
1050*cf84ac9aSAndroid Build Coastguard Worker static struct bpf_attr_check BPF_RAW_TRACEPOINT_OPEN_checks[] = {
1051*cf84ac9aSAndroid Build Coastguard Worker 	{
1052*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_RAW_TRACEPOINT_OPEN_data = { .name = 0 } },
1053*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
1054*cf84ac9aSAndroid Build Coastguard Worker 				    name),
1055*cf84ac9aSAndroid Build Coastguard Worker 		.str = "raw_tracepoint={name=NULL, prog_fd=0}",
1056*cf84ac9aSAndroid Build Coastguard Worker 	},
1057*cf84ac9aSAndroid Build Coastguard Worker 	{ /* 1 */
1058*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_RAW_TRACEPOINT_OPEN_data = {
1059*cf84ac9aSAndroid Build Coastguard Worker 			.name = 0xffffffff00000000ULL,
1060*cf84ac9aSAndroid Build Coastguard Worker 			.prog_fd = 0xdeadbeef,
1061*cf84ac9aSAndroid Build Coastguard Worker 		} },
1062*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
1063*cf84ac9aSAndroid Build Coastguard Worker 				    prog_fd),
1064*cf84ac9aSAndroid Build Coastguard Worker 		.str = "raw_tracepoint="
1065*cf84ac9aSAndroid Build Coastguard Worker 		       "{name=" BIG_ADDR("0xffffffff00000000", "NULL")
1066*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_fd=-559038737}",
1067*cf84ac9aSAndroid Build Coastguard Worker 	},
1068*cf84ac9aSAndroid Build Coastguard Worker 	{
1069*cf84ac9aSAndroid Build Coastguard Worker 		.data = { .BPF_RAW_TRACEPOINT_OPEN_data = {
1070*cf84ac9aSAndroid Build Coastguard Worker 			.prog_fd = 0xdeadbeef,
1071*cf84ac9aSAndroid Build Coastguard Worker 		} },
1072*cf84ac9aSAndroid Build Coastguard Worker 		.size = offsetofend(struct BPF_RAW_TRACEPOINT_OPEN_struct,
1073*cf84ac9aSAndroid Build Coastguard Worker 				    prog_fd),
1074*cf84ac9aSAndroid Build Coastguard Worker 		.init_fn = init_BPF_RAW_TRACEPOINT_attr2,
1075*cf84ac9aSAndroid Build Coastguard Worker 		.str = "raw_tracepoint="
1076*cf84ac9aSAndroid Build Coastguard Worker 		       "{name=\"0123456789qwertyuiop0123456789qw\"..."
1077*cf84ac9aSAndroid Build Coastguard Worker 		       ", prog_fd=-559038737}",
1078*cf84ac9aSAndroid Build Coastguard Worker 	}
1079*cf84ac9aSAndroid Build Coastguard Worker };
1080*cf84ac9aSAndroid Build Coastguard Worker 
1081*cf84ac9aSAndroid Build Coastguard Worker 
1082*cf84ac9aSAndroid Build Coastguard Worker #define CHK(cmd_) \
1083*cf84ac9aSAndroid Build Coastguard Worker 	{ \
1084*cf84ac9aSAndroid Build Coastguard Worker 		cmd_, #cmd_, \
1085*cf84ac9aSAndroid Build Coastguard Worker 		cmd_##_checks, ARRAY_SIZE(cmd_##_checks), \
1086*cf84ac9aSAndroid Build Coastguard Worker 	} \
1087*cf84ac9aSAndroid Build Coastguard Worker 	/* End of CHK definition */
1088*cf84ac9aSAndroid Build Coastguard Worker 
1089*cf84ac9aSAndroid Build Coastguard Worker int
main(void)1090*cf84ac9aSAndroid Build Coastguard Worker main(void)
1091*cf84ac9aSAndroid Build Coastguard Worker {
1092*cf84ac9aSAndroid Build Coastguard Worker 	static const struct bpf_check checks[] = {
1093*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_CREATE),
1094*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_LOOKUP_ELEM),
1095*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_UPDATE_ELEM),
1096*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_DELETE_ELEM),
1097*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_GET_NEXT_KEY),
1098*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_LOAD),
1099*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_OBJ_PIN),
1100*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_OBJ_GET),
1101*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_ATTACH),
1102*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_DETACH),
1103*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_TEST_RUN),
1104*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_GET_NEXT_ID),
1105*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_GET_NEXT_ID),
1106*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_GET_FD_BY_ID),
1107*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_MAP_GET_FD_BY_ID),
1108*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_OBJ_GET_INFO_BY_FD),
1109*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_PROG_QUERY),
1110*cf84ac9aSAndroid Build Coastguard Worker 		CHK(BPF_RAW_TRACEPOINT_OPEN),
1111*cf84ac9aSAndroid Build Coastguard Worker 	};
1112*cf84ac9aSAndroid Build Coastguard Worker 
1113*cf84ac9aSAndroid Build Coastguard Worker 	page_size = get_page_size();
1114*cf84ac9aSAndroid Build Coastguard Worker 	end_of_page = (unsigned long) tail_alloc(1) + 1;
1115*cf84ac9aSAndroid Build Coastguard Worker 
1116*cf84ac9aSAndroid Build Coastguard Worker 	for (size_t i = 0; i < ARRAY_SIZE(checks); i++)
1117*cf84ac9aSAndroid Build Coastguard Worker 		test_bpf(checks + i);
1118*cf84ac9aSAndroid Build Coastguard Worker 
1119*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(0xfacefeed, 0, (kernel_ulong_t) 0xfacefeedbadc0dedULL);
1120*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(0xfacefeed /* BPF_??? */, NULL, %u) = %s\n",
1121*cf84ac9aSAndroid Build Coastguard Worker 	       0xbadc0dedu, errstr);
1122*cf84ac9aSAndroid Build Coastguard Worker 
1123*cf84ac9aSAndroid Build Coastguard Worker 	sys_bpf(0xfacefeed, end_of_page, 40);
1124*cf84ac9aSAndroid Build Coastguard Worker 	printf("bpf(0xfacefeed /* BPF_??? */, %#lx, 40) = %s\n",
1125*cf84ac9aSAndroid Build Coastguard Worker 	       end_of_page, errstr);
1126*cf84ac9aSAndroid Build Coastguard Worker 
1127*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
1128*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
1129*cf84ac9aSAndroid Build Coastguard Worker }
1130