xref: /freebsd/contrib/netbsd-tests/lib/libbpfjit/t_bpfjit.c (revision 57718be8fa0bd5edc11ab9a72e68cc71982939a6)
1*57718be8SEnji Cooper /*	$NetBSD: t_bpfjit.c,v 1.6 2014/07/08 21:07:52 alnsn Exp $ */
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper /*-
4*57718be8SEnji Cooper  * Copyright (c) 2011-2012, 2014 Alexander Nasonov.
5*57718be8SEnji Cooper  * All rights reserved.
6*57718be8SEnji Cooper  *
7*57718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
8*57718be8SEnji Cooper  * modification, are permitted provided that the following conditions
9*57718be8SEnji Cooper  * are met:
10*57718be8SEnji Cooper  *
11*57718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
12*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
13*57718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
14*57718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in
15*57718be8SEnji Cooper  *    the documentation and/or other materials provided with the
16*57718be8SEnji Cooper  *    distribution.
17*57718be8SEnji Cooper  *
18*57718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*57718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*57718be8SEnji Cooper  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21*57718be8SEnji Cooper  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
22*57718be8SEnji Cooper  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23*57718be8SEnji Cooper  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24*57718be8SEnji Cooper  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25*57718be8SEnji Cooper  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26*57718be8SEnji Cooper  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27*57718be8SEnji Cooper  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28*57718be8SEnji Cooper  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29*57718be8SEnji Cooper  * SUCH DAMAGE.
30*57718be8SEnji Cooper  */
31*57718be8SEnji Cooper 
32*57718be8SEnji Cooper #include <sys/cdefs.h>
33*57718be8SEnji Cooper __RCSID("$NetBSD: t_bpfjit.c,v 1.6 2014/07/08 21:07:52 alnsn Exp $");
34*57718be8SEnji Cooper 
35*57718be8SEnji Cooper #include <atf-c.h>
36*57718be8SEnji Cooper #include <stdint.h>
37*57718be8SEnji Cooper #include <string.h>
38*57718be8SEnji Cooper 
39*57718be8SEnji Cooper #include <net/bpf.h>
40*57718be8SEnji Cooper #include <net/bpfjit.h>
41*57718be8SEnji Cooper 
42*57718be8SEnji Cooper static uint8_t deadbeef_at_5[16] = {
43*57718be8SEnji Cooper 	0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
44*57718be8SEnji Cooper };
45*57718be8SEnji Cooper 
46*57718be8SEnji Cooper static inline
47*57718be8SEnji Cooper unsigned int jitcall(bpfjit_func_t fn,
48*57718be8SEnji Cooper     const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
49*57718be8SEnji Cooper {
50*57718be8SEnji Cooper 	bpf_args_t args;
51*57718be8SEnji Cooper 
52*57718be8SEnji Cooper 	args.pkt = pkt;
53*57718be8SEnji Cooper 	args.wirelen = wirelen;
54*57718be8SEnji Cooper 	args.buflen = buflen;
55*57718be8SEnji Cooper 
56*57718be8SEnji Cooper 	return fn(NULL, &args);
57*57718be8SEnji Cooper }
58*57718be8SEnji Cooper 
59*57718be8SEnji Cooper ATF_TC(libbpfjit_empty);
60*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_empty, tc)
61*57718be8SEnji Cooper {
62*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
63*57718be8SEnji Cooper 	    "Test that JIT compilation of an empty bpf program fails");
64*57718be8SEnji Cooper }
65*57718be8SEnji Cooper 
66*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_empty, tc)
67*57718be8SEnji Cooper {
68*57718be8SEnji Cooper 	struct bpf_insn dummy;
69*57718be8SEnji Cooper 
70*57718be8SEnji Cooper 	ATF_CHECK(bpfjit_generate_code(NULL, &dummy, 0) == NULL);
71*57718be8SEnji Cooper }
72*57718be8SEnji Cooper 
73*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_add_k);
74*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_add_k, tc)
75*57718be8SEnji Cooper {
76*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
77*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
78*57718be8SEnji Cooper }
79*57718be8SEnji Cooper 
80*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_add_k, tc)
81*57718be8SEnji Cooper {
82*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
83*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 3),
84*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
85*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
86*57718be8SEnji Cooper 	};
87*57718be8SEnji Cooper 
88*57718be8SEnji Cooper 	bpfjit_func_t code;
89*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
90*57718be8SEnji Cooper 
91*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
92*57718be8SEnji Cooper 
93*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
94*57718be8SEnji Cooper 
95*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
96*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
97*57718be8SEnji Cooper 
98*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
99*57718be8SEnji Cooper 
100*57718be8SEnji Cooper 	bpfjit_free_code(code);
101*57718be8SEnji Cooper }
102*57718be8SEnji Cooper 
103*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_sub_k);
104*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_sub_k, tc)
105*57718be8SEnji Cooper {
106*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
107*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
108*57718be8SEnji Cooper }
109*57718be8SEnji Cooper 
110*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_sub_k, tc)
111*57718be8SEnji Cooper {
112*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
113*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 1),
114*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
115*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
116*57718be8SEnji Cooper 	};
117*57718be8SEnji Cooper 
118*57718be8SEnji Cooper 	bpfjit_func_t code;
119*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
120*57718be8SEnji Cooper 
121*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
122*57718be8SEnji Cooper 
123*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
124*57718be8SEnji Cooper 
125*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
126*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
127*57718be8SEnji Cooper 
128*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
129*57718be8SEnji Cooper 
130*57718be8SEnji Cooper 	bpfjit_free_code(code);
131*57718be8SEnji Cooper }
132*57718be8SEnji Cooper 
133*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_mul_k);
134*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mul_k, tc)
135*57718be8SEnji Cooper {
136*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
137*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
138*57718be8SEnji Cooper }
139*57718be8SEnji Cooper 
140*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mul_k, tc)
141*57718be8SEnji Cooper {
142*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
143*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
144*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
145*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
146*57718be8SEnji Cooper 	};
147*57718be8SEnji Cooper 
148*57718be8SEnji Cooper 	bpfjit_func_t code;
149*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
150*57718be8SEnji Cooper 
151*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
152*57718be8SEnji Cooper 
153*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
154*57718be8SEnji Cooper 
155*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
156*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
157*57718be8SEnji Cooper 
158*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
159*57718be8SEnji Cooper 
160*57718be8SEnji Cooper 	bpfjit_free_code(code);
161*57718be8SEnji Cooper }
162*57718be8SEnji Cooper 
163*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div0_k);
164*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div0_k, tc)
165*57718be8SEnji Cooper {
166*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
167*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
168*57718be8SEnji Cooper }
169*57718be8SEnji Cooper 
170*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div0_k, tc)
171*57718be8SEnji Cooper {
172*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
173*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
174*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
175*57718be8SEnji Cooper 	};
176*57718be8SEnji Cooper 
177*57718be8SEnji Cooper 	bpfjit_func_t code;
178*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
179*57718be8SEnji Cooper 
180*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
181*57718be8SEnji Cooper 
182*57718be8SEnji Cooper 	//ATF_CHECK(bpf_validate(insns, insn_count));
183*57718be8SEnji Cooper 
184*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
185*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
186*57718be8SEnji Cooper 
187*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
188*57718be8SEnji Cooper 
189*57718be8SEnji Cooper 	bpfjit_free_code(code);
190*57718be8SEnji Cooper }
191*57718be8SEnji Cooper 
192*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div1_k);
193*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div1_k, tc)
194*57718be8SEnji Cooper {
195*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
196*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
197*57718be8SEnji Cooper }
198*57718be8SEnji Cooper 
199*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div1_k, tc)
200*57718be8SEnji Cooper {
201*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
202*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 7),
203*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
204*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
205*57718be8SEnji Cooper 	};
206*57718be8SEnji Cooper 
207*57718be8SEnji Cooper 	bpfjit_func_t code;
208*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
209*57718be8SEnji Cooper 
210*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
211*57718be8SEnji Cooper 
212*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
213*57718be8SEnji Cooper 
214*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
215*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
216*57718be8SEnji Cooper 
217*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
218*57718be8SEnji Cooper 
219*57718be8SEnji Cooper 	bpfjit_free_code(code);
220*57718be8SEnji Cooper }
221*57718be8SEnji Cooper 
222*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div2_k);
223*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div2_k, tc)
224*57718be8SEnji Cooper {
225*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
226*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
227*57718be8SEnji Cooper }
228*57718be8SEnji Cooper 
229*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div2_k, tc)
230*57718be8SEnji Cooper {
231*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
232*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 7),
233*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
234*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
235*57718be8SEnji Cooper 	};
236*57718be8SEnji Cooper 
237*57718be8SEnji Cooper 	bpfjit_func_t code;
238*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
239*57718be8SEnji Cooper 
240*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
241*57718be8SEnji Cooper 
242*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
243*57718be8SEnji Cooper 
244*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
245*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
246*57718be8SEnji Cooper 
247*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
248*57718be8SEnji Cooper 
249*57718be8SEnji Cooper 	bpfjit_free_code(code);
250*57718be8SEnji Cooper }
251*57718be8SEnji Cooper 
252*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div4_k);
253*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div4_k, tc)
254*57718be8SEnji Cooper {
255*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
256*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
257*57718be8SEnji Cooper }
258*57718be8SEnji Cooper 
259*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div4_k, tc)
260*57718be8SEnji Cooper {
261*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
262*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
263*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
264*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
265*57718be8SEnji Cooper 	};
266*57718be8SEnji Cooper 
267*57718be8SEnji Cooper 	bpfjit_func_t code;
268*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
269*57718be8SEnji Cooper 
270*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
271*57718be8SEnji Cooper 
272*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
273*57718be8SEnji Cooper 
274*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
275*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
276*57718be8SEnji Cooper 
277*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
278*57718be8SEnji Cooper 
279*57718be8SEnji Cooper 	bpfjit_free_code(code);
280*57718be8SEnji Cooper }
281*57718be8SEnji Cooper 
282*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10_k);
283*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10_k, tc)
284*57718be8SEnji Cooper {
285*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
286*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
287*57718be8SEnji Cooper }
288*57718be8SEnji Cooper 
289*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10_k, tc)
290*57718be8SEnji Cooper {
291*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
292*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
293*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
294*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
295*57718be8SEnji Cooper 	};
296*57718be8SEnji Cooper 
297*57718be8SEnji Cooper 	bpfjit_func_t code;
298*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
299*57718be8SEnji Cooper 
300*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
301*57718be8SEnji Cooper 
302*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
303*57718be8SEnji Cooper 
304*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
305*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
306*57718be8SEnji Cooper 
307*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
308*57718be8SEnji Cooper 
309*57718be8SEnji Cooper 	bpfjit_free_code(code);
310*57718be8SEnji Cooper }
311*57718be8SEnji Cooper 
312*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10000_k);
313*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10000_k, tc)
314*57718be8SEnji Cooper {
315*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
316*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
317*57718be8SEnji Cooper }
318*57718be8SEnji Cooper 
319*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10000_k, tc)
320*57718be8SEnji Cooper {
321*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
322*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
323*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
324*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
325*57718be8SEnji Cooper 	};
326*57718be8SEnji Cooper 
327*57718be8SEnji Cooper 	bpfjit_func_t code;
328*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
329*57718be8SEnji Cooper 
330*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
331*57718be8SEnji Cooper 
332*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
333*57718be8SEnji Cooper 
334*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
335*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
336*57718be8SEnji Cooper 
337*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
338*57718be8SEnji Cooper 
339*57718be8SEnji Cooper 	bpfjit_free_code(code);
340*57718be8SEnji Cooper }
341*57718be8SEnji Cooper 
342*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div7609801_k);
343*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div7609801_k, tc)
344*57718be8SEnji Cooper {
345*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
346*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
347*57718be8SEnji Cooper }
348*57718be8SEnji Cooper 
349*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div7609801_k, tc)
350*57718be8SEnji Cooper {
351*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
352*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
353*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
354*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
355*57718be8SEnji Cooper 	};
356*57718be8SEnji Cooper 
357*57718be8SEnji Cooper 	bpfjit_func_t code;
358*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
359*57718be8SEnji Cooper 
360*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
361*57718be8SEnji Cooper 
362*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
363*57718be8SEnji Cooper 
364*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
365*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
366*57718be8SEnji Cooper 
367*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
368*57718be8SEnji Cooper 
369*57718be8SEnji Cooper 	bpfjit_free_code(code);
370*57718be8SEnji Cooper }
371*57718be8SEnji Cooper 
372*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div80000000_k);
373*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div80000000_k, tc)
374*57718be8SEnji Cooper {
375*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
376*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
377*57718be8SEnji Cooper }
378*57718be8SEnji Cooper 
379*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div80000000_k, tc)
380*57718be8SEnji Cooper {
381*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
382*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
383*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
384*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
385*57718be8SEnji Cooper 	};
386*57718be8SEnji Cooper 
387*57718be8SEnji Cooper 	bpfjit_func_t code;
388*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
389*57718be8SEnji Cooper 
390*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
391*57718be8SEnji Cooper 
392*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
393*57718be8SEnji Cooper 
394*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
395*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
396*57718be8SEnji Cooper 
397*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
398*57718be8SEnji Cooper 
399*57718be8SEnji Cooper 	bpfjit_free_code(code);
400*57718be8SEnji Cooper }
401*57718be8SEnji Cooper 
402*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_and_k);
403*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_and_k, tc)
404*57718be8SEnji Cooper {
405*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
406*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
407*57718be8SEnji Cooper }
408*57718be8SEnji Cooper 
409*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_and_k, tc)
410*57718be8SEnji Cooper {
411*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
412*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
413*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
414*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
415*57718be8SEnji Cooper 	};
416*57718be8SEnji Cooper 
417*57718be8SEnji Cooper 	bpfjit_func_t code;
418*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
419*57718be8SEnji Cooper 
420*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
421*57718be8SEnji Cooper 
422*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
423*57718be8SEnji Cooper 
424*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
425*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
426*57718be8SEnji Cooper 
427*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
428*57718be8SEnji Cooper 
429*57718be8SEnji Cooper 	bpfjit_free_code(code);
430*57718be8SEnji Cooper }
431*57718be8SEnji Cooper 
432*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_or_k);
433*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_or_k, tc)
434*57718be8SEnji Cooper {
435*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
436*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
437*57718be8SEnji Cooper }
438*57718be8SEnji Cooper 
439*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_or_k, tc)
440*57718be8SEnji Cooper {
441*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
442*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
443*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
444*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
445*57718be8SEnji Cooper 	};
446*57718be8SEnji Cooper 
447*57718be8SEnji Cooper 	bpfjit_func_t code;
448*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
449*57718be8SEnji Cooper 
450*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
451*57718be8SEnji Cooper 
452*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
453*57718be8SEnji Cooper 
454*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
455*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
456*57718be8SEnji Cooper 
457*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
458*57718be8SEnji Cooper 
459*57718be8SEnji Cooper 	bpfjit_free_code(code);
460*57718be8SEnji Cooper }
461*57718be8SEnji Cooper 
462*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh_k);
463*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh_k, tc)
464*57718be8SEnji Cooper {
465*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
466*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
467*57718be8SEnji Cooper }
468*57718be8SEnji Cooper 
469*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh_k, tc)
470*57718be8SEnji Cooper {
471*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
472*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
473*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
474*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
475*57718be8SEnji Cooper 	};
476*57718be8SEnji Cooper 
477*57718be8SEnji Cooper 	bpfjit_func_t code;
478*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
479*57718be8SEnji Cooper 
480*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
481*57718be8SEnji Cooper 
482*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
483*57718be8SEnji Cooper 
484*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
485*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
486*57718be8SEnji Cooper 
487*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
488*57718be8SEnji Cooper 
489*57718be8SEnji Cooper 	bpfjit_free_code(code);
490*57718be8SEnji Cooper }
491*57718be8SEnji Cooper 
492*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh0_k);
493*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh0_k, tc)
494*57718be8SEnji Cooper {
495*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
496*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
497*57718be8SEnji Cooper }
498*57718be8SEnji Cooper 
499*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh0_k, tc)
500*57718be8SEnji Cooper {
501*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
502*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
503*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
504*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
505*57718be8SEnji Cooper 	};
506*57718be8SEnji Cooper 
507*57718be8SEnji Cooper 	bpfjit_func_t code;
508*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
509*57718be8SEnji Cooper 
510*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
511*57718be8SEnji Cooper 
512*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
513*57718be8SEnji Cooper 
514*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
515*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
516*57718be8SEnji Cooper 
517*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
518*57718be8SEnji Cooper 
519*57718be8SEnji Cooper 	bpfjit_free_code(code);
520*57718be8SEnji Cooper }
521*57718be8SEnji Cooper 
522*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh_k);
523*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh_k, tc)
524*57718be8SEnji Cooper {
525*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
526*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
527*57718be8SEnji Cooper }
528*57718be8SEnji Cooper 
529*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh_k, tc)
530*57718be8SEnji Cooper {
531*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
532*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
533*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
534*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
535*57718be8SEnji Cooper 	};
536*57718be8SEnji Cooper 
537*57718be8SEnji Cooper 	bpfjit_func_t code;
538*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
539*57718be8SEnji Cooper 
540*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
541*57718be8SEnji Cooper 
542*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
543*57718be8SEnji Cooper 
544*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
545*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
546*57718be8SEnji Cooper 
547*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
548*57718be8SEnji Cooper 
549*57718be8SEnji Cooper 	bpfjit_free_code(code);
550*57718be8SEnji Cooper }
551*57718be8SEnji Cooper 
552*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh0_k);
553*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh0_k, tc)
554*57718be8SEnji Cooper {
555*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
556*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
557*57718be8SEnji Cooper }
558*57718be8SEnji Cooper 
559*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh0_k, tc)
560*57718be8SEnji Cooper {
561*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
562*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
563*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
564*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
565*57718be8SEnji Cooper 	};
566*57718be8SEnji Cooper 
567*57718be8SEnji Cooper 	bpfjit_func_t code;
568*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
569*57718be8SEnji Cooper 
570*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
571*57718be8SEnji Cooper 
572*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
573*57718be8SEnji Cooper 
574*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
575*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
576*57718be8SEnji Cooper 
577*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
578*57718be8SEnji Cooper 
579*57718be8SEnji Cooper 	bpfjit_free_code(code);
580*57718be8SEnji Cooper }
581*57718be8SEnji Cooper 
582*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_modulo_k);
583*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_modulo_k, tc)
584*57718be8SEnji Cooper {
585*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
586*57718be8SEnji Cooper 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
587*57718be8SEnji Cooper }
588*57718be8SEnji Cooper 
589*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_modulo_k, tc)
590*57718be8SEnji Cooper {
591*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
592*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
593*57718be8SEnji Cooper 
594*57718be8SEnji Cooper 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
595*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
596*57718be8SEnji Cooper 
597*57718be8SEnji Cooper 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
598*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
599*57718be8SEnji Cooper 
600*57718be8SEnji Cooper 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
601*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
602*57718be8SEnji Cooper 
603*57718be8SEnji Cooper 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
604*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
605*57718be8SEnji Cooper 
606*57718be8SEnji Cooper 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
607*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
608*57718be8SEnji Cooper 
609*57718be8SEnji Cooper 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
610*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
611*57718be8SEnji Cooper 
612*57718be8SEnji Cooper 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
613*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
614*57718be8SEnji Cooper 
615*57718be8SEnji Cooper 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
616*57718be8SEnji Cooper 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
617*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
618*57718be8SEnji Cooper 
619*57718be8SEnji Cooper 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
620*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
621*57718be8SEnji Cooper 
622*57718be8SEnji Cooper 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
623*57718be8SEnji Cooper 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
624*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
625*57718be8SEnji Cooper 
626*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
627*57718be8SEnji Cooper 	};
628*57718be8SEnji Cooper 
629*57718be8SEnji Cooper 	bpfjit_func_t code;
630*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
631*57718be8SEnji Cooper 
632*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
633*57718be8SEnji Cooper 
634*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
635*57718be8SEnji Cooper 
636*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
637*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
638*57718be8SEnji Cooper 
639*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
640*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
641*57718be8SEnji Cooper 
642*57718be8SEnji Cooper 
643*57718be8SEnji Cooper 	bpfjit_free_code(code);
644*57718be8SEnji Cooper }
645*57718be8SEnji Cooper 
646*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_add_x);
647*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_add_x, tc)
648*57718be8SEnji Cooper {
649*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
650*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
651*57718be8SEnji Cooper }
652*57718be8SEnji Cooper 
653*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_add_x, tc)
654*57718be8SEnji Cooper {
655*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
656*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 3),
657*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
658*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
659*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
660*57718be8SEnji Cooper 	};
661*57718be8SEnji Cooper 
662*57718be8SEnji Cooper 	bpfjit_func_t code;
663*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
664*57718be8SEnji Cooper 
665*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
666*57718be8SEnji Cooper 
667*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
668*57718be8SEnji Cooper 
669*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
670*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
671*57718be8SEnji Cooper 
672*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
673*57718be8SEnji Cooper 
674*57718be8SEnji Cooper 	bpfjit_free_code(code);
675*57718be8SEnji Cooper }
676*57718be8SEnji Cooper 
677*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_sub_x);
678*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_sub_x, tc)
679*57718be8SEnji Cooper {
680*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
681*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
682*57718be8SEnji Cooper }
683*57718be8SEnji Cooper 
684*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_sub_x, tc)
685*57718be8SEnji Cooper {
686*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
687*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 1),
688*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
689*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
690*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
691*57718be8SEnji Cooper 	};
692*57718be8SEnji Cooper 
693*57718be8SEnji Cooper 	bpfjit_func_t code;
694*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
695*57718be8SEnji Cooper 
696*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
697*57718be8SEnji Cooper 
698*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
699*57718be8SEnji Cooper 
700*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
701*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
702*57718be8SEnji Cooper 
703*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
704*57718be8SEnji Cooper 
705*57718be8SEnji Cooper 	bpfjit_free_code(code);
706*57718be8SEnji Cooper }
707*57718be8SEnji Cooper 
708*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_mul_x);
709*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mul_x, tc)
710*57718be8SEnji Cooper {
711*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
712*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
713*57718be8SEnji Cooper }
714*57718be8SEnji Cooper 
715*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mul_x, tc)
716*57718be8SEnji Cooper {
717*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
718*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
719*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
720*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
721*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
722*57718be8SEnji Cooper 	};
723*57718be8SEnji Cooper 
724*57718be8SEnji Cooper 	bpfjit_func_t code;
725*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
726*57718be8SEnji Cooper 
727*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
728*57718be8SEnji Cooper 
729*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
730*57718be8SEnji Cooper 
731*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
732*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
733*57718be8SEnji Cooper 
734*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
735*57718be8SEnji Cooper 
736*57718be8SEnji Cooper 	bpfjit_free_code(code);
737*57718be8SEnji Cooper }
738*57718be8SEnji Cooper 
739*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div0_x);
740*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div0_x, tc)
741*57718be8SEnji Cooper {
742*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
743*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
744*57718be8SEnji Cooper }
745*57718be8SEnji Cooper 
746*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div0_x, tc)
747*57718be8SEnji Cooper {
748*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
749*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
750*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
751*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
752*57718be8SEnji Cooper 	};
753*57718be8SEnji Cooper 
754*57718be8SEnji Cooper 	bpfjit_func_t code;
755*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
756*57718be8SEnji Cooper 
757*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
758*57718be8SEnji Cooper 
759*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
760*57718be8SEnji Cooper 
761*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
762*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
763*57718be8SEnji Cooper 
764*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
765*57718be8SEnji Cooper 
766*57718be8SEnji Cooper 	bpfjit_free_code(code);
767*57718be8SEnji Cooper }
768*57718be8SEnji Cooper 
769*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div1_x);
770*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div1_x, tc)
771*57718be8SEnji Cooper {
772*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
773*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
774*57718be8SEnji Cooper }
775*57718be8SEnji Cooper 
776*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div1_x, tc)
777*57718be8SEnji Cooper {
778*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
779*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 7),
780*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
781*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
782*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
783*57718be8SEnji Cooper 	};
784*57718be8SEnji Cooper 
785*57718be8SEnji Cooper 	bpfjit_func_t code;
786*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
787*57718be8SEnji Cooper 
788*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
789*57718be8SEnji Cooper 
790*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
791*57718be8SEnji Cooper 
792*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
793*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
794*57718be8SEnji Cooper 
795*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
796*57718be8SEnji Cooper 
797*57718be8SEnji Cooper 	bpfjit_free_code(code);
798*57718be8SEnji Cooper }
799*57718be8SEnji Cooper 
800*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div2_x);
801*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div2_x, tc)
802*57718be8SEnji Cooper {
803*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
804*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
805*57718be8SEnji Cooper }
806*57718be8SEnji Cooper 
807*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div2_x, tc)
808*57718be8SEnji Cooper {
809*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
810*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 7),
811*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
812*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
813*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
814*57718be8SEnji Cooper 	};
815*57718be8SEnji Cooper 
816*57718be8SEnji Cooper 	bpfjit_func_t code;
817*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
818*57718be8SEnji Cooper 
819*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
820*57718be8SEnji Cooper 
821*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
822*57718be8SEnji Cooper 
823*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
824*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
825*57718be8SEnji Cooper 
826*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
827*57718be8SEnji Cooper 
828*57718be8SEnji Cooper 	bpfjit_free_code(code);
829*57718be8SEnji Cooper }
830*57718be8SEnji Cooper 
831*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div4_x);
832*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div4_x, tc)
833*57718be8SEnji Cooper {
834*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
835*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
836*57718be8SEnji Cooper }
837*57718be8SEnji Cooper 
838*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div4_x, tc)
839*57718be8SEnji Cooper {
840*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
841*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
842*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
843*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
844*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
845*57718be8SEnji Cooper 	};
846*57718be8SEnji Cooper 
847*57718be8SEnji Cooper 	bpfjit_func_t code;
848*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
849*57718be8SEnji Cooper 
850*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
851*57718be8SEnji Cooper 
852*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
853*57718be8SEnji Cooper 
854*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
855*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
856*57718be8SEnji Cooper 
857*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
858*57718be8SEnji Cooper 
859*57718be8SEnji Cooper 	bpfjit_free_code(code);
860*57718be8SEnji Cooper }
861*57718be8SEnji Cooper 
862*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10_x);
863*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10_x, tc)
864*57718be8SEnji Cooper {
865*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
866*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
867*57718be8SEnji Cooper }
868*57718be8SEnji Cooper 
869*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10_x, tc)
870*57718be8SEnji Cooper {
871*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
872*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
873*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
874*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
875*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
876*57718be8SEnji Cooper 	};
877*57718be8SEnji Cooper 
878*57718be8SEnji Cooper 	bpfjit_func_t code;
879*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
880*57718be8SEnji Cooper 
881*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
882*57718be8SEnji Cooper 
883*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
884*57718be8SEnji Cooper 
885*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
886*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
887*57718be8SEnji Cooper 
888*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
889*57718be8SEnji Cooper 
890*57718be8SEnji Cooper 	bpfjit_free_code(code);
891*57718be8SEnji Cooper }
892*57718be8SEnji Cooper 
893*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10000_x);
894*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10000_x, tc)
895*57718be8SEnji Cooper {
896*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
897*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
898*57718be8SEnji Cooper }
899*57718be8SEnji Cooper 
900*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10000_x, tc)
901*57718be8SEnji Cooper {
902*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
903*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
904*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
905*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
906*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
907*57718be8SEnji Cooper 	};
908*57718be8SEnji Cooper 
909*57718be8SEnji Cooper 	bpfjit_func_t code;
910*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
911*57718be8SEnji Cooper 
912*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
913*57718be8SEnji Cooper 
914*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
915*57718be8SEnji Cooper 
916*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
917*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
918*57718be8SEnji Cooper 
919*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
920*57718be8SEnji Cooper 
921*57718be8SEnji Cooper 	bpfjit_free_code(code);
922*57718be8SEnji Cooper }
923*57718be8SEnji Cooper 
924*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div7609801_x);
925*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div7609801_x, tc)
926*57718be8SEnji Cooper {
927*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
928*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
929*57718be8SEnji Cooper }
930*57718be8SEnji Cooper 
931*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div7609801_x, tc)
932*57718be8SEnji Cooper {
933*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
934*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
935*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
936*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
937*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
938*57718be8SEnji Cooper 	};
939*57718be8SEnji Cooper 
940*57718be8SEnji Cooper 	bpfjit_func_t code;
941*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
942*57718be8SEnji Cooper 
943*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
944*57718be8SEnji Cooper 
945*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
946*57718be8SEnji Cooper 
947*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
948*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
949*57718be8SEnji Cooper 
950*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
951*57718be8SEnji Cooper 
952*57718be8SEnji Cooper 	bpfjit_free_code(code);
953*57718be8SEnji Cooper }
954*57718be8SEnji Cooper 
955*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_div80000000_x);
956*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div80000000_x, tc)
957*57718be8SEnji Cooper {
958*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
959*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
960*57718be8SEnji Cooper }
961*57718be8SEnji Cooper 
962*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div80000000_x, tc)
963*57718be8SEnji Cooper {
964*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
965*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
966*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
967*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
968*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
969*57718be8SEnji Cooper 	};
970*57718be8SEnji Cooper 
971*57718be8SEnji Cooper 	bpfjit_func_t code;
972*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
973*57718be8SEnji Cooper 
974*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
975*57718be8SEnji Cooper 
976*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
977*57718be8SEnji Cooper 
978*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
979*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
980*57718be8SEnji Cooper 
981*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
982*57718be8SEnji Cooper 
983*57718be8SEnji Cooper 	bpfjit_free_code(code);
984*57718be8SEnji Cooper }
985*57718be8SEnji Cooper 
986*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_and_x);
987*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_and_x, tc)
988*57718be8SEnji Cooper {
989*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
990*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
991*57718be8SEnji Cooper }
992*57718be8SEnji Cooper 
993*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_and_x, tc)
994*57718be8SEnji Cooper {
995*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
996*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
997*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
998*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
999*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1000*57718be8SEnji Cooper 	};
1001*57718be8SEnji Cooper 
1002*57718be8SEnji Cooper 	bpfjit_func_t code;
1003*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1004*57718be8SEnji Cooper 
1005*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1006*57718be8SEnji Cooper 
1007*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1008*57718be8SEnji Cooper 
1009*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1010*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1011*57718be8SEnji Cooper 
1012*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
1013*57718be8SEnji Cooper 
1014*57718be8SEnji Cooper 	bpfjit_free_code(code);
1015*57718be8SEnji Cooper }
1016*57718be8SEnji Cooper 
1017*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_or_x);
1018*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_or_x, tc)
1019*57718be8SEnji Cooper {
1020*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1021*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1022*57718be8SEnji Cooper }
1023*57718be8SEnji Cooper 
1024*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_or_x, tc)
1025*57718be8SEnji Cooper {
1026*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1027*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1028*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1029*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1030*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1031*57718be8SEnji Cooper 	};
1032*57718be8SEnji Cooper 
1033*57718be8SEnji Cooper 	bpfjit_func_t code;
1034*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1035*57718be8SEnji Cooper 
1036*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1037*57718be8SEnji Cooper 
1038*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1039*57718be8SEnji Cooper 
1040*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1041*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1042*57718be8SEnji Cooper 
1043*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1044*57718be8SEnji Cooper 
1045*57718be8SEnji Cooper 	bpfjit_free_code(code);
1046*57718be8SEnji Cooper }
1047*57718be8SEnji Cooper 
1048*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh_x);
1049*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh_x, tc)
1050*57718be8SEnji Cooper {
1051*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1052*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1053*57718be8SEnji Cooper }
1054*57718be8SEnji Cooper 
1055*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh_x, tc)
1056*57718be8SEnji Cooper {
1057*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1058*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1059*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1060*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1061*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1062*57718be8SEnji Cooper 	};
1063*57718be8SEnji Cooper 
1064*57718be8SEnji Cooper 	bpfjit_func_t code;
1065*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1066*57718be8SEnji Cooper 
1067*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1068*57718be8SEnji Cooper 
1069*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1070*57718be8SEnji Cooper 
1071*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1072*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1073*57718be8SEnji Cooper 
1074*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
1075*57718be8SEnji Cooper 
1076*57718be8SEnji Cooper 	bpfjit_free_code(code);
1077*57718be8SEnji Cooper }
1078*57718be8SEnji Cooper 
1079*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh0_x);
1080*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh0_x, tc)
1081*57718be8SEnji Cooper {
1082*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1083*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1084*57718be8SEnji Cooper }
1085*57718be8SEnji Cooper 
1086*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh0_x, tc)
1087*57718be8SEnji Cooper {
1088*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1089*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1090*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1091*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1092*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1093*57718be8SEnji Cooper 	};
1094*57718be8SEnji Cooper 
1095*57718be8SEnji Cooper 	bpfjit_func_t code;
1096*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1097*57718be8SEnji Cooper 
1098*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1099*57718be8SEnji Cooper 
1100*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1101*57718be8SEnji Cooper 
1102*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1103*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1104*57718be8SEnji Cooper 
1105*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1106*57718be8SEnji Cooper 
1107*57718be8SEnji Cooper 	bpfjit_free_code(code);
1108*57718be8SEnji Cooper }
1109*57718be8SEnji Cooper 
1110*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh_x);
1111*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh_x, tc)
1112*57718be8SEnji Cooper {
1113*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1114*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1115*57718be8SEnji Cooper }
1116*57718be8SEnji Cooper 
1117*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh_x, tc)
1118*57718be8SEnji Cooper {
1119*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1120*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1121*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1122*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1123*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1124*57718be8SEnji Cooper 	};
1125*57718be8SEnji Cooper 
1126*57718be8SEnji Cooper 	bpfjit_func_t code;
1127*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1128*57718be8SEnji Cooper 
1129*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1130*57718be8SEnji Cooper 
1131*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1132*57718be8SEnji Cooper 
1133*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1134*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1135*57718be8SEnji Cooper 
1136*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
1137*57718be8SEnji Cooper 
1138*57718be8SEnji Cooper 	bpfjit_free_code(code);
1139*57718be8SEnji Cooper }
1140*57718be8SEnji Cooper 
1141*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh0_x);
1142*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh0_x, tc)
1143*57718be8SEnji Cooper {
1144*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1145*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1146*57718be8SEnji Cooper }
1147*57718be8SEnji Cooper 
1148*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh0_x, tc)
1149*57718be8SEnji Cooper {
1150*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1151*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1152*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1153*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1154*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1155*57718be8SEnji Cooper 	};
1156*57718be8SEnji Cooper 
1157*57718be8SEnji Cooper 	bpfjit_func_t code;
1158*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1159*57718be8SEnji Cooper 
1160*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1161*57718be8SEnji Cooper 
1162*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1163*57718be8SEnji Cooper 
1164*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1165*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1166*57718be8SEnji Cooper 
1167*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1168*57718be8SEnji Cooper 
1169*57718be8SEnji Cooper 	bpfjit_free_code(code);
1170*57718be8SEnji Cooper }
1171*57718be8SEnji Cooper 
1172*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_modulo_x);
1173*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_modulo_x, tc)
1174*57718be8SEnji Cooper {
1175*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1176*57718be8SEnji Cooper 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1177*57718be8SEnji Cooper }
1178*57718be8SEnji Cooper 
1179*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_modulo_x, tc)
1180*57718be8SEnji Cooper {
1181*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1182*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1183*57718be8SEnji Cooper 
1184*57718be8SEnji Cooper 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1185*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1186*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1187*57718be8SEnji Cooper 
1188*57718be8SEnji Cooper 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1189*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1190*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1191*57718be8SEnji Cooper 
1192*57718be8SEnji Cooper 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1193*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1194*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1195*57718be8SEnji Cooper 
1196*57718be8SEnji Cooper 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1197*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1198*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1199*57718be8SEnji Cooper 
1200*57718be8SEnji Cooper 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1201*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1202*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1203*57718be8SEnji Cooper 
1204*57718be8SEnji Cooper 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1205*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1206*57718be8SEnji Cooper 
1207*57718be8SEnji Cooper 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1208*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1209*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1210*57718be8SEnji Cooper 
1211*57718be8SEnji Cooper 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1212*57718be8SEnji Cooper 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
1213*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1214*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1215*57718be8SEnji Cooper 
1216*57718be8SEnji Cooper 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1217*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1218*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1219*57718be8SEnji Cooper 
1220*57718be8SEnji Cooper 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1221*57718be8SEnji Cooper 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
1222*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1223*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1224*57718be8SEnji Cooper 
1225*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1226*57718be8SEnji Cooper 	};
1227*57718be8SEnji Cooper 
1228*57718be8SEnji Cooper 	bpfjit_func_t code;
1229*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1230*57718be8SEnji Cooper 
1231*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1232*57718be8SEnji Cooper 
1233*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1234*57718be8SEnji Cooper 
1235*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1236*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1237*57718be8SEnji Cooper 
1238*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1239*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
1240*57718be8SEnji Cooper 
1241*57718be8SEnji Cooper 
1242*57718be8SEnji Cooper 	bpfjit_free_code(code);
1243*57718be8SEnji Cooper }
1244*57718be8SEnji Cooper 
1245*57718be8SEnji Cooper ATF_TC(libbpfjit_alu_neg);
1246*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_neg, tc)
1247*57718be8SEnji Cooper {
1248*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1249*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ALU+BPF_NEG");
1250*57718be8SEnji Cooper }
1251*57718be8SEnji Cooper 
1252*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_neg, tc)
1253*57718be8SEnji Cooper {
1254*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1255*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 777),
1256*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1257*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
1258*57718be8SEnji Cooper 	};
1259*57718be8SEnji Cooper 
1260*57718be8SEnji Cooper 	bpfjit_func_t code;
1261*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1262*57718be8SEnji Cooper 
1263*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1264*57718be8SEnji Cooper 
1265*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1266*57718be8SEnji Cooper 
1267*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1268*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1269*57718be8SEnji Cooper 
1270*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0u-777u);
1271*57718be8SEnji Cooper 
1272*57718be8SEnji Cooper 	bpfjit_free_code(code);
1273*57718be8SEnji Cooper }
1274*57718be8SEnji Cooper 
1275*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_ja);
1276*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_ja, tc)
1277*57718be8SEnji Cooper {
1278*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1279*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JA");
1280*57718be8SEnji Cooper }
1281*57718be8SEnji Cooper 
1282*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_ja, tc)
1283*57718be8SEnji Cooper {
1284*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1285*57718be8SEnji Cooper 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1286*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1287*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1288*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1289*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1290*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1291*57718be8SEnji Cooper 	};
1292*57718be8SEnji Cooper 
1293*57718be8SEnji Cooper 	bpfjit_func_t code;
1294*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1295*57718be8SEnji Cooper 
1296*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1297*57718be8SEnji Cooper 
1298*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1299*57718be8SEnji Cooper 
1300*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1301*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1302*57718be8SEnji Cooper 
1303*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1304*57718be8SEnji Cooper 
1305*57718be8SEnji Cooper 	bpfjit_free_code(code);
1306*57718be8SEnji Cooper }
1307*57718be8SEnji Cooper 
1308*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jgt_k);
1309*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
1310*57718be8SEnji Cooper {
1311*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1312*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1313*57718be8SEnji Cooper }
1314*57718be8SEnji Cooper 
1315*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
1316*57718be8SEnji Cooper {
1317*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1318*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1319*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1320*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1321*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1322*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1323*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1324*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1325*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1326*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1327*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1328*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1329*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1330*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1331*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1332*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1333*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1334*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1335*57718be8SEnji Cooper 	};
1336*57718be8SEnji Cooper 
1337*57718be8SEnji Cooper 	bpfjit_func_t code;
1338*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1339*57718be8SEnji Cooper 
1340*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1341*57718be8SEnji Cooper 
1342*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1343*57718be8SEnji Cooper 
1344*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1345*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1346*57718be8SEnji Cooper 
1347*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1348*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1349*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1350*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1351*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1352*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1353*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1354*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1355*57718be8SEnji Cooper 
1356*57718be8SEnji Cooper 	bpfjit_free_code(code);
1357*57718be8SEnji Cooper }
1358*57718be8SEnji Cooper 
1359*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jge_k);
1360*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
1361*57718be8SEnji Cooper {
1362*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1363*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1364*57718be8SEnji Cooper }
1365*57718be8SEnji Cooper 
1366*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
1367*57718be8SEnji Cooper {
1368*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1369*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1370*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1371*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1372*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1373*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1374*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1375*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1376*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1377*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1378*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1379*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1380*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1381*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1382*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1383*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1384*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1385*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1386*57718be8SEnji Cooper 	};
1387*57718be8SEnji Cooper 
1388*57718be8SEnji Cooper 	bpfjit_func_t code;
1389*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1390*57718be8SEnji Cooper 
1391*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1392*57718be8SEnji Cooper 
1393*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1394*57718be8SEnji Cooper 
1395*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1396*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1397*57718be8SEnji Cooper 
1398*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1399*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1400*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1401*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1402*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1403*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1404*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1405*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1406*57718be8SEnji Cooper 
1407*57718be8SEnji Cooper 	bpfjit_free_code(code);
1408*57718be8SEnji Cooper }
1409*57718be8SEnji Cooper 
1410*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_k);
1411*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
1412*57718be8SEnji Cooper {
1413*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1414*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1415*57718be8SEnji Cooper }
1416*57718be8SEnji Cooper 
1417*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
1418*57718be8SEnji Cooper {
1419*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1420*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1421*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1422*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1423*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1424*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1425*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1426*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1427*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1428*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1429*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1430*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1431*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1432*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1433*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1434*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1435*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1436*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1437*57718be8SEnji Cooper 	};
1438*57718be8SEnji Cooper 
1439*57718be8SEnji Cooper 	bpfjit_func_t code;
1440*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1441*57718be8SEnji Cooper 
1442*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1443*57718be8SEnji Cooper 
1444*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1445*57718be8SEnji Cooper 
1446*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1447*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1448*57718be8SEnji Cooper 
1449*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1450*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1451*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1452*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1453*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1454*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1455*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1456*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1457*57718be8SEnji Cooper 
1458*57718be8SEnji Cooper 	bpfjit_free_code(code);
1459*57718be8SEnji Cooper }
1460*57718be8SEnji Cooper 
1461*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jset_k);
1462*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
1463*57718be8SEnji Cooper {
1464*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1465*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1466*57718be8SEnji Cooper }
1467*57718be8SEnji Cooper 
1468*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
1469*57718be8SEnji Cooper {
1470*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1471*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1472*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1473*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1474*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1475*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1476*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1477*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1478*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1479*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1480*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1481*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1482*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1483*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1484*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1485*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1486*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1487*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1488*57718be8SEnji Cooper 	};
1489*57718be8SEnji Cooper 
1490*57718be8SEnji Cooper 	bpfjit_func_t code;
1491*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1492*57718be8SEnji Cooper 
1493*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1494*57718be8SEnji Cooper 
1495*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1496*57718be8SEnji Cooper 
1497*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1498*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1499*57718be8SEnji Cooper 
1500*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1501*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1502*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1503*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1504*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1505*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1506*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1507*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1508*57718be8SEnji Cooper 
1509*57718be8SEnji Cooper 	bpfjit_free_code(code);
1510*57718be8SEnji Cooper }
1511*57718be8SEnji Cooper 
1512*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_modulo_k);
1513*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
1514*57718be8SEnji Cooper {
1515*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1516*57718be8SEnji Cooper 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1517*57718be8SEnji Cooper }
1518*57718be8SEnji Cooper 
1519*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
1520*57718be8SEnji Cooper {
1521*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1522*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1523*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1524*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1525*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1526*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1527*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1528*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1529*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1530*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1531*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1532*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1533*57718be8SEnji Cooper 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1534*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1535*57718be8SEnji Cooper 
1536*57718be8SEnji Cooper 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1537*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1538*57718be8SEnji Cooper 
1539*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1540*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1541*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1542*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1543*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1544*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1545*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1546*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1547*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1548*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1549*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7)
1550*57718be8SEnji Cooper 	};
1551*57718be8SEnji Cooper 
1552*57718be8SEnji Cooper 	bpfjit_func_t code;
1553*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1554*57718be8SEnji Cooper 
1555*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1556*57718be8SEnji Cooper 
1557*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1558*57718be8SEnji Cooper 
1559*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1560*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1561*57718be8SEnji Cooper 
1562*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1563*57718be8SEnji Cooper 
1564*57718be8SEnji Cooper 	bpfjit_free_code(code);
1565*57718be8SEnji Cooper }
1566*57718be8SEnji Cooper 
1567*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jgt_x);
1568*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
1569*57718be8SEnji Cooper {
1570*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1571*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1572*57718be8SEnji Cooper }
1573*57718be8SEnji Cooper 
1574*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
1575*57718be8SEnji Cooper {
1576*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1577*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1578*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1579*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1580*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1581*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1582*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1583*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1584*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1585*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1586*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1587*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1588*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1589*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1590*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1591*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1592*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1593*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1594*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1595*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1596*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1597*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1598*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1599*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1600*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1601*57718be8SEnji Cooper 	};
1602*57718be8SEnji Cooper 
1603*57718be8SEnji Cooper 	bpfjit_func_t code;
1604*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1605*57718be8SEnji Cooper 
1606*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1607*57718be8SEnji Cooper 
1608*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1609*57718be8SEnji Cooper 
1610*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1611*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1612*57718be8SEnji Cooper 
1613*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1614*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1615*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1616*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1617*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1618*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1619*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1620*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1621*57718be8SEnji Cooper 
1622*57718be8SEnji Cooper 	bpfjit_free_code(code);
1623*57718be8SEnji Cooper }
1624*57718be8SEnji Cooper 
1625*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jge_x);
1626*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
1627*57718be8SEnji Cooper {
1628*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1629*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1630*57718be8SEnji Cooper }
1631*57718be8SEnji Cooper 
1632*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
1633*57718be8SEnji Cooper {
1634*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1635*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1636*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1637*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1638*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1639*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1640*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1641*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1642*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1643*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1644*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1645*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1646*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1647*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1648*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1649*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1650*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1651*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1652*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1653*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1654*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1655*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1656*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1657*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1658*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1659*57718be8SEnji Cooper 	};
1660*57718be8SEnji Cooper 
1661*57718be8SEnji Cooper 	bpfjit_func_t code;
1662*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1663*57718be8SEnji Cooper 
1664*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1665*57718be8SEnji Cooper 
1666*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1667*57718be8SEnji Cooper 
1668*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1669*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1670*57718be8SEnji Cooper 
1671*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1672*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1673*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1674*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1675*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1676*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1677*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1678*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1679*57718be8SEnji Cooper 
1680*57718be8SEnji Cooper 	bpfjit_free_code(code);
1681*57718be8SEnji Cooper }
1682*57718be8SEnji Cooper 
1683*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_x);
1684*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
1685*57718be8SEnji Cooper {
1686*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1687*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1688*57718be8SEnji Cooper }
1689*57718be8SEnji Cooper 
1690*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
1691*57718be8SEnji Cooper {
1692*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1693*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1694*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1695*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1696*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1697*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1698*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1699*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1700*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1701*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1702*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1703*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1704*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1705*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1706*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1707*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1708*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1709*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1710*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1711*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1712*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1713*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1714*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1715*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1716*57718be8SEnji Cooper 	};
1717*57718be8SEnji Cooper 
1718*57718be8SEnji Cooper 	bpfjit_func_t code;
1719*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1720*57718be8SEnji Cooper 
1721*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1722*57718be8SEnji Cooper 
1723*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1724*57718be8SEnji Cooper 
1725*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1726*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1727*57718be8SEnji Cooper 
1728*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1729*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1730*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1731*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1732*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1733*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1734*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1735*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1736*57718be8SEnji Cooper 
1737*57718be8SEnji Cooper 	bpfjit_free_code(code);
1738*57718be8SEnji Cooper }
1739*57718be8SEnji Cooper 
1740*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jset_x);
1741*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
1742*57718be8SEnji Cooper {
1743*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1744*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1745*57718be8SEnji Cooper }
1746*57718be8SEnji Cooper 
1747*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
1748*57718be8SEnji Cooper {
1749*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1750*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1751*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1752*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1753*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1754*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1755*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1756*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1757*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1758*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1759*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1760*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1761*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1762*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1763*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1764*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1765*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1766*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1767*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1768*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1769*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1770*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1771*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
1772*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 8)
1773*57718be8SEnji Cooper 	};
1774*57718be8SEnji Cooper 
1775*57718be8SEnji Cooper 	bpfjit_func_t code;
1776*57718be8SEnji Cooper 	uint8_t pkt[8]; /* the program doesn't read any data */
1777*57718be8SEnji Cooper 
1778*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1779*57718be8SEnji Cooper 
1780*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1781*57718be8SEnji Cooper 
1782*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1783*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1784*57718be8SEnji Cooper 
1785*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1786*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1787*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1788*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1789*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1790*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1791*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1792*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1793*57718be8SEnji Cooper 
1794*57718be8SEnji Cooper 	bpfjit_free_code(code);
1795*57718be8SEnji Cooper }
1796*57718be8SEnji Cooper 
1797*57718be8SEnji Cooper ATF_TC(libbpfjit_jmp_modulo_x);
1798*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
1799*57718be8SEnji Cooper {
1800*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1801*57718be8SEnji Cooper 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1802*57718be8SEnji Cooper }
1803*57718be8SEnji Cooper 
1804*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
1805*57718be8SEnji Cooper {
1806*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
1807*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1808*57718be8SEnji Cooper 		/* FFFFF770 << 4 = FFFFF770 */
1809*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1810*57718be8SEnji Cooper 
1811*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1812*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1813*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
1814*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1815*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
1816*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1817*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1818*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
1819*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1820*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1821*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1822*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1823*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1824*57718be8SEnji Cooper 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1825*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
1826*57718be8SEnji Cooper 
1827*57718be8SEnji Cooper 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1828*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1829*57718be8SEnji Cooper 
1830*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1831*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1832*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 4),
1833*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1834*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 5),
1835*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1836*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1837*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 6),
1838*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1839*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1840*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1841*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1842*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1843*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1844*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7)
1845*57718be8SEnji Cooper 	};
1846*57718be8SEnji Cooper 
1847*57718be8SEnji Cooper 	bpfjit_func_t code;
1848*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
1849*57718be8SEnji Cooper 
1850*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1851*57718be8SEnji Cooper 
1852*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
1853*57718be8SEnji Cooper 
1854*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
1855*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
1856*57718be8SEnji Cooper 
1857*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1858*57718be8SEnji Cooper 
1859*57718be8SEnji Cooper 	bpfjit_free_code(code);
1860*57718be8SEnji Cooper }
1861*57718be8SEnji Cooper 
1862*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_abs);
1863*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_abs, tc)
1864*57718be8SEnji Cooper {
1865*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1866*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_ABS");
1867*57718be8SEnji Cooper }
1868*57718be8SEnji Cooper 
1869*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_abs, tc)
1870*57718be8SEnji Cooper {
1871*57718be8SEnji Cooper 	static struct bpf_insn insns[3][2] = {
1872*57718be8SEnji Cooper 		{
1873*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1874*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
1875*57718be8SEnji Cooper 		},
1876*57718be8SEnji Cooper 		{
1877*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1878*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
1879*57718be8SEnji Cooper 		},
1880*57718be8SEnji Cooper 		{
1881*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1882*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
1883*57718be8SEnji Cooper 		}
1884*57718be8SEnji Cooper 	};
1885*57718be8SEnji Cooper 
1886*57718be8SEnji Cooper 	static size_t lengths[3] = { 1, 2, 4 };
1887*57718be8SEnji Cooper 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1888*57718be8SEnji Cooper 
1889*57718be8SEnji Cooper 	size_t i, l;
1890*57718be8SEnji Cooper 	uint8_t *pkt = deadbeef_at_5;
1891*57718be8SEnji Cooper 	size_t pktsize = sizeof(deadbeef_at_5);
1892*57718be8SEnji Cooper 
1893*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1894*57718be8SEnji Cooper 
1895*57718be8SEnji Cooper 	for (i = 0; i < 3; i++) {
1896*57718be8SEnji Cooper 		bpfjit_func_t code;
1897*57718be8SEnji Cooper 
1898*57718be8SEnji Cooper 		ATF_CHECK(bpf_validate(insns[i], insn_count));
1899*57718be8SEnji Cooper 
1900*57718be8SEnji Cooper 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
1901*57718be8SEnji Cooper 		ATF_REQUIRE(code != NULL);
1902*57718be8SEnji Cooper 
1903*57718be8SEnji Cooper 		for (l = 1; l < 5 + lengths[i]; l++) {
1904*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
1905*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
1906*57718be8SEnji Cooper 		}
1907*57718be8SEnji Cooper 
1908*57718be8SEnji Cooper 		l = 5 + lengths[i];
1909*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1910*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
1911*57718be8SEnji Cooper 
1912*57718be8SEnji Cooper 		l = pktsize;
1913*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1914*57718be8SEnji Cooper 
1915*57718be8SEnji Cooper 		bpfjit_free_code(code);
1916*57718be8SEnji Cooper 	}
1917*57718be8SEnji Cooper }
1918*57718be8SEnji Cooper 
1919*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_abs_k_overflow);
1920*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
1921*57718be8SEnji Cooper {
1922*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
1923*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1924*57718be8SEnji Cooper }
1925*57718be8SEnji Cooper 
1926*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
1927*57718be8SEnji Cooper {
1928*57718be8SEnji Cooper 	static struct bpf_insn insns[12][3] = {
1929*57718be8SEnji Cooper 		{
1930*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1931*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1932*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1933*57718be8SEnji Cooper 		},
1934*57718be8SEnji Cooper 		{
1935*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1936*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1937*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1938*57718be8SEnji Cooper 		},
1939*57718be8SEnji Cooper 		{
1940*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1941*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1942*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1943*57718be8SEnji Cooper 		},
1944*57718be8SEnji Cooper 		{
1945*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1946*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1947*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1948*57718be8SEnji Cooper 		},
1949*57718be8SEnji Cooper 		{
1950*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1951*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1952*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1953*57718be8SEnji Cooper 		},
1954*57718be8SEnji Cooper 		{
1955*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1956*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1957*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1958*57718be8SEnji Cooper 		},
1959*57718be8SEnji Cooper 		{
1960*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1961*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1962*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1963*57718be8SEnji Cooper 		},
1964*57718be8SEnji Cooper 		{
1965*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1966*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1967*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1968*57718be8SEnji Cooper 		},
1969*57718be8SEnji Cooper 		{
1970*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1971*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1972*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1973*57718be8SEnji Cooper 		},
1974*57718be8SEnji Cooper 		{
1975*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1976*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1977*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1978*57718be8SEnji Cooper 		},
1979*57718be8SEnji Cooper 		{
1980*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1981*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1982*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1983*57718be8SEnji Cooper 		},
1984*57718be8SEnji Cooper 		{
1985*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1986*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1987*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
1988*57718be8SEnji Cooper 		}
1989*57718be8SEnji Cooper 	};
1990*57718be8SEnji Cooper 
1991*57718be8SEnji Cooper 	int i;
1992*57718be8SEnji Cooper 	uint8_t pkt[8] = { 0 };
1993*57718be8SEnji Cooper 
1994*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1995*57718be8SEnji Cooper 
1996*57718be8SEnji Cooper 	for (i = 0; i < 3; i++) {
1997*57718be8SEnji Cooper 		bpfjit_func_t code;
1998*57718be8SEnji Cooper 
1999*57718be8SEnji Cooper 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2000*57718be8SEnji Cooper 
2001*57718be8SEnji Cooper 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2002*57718be8SEnji Cooper 		ATF_REQUIRE(code != NULL);
2003*57718be8SEnji Cooper 
2004*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2005*57718be8SEnji Cooper 
2006*57718be8SEnji Cooper 		bpfjit_free_code(code);
2007*57718be8SEnji Cooper 	}
2008*57718be8SEnji Cooper }
2009*57718be8SEnji Cooper 
2010*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind);
2011*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind, tc)
2012*57718be8SEnji Cooper {
2013*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2014*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_IND");
2015*57718be8SEnji Cooper }
2016*57718be8SEnji Cooper 
2017*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind, tc)
2018*57718be8SEnji Cooper {
2019*57718be8SEnji Cooper 	static struct bpf_insn insns[6][3] = {
2020*57718be8SEnji Cooper 		{
2021*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2022*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2023*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2024*57718be8SEnji Cooper 		},
2025*57718be8SEnji Cooper 		{
2026*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2027*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2028*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2029*57718be8SEnji Cooper 		},
2030*57718be8SEnji Cooper 		{
2031*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2032*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2033*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2034*57718be8SEnji Cooper 		},
2035*57718be8SEnji Cooper 		{
2036*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2037*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2038*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2039*57718be8SEnji Cooper 		},
2040*57718be8SEnji Cooper 		{
2041*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2042*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2043*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2044*57718be8SEnji Cooper 		},
2045*57718be8SEnji Cooper 		{
2046*57718be8SEnji Cooper 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2047*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2048*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_A, 0)
2049*57718be8SEnji Cooper 		}
2050*57718be8SEnji Cooper 	};
2051*57718be8SEnji Cooper 
2052*57718be8SEnji Cooper 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2053*57718be8SEnji Cooper 
2054*57718be8SEnji Cooper 	static unsigned int expected[6] = {
2055*57718be8SEnji Cooper 		0xde, 0xdead, 0xdeadbeef,
2056*57718be8SEnji Cooper 		0xde, 0xdead, 0xdeadbeef
2057*57718be8SEnji Cooper 	};
2058*57718be8SEnji Cooper 
2059*57718be8SEnji Cooper 	size_t i, l;
2060*57718be8SEnji Cooper 	uint8_t *pkt = deadbeef_at_5;
2061*57718be8SEnji Cooper 	size_t pktsize = sizeof(deadbeef_at_5);
2062*57718be8SEnji Cooper 
2063*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2064*57718be8SEnji Cooper 
2065*57718be8SEnji Cooper 	for (i = 0; i < 3; i++) {
2066*57718be8SEnji Cooper 		bpfjit_func_t code;
2067*57718be8SEnji Cooper 
2068*57718be8SEnji Cooper 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2069*57718be8SEnji Cooper 
2070*57718be8SEnji Cooper 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2071*57718be8SEnji Cooper 		ATF_REQUIRE(code != NULL);
2072*57718be8SEnji Cooper 
2073*57718be8SEnji Cooper 		for (l = 1; l < 5 + lengths[i]; l++) {
2074*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2075*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2076*57718be8SEnji Cooper 		}
2077*57718be8SEnji Cooper 
2078*57718be8SEnji Cooper 		l = 5 + lengths[i];
2079*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2080*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2081*57718be8SEnji Cooper 
2082*57718be8SEnji Cooper 		l = pktsize;
2083*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2084*57718be8SEnji Cooper 
2085*57718be8SEnji Cooper 		bpfjit_free_code(code);
2086*57718be8SEnji Cooper 	}
2087*57718be8SEnji Cooper }
2088*57718be8SEnji Cooper 
2089*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_k_overflow);
2090*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
2091*57718be8SEnji Cooper {
2092*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2093*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2094*57718be8SEnji Cooper }
2095*57718be8SEnji Cooper 
2096*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
2097*57718be8SEnji Cooper {
2098*57718be8SEnji Cooper 	static struct bpf_insn insns[12][3] = {
2099*57718be8SEnji Cooper 		{
2100*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2101*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2102*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2103*57718be8SEnji Cooper 		},
2104*57718be8SEnji Cooper 		{
2105*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2106*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2107*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2108*57718be8SEnji Cooper 		},
2109*57718be8SEnji Cooper 		{
2110*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2111*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2112*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2113*57718be8SEnji Cooper 		},
2114*57718be8SEnji Cooper 		{
2115*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2116*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2117*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2118*57718be8SEnji Cooper 		},
2119*57718be8SEnji Cooper 		{
2120*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2121*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2122*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2123*57718be8SEnji Cooper 		},
2124*57718be8SEnji Cooper 		{
2125*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2126*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2127*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2128*57718be8SEnji Cooper 		},
2129*57718be8SEnji Cooper 		{
2130*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2131*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2132*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2133*57718be8SEnji Cooper 		},
2134*57718be8SEnji Cooper 		{
2135*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2136*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2137*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2138*57718be8SEnji Cooper 		},
2139*57718be8SEnji Cooper 		{
2140*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2141*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2142*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2143*57718be8SEnji Cooper 		},
2144*57718be8SEnji Cooper 		{
2145*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2146*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2147*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2148*57718be8SEnji Cooper 		},
2149*57718be8SEnji Cooper 		{
2150*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2151*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2152*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2153*57718be8SEnji Cooper 		},
2154*57718be8SEnji Cooper 		{
2155*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2156*57718be8SEnji Cooper 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2157*57718be8SEnji Cooper 			BPF_STMT(BPF_RET+BPF_K, 1)
2158*57718be8SEnji Cooper 		}
2159*57718be8SEnji Cooper 	};
2160*57718be8SEnji Cooper 
2161*57718be8SEnji Cooper 	int i;
2162*57718be8SEnji Cooper 	uint8_t pkt[8] = { 0 };
2163*57718be8SEnji Cooper 
2164*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2165*57718be8SEnji Cooper 
2166*57718be8SEnji Cooper 	for (i = 0; i < 3; i++) {
2167*57718be8SEnji Cooper 		bpfjit_func_t code;
2168*57718be8SEnji Cooper 
2169*57718be8SEnji Cooper 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2170*57718be8SEnji Cooper 
2171*57718be8SEnji Cooper 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2172*57718be8SEnji Cooper 		ATF_REQUIRE(code != NULL);
2173*57718be8SEnji Cooper 
2174*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2175*57718be8SEnji Cooper 
2176*57718be8SEnji Cooper 		bpfjit_free_code(code);
2177*57718be8SEnji Cooper 	}
2178*57718be8SEnji Cooper }
2179*57718be8SEnji Cooper 
2180*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_x_overflow1);
2181*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
2182*57718be8SEnji Cooper {
2183*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2184*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2185*57718be8SEnji Cooper }
2186*57718be8SEnji Cooper 
2187*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
2188*57718be8SEnji Cooper {
2189*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2190*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2191*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2192*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2193*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2194*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2195*57718be8SEnji Cooper 	};
2196*57718be8SEnji Cooper 
2197*57718be8SEnji Cooper 	size_t i;
2198*57718be8SEnji Cooper 	bpfjit_func_t code;
2199*57718be8SEnji Cooper 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2200*57718be8SEnji Cooper 
2201*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2202*57718be8SEnji Cooper 
2203*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2204*57718be8SEnji Cooper 
2205*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2206*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2207*57718be8SEnji Cooper 
2208*57718be8SEnji Cooper 	for (i = 1; i <= sizeof(pkt); i++) {
2209*57718be8SEnji Cooper 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2210*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2211*57718be8SEnji Cooper 	}
2212*57718be8SEnji Cooper 
2213*57718be8SEnji Cooper 	bpfjit_free_code(code);
2214*57718be8SEnji Cooper }
2215*57718be8SEnji Cooper 
2216*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_x_overflow2);
2217*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
2218*57718be8SEnji Cooper {
2219*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2220*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2221*57718be8SEnji Cooper }
2222*57718be8SEnji Cooper 
2223*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
2224*57718be8SEnji Cooper {
2225*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2226*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2227*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2228*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, 3),
2229*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2230*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2231*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2232*57718be8SEnji Cooper 	};
2233*57718be8SEnji Cooper 
2234*57718be8SEnji Cooper 	size_t i;
2235*57718be8SEnji Cooper 	bpfjit_func_t code;
2236*57718be8SEnji Cooper 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2237*57718be8SEnji Cooper 
2238*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2239*57718be8SEnji Cooper 
2240*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2241*57718be8SEnji Cooper 
2242*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2243*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2244*57718be8SEnji Cooper 
2245*57718be8SEnji Cooper 	for (i = 1; i <= sizeof(pkt); i++) {
2246*57718be8SEnji Cooper 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2247*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2248*57718be8SEnji Cooper 	}
2249*57718be8SEnji Cooper 
2250*57718be8SEnji Cooper 	bpfjit_free_code(code);
2251*57718be8SEnji Cooper }
2252*57718be8SEnji Cooper 
2253*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_len);
2254*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_len, tc)
2255*57718be8SEnji Cooper {
2256*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2257*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2258*57718be8SEnji Cooper }
2259*57718be8SEnji Cooper 
2260*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_len, tc)
2261*57718be8SEnji Cooper {
2262*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2263*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2264*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2265*57718be8SEnji Cooper 	};
2266*57718be8SEnji Cooper 
2267*57718be8SEnji Cooper 	size_t i;
2268*57718be8SEnji Cooper 	bpfjit_func_t code;
2269*57718be8SEnji Cooper 	uint8_t pkt[32]; /* the program doesn't read any data */
2270*57718be8SEnji Cooper 
2271*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2272*57718be8SEnji Cooper 
2273*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2274*57718be8SEnji Cooper 
2275*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2276*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2277*57718be8SEnji Cooper 
2278*57718be8SEnji Cooper 	for (i = 0; i < sizeof(pkt); i++)
2279*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2280*57718be8SEnji Cooper 
2281*57718be8SEnji Cooper 	bpfjit_free_code(code);
2282*57718be8SEnji Cooper }
2283*57718be8SEnji Cooper 
2284*57718be8SEnji Cooper ATF_TC(libbpfjit_ld_imm);
2285*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_imm, tc)
2286*57718be8SEnji Cooper {
2287*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2288*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LD+BPF_IMM");
2289*57718be8SEnji Cooper }
2290*57718be8SEnji Cooper 
2291*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_imm, tc)
2292*57718be8SEnji Cooper {
2293*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2294*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2295*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2296*57718be8SEnji Cooper 	};
2297*57718be8SEnji Cooper 
2298*57718be8SEnji Cooper 	bpfjit_func_t code;
2299*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2300*57718be8SEnji Cooper 
2301*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2302*57718be8SEnji Cooper 
2303*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2304*57718be8SEnji Cooper 
2305*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2306*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2307*57718be8SEnji Cooper 
2308*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2309*57718be8SEnji Cooper 
2310*57718be8SEnji Cooper 	bpfjit_free_code(code);
2311*57718be8SEnji Cooper }
2312*57718be8SEnji Cooper 
2313*57718be8SEnji Cooper ATF_TC(libbpfjit_ldx_imm1);
2314*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
2315*57718be8SEnji Cooper {
2316*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2317*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2318*57718be8SEnji Cooper }
2319*57718be8SEnji Cooper 
2320*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
2321*57718be8SEnji Cooper {
2322*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2323*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2324*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2325*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2326*57718be8SEnji Cooper 	};
2327*57718be8SEnji Cooper 
2328*57718be8SEnji Cooper 	bpfjit_func_t code;
2329*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2330*57718be8SEnji Cooper 
2331*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2332*57718be8SEnji Cooper 
2333*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2334*57718be8SEnji Cooper 
2335*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2336*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2337*57718be8SEnji Cooper 
2338*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
2339*57718be8SEnji Cooper 
2340*57718be8SEnji Cooper 	bpfjit_free_code(code);
2341*57718be8SEnji Cooper }
2342*57718be8SEnji Cooper 
2343*57718be8SEnji Cooper ATF_TC(libbpfjit_ldx_imm2);
2344*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
2345*57718be8SEnji Cooper {
2346*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2347*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2348*57718be8SEnji Cooper }
2349*57718be8SEnji Cooper 
2350*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
2351*57718be8SEnji Cooper {
2352*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2353*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2354*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2355*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2356*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
2357*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2358*57718be8SEnji Cooper 	};
2359*57718be8SEnji Cooper 
2360*57718be8SEnji Cooper 	bpfjit_func_t code;
2361*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2362*57718be8SEnji Cooper 
2363*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2364*57718be8SEnji Cooper 
2365*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2366*57718be8SEnji Cooper 
2367*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2368*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2369*57718be8SEnji Cooper 
2370*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2371*57718be8SEnji Cooper 
2372*57718be8SEnji Cooper 	bpfjit_free_code(code);
2373*57718be8SEnji Cooper }
2374*57718be8SEnji Cooper 
2375*57718be8SEnji Cooper ATF_TC(libbpfjit_ldx_len1);
2376*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
2377*57718be8SEnji Cooper {
2378*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2379*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2380*57718be8SEnji Cooper }
2381*57718be8SEnji Cooper 
2382*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_len1, tc)
2383*57718be8SEnji Cooper {
2384*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2385*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2386*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2387*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2388*57718be8SEnji Cooper 	};
2389*57718be8SEnji Cooper 
2390*57718be8SEnji Cooper 	size_t i;
2391*57718be8SEnji Cooper 	bpfjit_func_t code;
2392*57718be8SEnji Cooper 	uint8_t pkt[5]; /* the program doesn't read any data */
2393*57718be8SEnji Cooper 
2394*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2395*57718be8SEnji Cooper 
2396*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2397*57718be8SEnji Cooper 
2398*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2399*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2400*57718be8SEnji Cooper 
2401*57718be8SEnji Cooper 	for (i = 1; i < sizeof(pkt); i++) {
2402*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2403*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2404*57718be8SEnji Cooper 	}
2405*57718be8SEnji Cooper 
2406*57718be8SEnji Cooper 	bpfjit_free_code(code);
2407*57718be8SEnji Cooper }
2408*57718be8SEnji Cooper 
2409*57718be8SEnji Cooper ATF_TC(libbpfjit_ldx_len2);
2410*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
2411*57718be8SEnji Cooper {
2412*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2413*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2414*57718be8SEnji Cooper }
2415*57718be8SEnji Cooper 
2416*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_len2, tc)
2417*57718be8SEnji Cooper {
2418*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2419*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2420*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2421*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2422*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7),
2423*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2424*57718be8SEnji Cooper 	};
2425*57718be8SEnji Cooper 
2426*57718be8SEnji Cooper 	bpfjit_func_t code;
2427*57718be8SEnji Cooper 	uint8_t pkt[5]; /* the program doesn't read any data */
2428*57718be8SEnji Cooper 
2429*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2430*57718be8SEnji Cooper 
2431*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2432*57718be8SEnji Cooper 
2433*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2434*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2435*57718be8SEnji Cooper 
2436*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
2437*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
2438*57718be8SEnji Cooper 
2439*57718be8SEnji Cooper 	bpfjit_free_code(code);
2440*57718be8SEnji Cooper }
2441*57718be8SEnji Cooper 
2442*57718be8SEnji Cooper ATF_TC(libbpfjit_ldx_msh);
2443*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
2444*57718be8SEnji Cooper {
2445*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2446*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
2447*57718be8SEnji Cooper }
2448*57718be8SEnji Cooper 
2449*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_msh, tc)
2450*57718be8SEnji Cooper {
2451*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2452*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2453*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2454*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2455*57718be8SEnji Cooper 	};
2456*57718be8SEnji Cooper 
2457*57718be8SEnji Cooper 	bpfjit_func_t code;
2458*57718be8SEnji Cooper 	uint8_t pkt[2] = { 0, 0x7a };
2459*57718be8SEnji Cooper 
2460*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2461*57718be8SEnji Cooper 
2462*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2463*57718be8SEnji Cooper 
2464*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2465*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2466*57718be8SEnji Cooper 
2467*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
2468*57718be8SEnji Cooper 
2469*57718be8SEnji Cooper 	bpfjit_free_code(code);
2470*57718be8SEnji Cooper }
2471*57718be8SEnji Cooper 
2472*57718be8SEnji Cooper ATF_TC(libbpfjit_misc_tax);
2473*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_misc_tax, tc)
2474*57718be8SEnji Cooper {
2475*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2476*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
2477*57718be8SEnji Cooper }
2478*57718be8SEnji Cooper 
2479*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_misc_tax, tc)
2480*57718be8SEnji Cooper {
2481*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2482*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_IMM, 3),
2483*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2484*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2485*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2486*57718be8SEnji Cooper 	};
2487*57718be8SEnji Cooper 
2488*57718be8SEnji Cooper 	bpfjit_func_t code;
2489*57718be8SEnji Cooper 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
2490*57718be8SEnji Cooper 
2491*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2492*57718be8SEnji Cooper 
2493*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2494*57718be8SEnji Cooper 
2495*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2496*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2497*57718be8SEnji Cooper 
2498*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
2499*57718be8SEnji Cooper 
2500*57718be8SEnji Cooper 	bpfjit_free_code(code);
2501*57718be8SEnji Cooper }
2502*57718be8SEnji Cooper 
2503*57718be8SEnji Cooper ATF_TC(libbpfjit_misc_txa);
2504*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_misc_txa, tc)
2505*57718be8SEnji Cooper {
2506*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2507*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
2508*57718be8SEnji Cooper }
2509*57718be8SEnji Cooper 
2510*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_misc_txa, tc)
2511*57718be8SEnji Cooper {
2512*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2513*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2514*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
2515*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2516*57718be8SEnji Cooper 	};
2517*57718be8SEnji Cooper 
2518*57718be8SEnji Cooper 	bpfjit_func_t code;
2519*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2520*57718be8SEnji Cooper 
2521*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2522*57718be8SEnji Cooper 
2523*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2524*57718be8SEnji Cooper 
2525*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2526*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2527*57718be8SEnji Cooper 
2528*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
2529*57718be8SEnji Cooper 
2530*57718be8SEnji Cooper 	bpfjit_free_code(code);
2531*57718be8SEnji Cooper }
2532*57718be8SEnji Cooper 
2533*57718be8SEnji Cooper ATF_TC(libbpfjit_st1);
2534*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st1, tc)
2535*57718be8SEnji Cooper {
2536*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2537*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ST");
2538*57718be8SEnji Cooper }
2539*57718be8SEnji Cooper 
2540*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st1, tc)
2541*57718be8SEnji Cooper {
2542*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2543*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2544*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, 0),
2545*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
2546*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2547*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2548*57718be8SEnji Cooper 	};
2549*57718be8SEnji Cooper 
2550*57718be8SEnji Cooper 	size_t i;
2551*57718be8SEnji Cooper 	bpfjit_func_t code;
2552*57718be8SEnji Cooper 	uint8_t pkt[16]; /* the program doesn't read any data */
2553*57718be8SEnji Cooper 
2554*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2555*57718be8SEnji Cooper 
2556*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2557*57718be8SEnji Cooper 
2558*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2559*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2560*57718be8SEnji Cooper 
2561*57718be8SEnji Cooper 	for (i = 1; i <= sizeof(pkt); i++)
2562*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2563*57718be8SEnji Cooper 
2564*57718be8SEnji Cooper 	bpfjit_free_code(code);
2565*57718be8SEnji Cooper }
2566*57718be8SEnji Cooper 
2567*57718be8SEnji Cooper ATF_TC(libbpfjit_st2);
2568*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st2, tc)
2569*57718be8SEnji Cooper {
2570*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2571*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ST");
2572*57718be8SEnji Cooper }
2573*57718be8SEnji Cooper 
2574*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st2, tc)
2575*57718be8SEnji Cooper {
2576*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2577*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2578*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2579*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2580*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2581*57718be8SEnji Cooper 	};
2582*57718be8SEnji Cooper 
2583*57718be8SEnji Cooper 	bpfjit_func_t code;
2584*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2585*57718be8SEnji Cooper 
2586*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2587*57718be8SEnji Cooper 
2588*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2589*57718be8SEnji Cooper 
2590*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2591*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2592*57718be8SEnji Cooper 
2593*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
2594*57718be8SEnji Cooper 
2595*57718be8SEnji Cooper 	bpfjit_free_code(code);
2596*57718be8SEnji Cooper }
2597*57718be8SEnji Cooper 
2598*57718be8SEnji Cooper ATF_TC(libbpfjit_st3);
2599*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st3, tc)
2600*57718be8SEnji Cooper {
2601*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2602*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ST");
2603*57718be8SEnji Cooper }
2604*57718be8SEnji Cooper 
2605*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st3, tc)
2606*57718be8SEnji Cooper {
2607*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2608*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2609*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, 0),
2610*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2611*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2612*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2613*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2614*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2615*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0),
2616*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2617*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2618*57718be8SEnji Cooper 	};
2619*57718be8SEnji Cooper 
2620*57718be8SEnji Cooper 	bpfjit_func_t code;
2621*57718be8SEnji Cooper 	uint8_t pkt[2]; /* the program doesn't read any data */
2622*57718be8SEnji Cooper 
2623*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2624*57718be8SEnji Cooper 
2625*57718be8SEnji Cooper 	ATF_REQUIRE(BPF_MEMWORDS > 1);
2626*57718be8SEnji Cooper 
2627*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2628*57718be8SEnji Cooper 
2629*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2630*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2631*57718be8SEnji Cooper 
2632*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2633*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2634*57718be8SEnji Cooper 
2635*57718be8SEnji Cooper 	bpfjit_free_code(code);
2636*57718be8SEnji Cooper }
2637*57718be8SEnji Cooper 
2638*57718be8SEnji Cooper ATF_TC(libbpfjit_st4);
2639*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st4, tc)
2640*57718be8SEnji Cooper {
2641*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2642*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ST");
2643*57718be8SEnji Cooper }
2644*57718be8SEnji Cooper 
2645*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st4, tc)
2646*57718be8SEnji Cooper {
2647*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2648*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2649*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, 5),
2650*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2651*57718be8SEnji Cooper 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2652*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2653*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2654*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2655*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0),
2656*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_MEM, 5),
2657*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2658*57718be8SEnji Cooper 	};
2659*57718be8SEnji Cooper 
2660*57718be8SEnji Cooper 	bpfjit_func_t code;
2661*57718be8SEnji Cooper 	uint8_t pkt[2]; /* the program doesn't read any data */
2662*57718be8SEnji Cooper 
2663*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2664*57718be8SEnji Cooper 
2665*57718be8SEnji Cooper 	ATF_REQUIRE(BPF_MEMWORDS > 6);
2666*57718be8SEnji Cooper 
2667*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2668*57718be8SEnji Cooper 
2669*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2670*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2671*57718be8SEnji Cooper 
2672*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2673*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2674*57718be8SEnji Cooper 
2675*57718be8SEnji Cooper 	bpfjit_free_code(code);
2676*57718be8SEnji Cooper }
2677*57718be8SEnji Cooper 
2678*57718be8SEnji Cooper ATF_TC(libbpfjit_st5);
2679*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st5, tc)
2680*57718be8SEnji Cooper {
2681*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2682*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_ST");
2683*57718be8SEnji Cooper }
2684*57718be8SEnji Cooper 
2685*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st5, tc)
2686*57718be8SEnji Cooper {
2687*57718be8SEnji Cooper 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
2688*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2689*57718be8SEnji Cooper 
2690*57718be8SEnji Cooper 	size_t k;
2691*57718be8SEnji Cooper 	bpfjit_func_t code;
2692*57718be8SEnji Cooper 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2693*57718be8SEnji Cooper 
2694*57718be8SEnji Cooper 	memset(insns, 0, sizeof(insns));
2695*57718be8SEnji Cooper 
2696*57718be8SEnji Cooper 	/* for each k do M[k] = k */
2697*57718be8SEnji Cooper 	for (k = 0; k < BPF_MEMWORDS; k++) {
2698*57718be8SEnji Cooper 		insns[2*k].code   = BPF_LD+BPF_IMM;
2699*57718be8SEnji Cooper 		insns[2*k].k      = 3*k;
2700*57718be8SEnji Cooper 		insns[2*k+1].code = BPF_ST;
2701*57718be8SEnji Cooper 		insns[2*k+1].k    = k;
2702*57718be8SEnji Cooper 	}
2703*57718be8SEnji Cooper 
2704*57718be8SEnji Cooper 	/* load wirelen into A */
2705*57718be8SEnji Cooper 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2706*57718be8SEnji Cooper 
2707*57718be8SEnji Cooper 	/* for each k, if (A == k + 1) return M[k] */
2708*57718be8SEnji Cooper 	for (k = 0; k < BPF_MEMWORDS; k++) {
2709*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2710*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
2711*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
2712*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
2713*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2714*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
2715*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2716*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
2717*57718be8SEnji Cooper 	}
2718*57718be8SEnji Cooper 
2719*57718be8SEnji Cooper 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2720*57718be8SEnji Cooper 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
2721*57718be8SEnji Cooper 
2722*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2723*57718be8SEnji Cooper 
2724*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2725*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2726*57718be8SEnji Cooper 
2727*57718be8SEnji Cooper 	for (k = 1; k <= sizeof(pkt); k++)
2728*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2729*57718be8SEnji Cooper 
2730*57718be8SEnji Cooper 	bpfjit_free_code(code);
2731*57718be8SEnji Cooper }
2732*57718be8SEnji Cooper 
2733*57718be8SEnji Cooper ATF_TC(libbpfjit_stx1);
2734*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx1, tc)
2735*57718be8SEnji Cooper {
2736*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2737*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_STX");
2738*57718be8SEnji Cooper }
2739*57718be8SEnji Cooper 
2740*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx1, tc)
2741*57718be8SEnji Cooper {
2742*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2743*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2744*57718be8SEnji Cooper 		BPF_STMT(BPF_STX, 0),
2745*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2746*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2747*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2748*57718be8SEnji Cooper 	};
2749*57718be8SEnji Cooper 
2750*57718be8SEnji Cooper 	size_t i;
2751*57718be8SEnji Cooper 	bpfjit_func_t code;
2752*57718be8SEnji Cooper 	uint8_t pkt[16]; /* the program doesn't read any data */
2753*57718be8SEnji Cooper 
2754*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2755*57718be8SEnji Cooper 
2756*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2757*57718be8SEnji Cooper 
2758*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2759*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2760*57718be8SEnji Cooper 
2761*57718be8SEnji Cooper 	for (i = 1; i <= sizeof(pkt); i++)
2762*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2763*57718be8SEnji Cooper 
2764*57718be8SEnji Cooper 	bpfjit_free_code(code);
2765*57718be8SEnji Cooper }
2766*57718be8SEnji Cooper 
2767*57718be8SEnji Cooper ATF_TC(libbpfjit_stx2);
2768*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx2, tc)
2769*57718be8SEnji Cooper {
2770*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2771*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_STX");
2772*57718be8SEnji Cooper }
2773*57718be8SEnji Cooper 
2774*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx2, tc)
2775*57718be8SEnji Cooper {
2776*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2777*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2778*57718be8SEnji Cooper 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2779*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2780*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
2781*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2782*57718be8SEnji Cooper 	};
2783*57718be8SEnji Cooper 
2784*57718be8SEnji Cooper 	bpfjit_func_t code;
2785*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
2786*57718be8SEnji Cooper 
2787*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2788*57718be8SEnji Cooper 
2789*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2790*57718be8SEnji Cooper 
2791*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2792*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2793*57718be8SEnji Cooper 
2794*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
2795*57718be8SEnji Cooper 
2796*57718be8SEnji Cooper 	bpfjit_free_code(code);
2797*57718be8SEnji Cooper }
2798*57718be8SEnji Cooper 
2799*57718be8SEnji Cooper ATF_TC(libbpfjit_stx3);
2800*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx3, tc)
2801*57718be8SEnji Cooper {
2802*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2803*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_STX");
2804*57718be8SEnji Cooper }
2805*57718be8SEnji Cooper 
2806*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx3, tc)
2807*57718be8SEnji Cooper {
2808*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2809*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2810*57718be8SEnji Cooper 		BPF_STMT(BPF_STX, 5),
2811*57718be8SEnji Cooper 		BPF_STMT(BPF_STX, 2),
2812*57718be8SEnji Cooper 		BPF_STMT(BPF_STX, 3),
2813*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2814*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2815*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2816*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2817*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2818*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2819*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2820*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2821*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2822*57718be8SEnji Cooper 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2823*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0)
2824*57718be8SEnji Cooper 	};
2825*57718be8SEnji Cooper 
2826*57718be8SEnji Cooper 	size_t i;
2827*57718be8SEnji Cooper 	bpfjit_func_t code;
2828*57718be8SEnji Cooper 	uint8_t pkt[16]; /* the program doesn't read any data */
2829*57718be8SEnji Cooper 
2830*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2831*57718be8SEnji Cooper 
2832*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2833*57718be8SEnji Cooper 
2834*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2835*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2836*57718be8SEnji Cooper 
2837*57718be8SEnji Cooper 	for (i = 1; i <= sizeof(pkt); i++)
2838*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
2839*57718be8SEnji Cooper 
2840*57718be8SEnji Cooper 	bpfjit_free_code(code);
2841*57718be8SEnji Cooper }
2842*57718be8SEnji Cooper 
2843*57718be8SEnji Cooper ATF_TC(libbpfjit_stx4);
2844*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx4, tc)
2845*57718be8SEnji Cooper {
2846*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2847*57718be8SEnji Cooper 	    "Test JIT compilation of BPF_STX");
2848*57718be8SEnji Cooper }
2849*57718be8SEnji Cooper 
2850*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx4, tc)
2851*57718be8SEnji Cooper {
2852*57718be8SEnji Cooper 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
2853*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2854*57718be8SEnji Cooper 
2855*57718be8SEnji Cooper 	size_t k;
2856*57718be8SEnji Cooper 	bpfjit_func_t code;
2857*57718be8SEnji Cooper 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2858*57718be8SEnji Cooper 
2859*57718be8SEnji Cooper 	memset(insns, 0, sizeof(insns));
2860*57718be8SEnji Cooper 
2861*57718be8SEnji Cooper 	/* for each k do M[k] = k */
2862*57718be8SEnji Cooper 	for (k = 0; k < BPF_MEMWORDS; k++) {
2863*57718be8SEnji Cooper 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
2864*57718be8SEnji Cooper 		insns[2*k].k      = 3*k;
2865*57718be8SEnji Cooper 		insns[2*k+1].code = BPF_STX;
2866*57718be8SEnji Cooper 		insns[2*k+1].k    = k;
2867*57718be8SEnji Cooper 	}
2868*57718be8SEnji Cooper 
2869*57718be8SEnji Cooper 	/* load wirelen into A */
2870*57718be8SEnji Cooper 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2871*57718be8SEnji Cooper 
2872*57718be8SEnji Cooper 	/* for each k, if (A == k + 1) return M[k] */
2873*57718be8SEnji Cooper 	for (k = 0; k < BPF_MEMWORDS; k++) {
2874*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2875*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
2876*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
2877*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
2878*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2879*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
2880*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2881*57718be8SEnji Cooper 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
2882*57718be8SEnji Cooper 	}
2883*57718be8SEnji Cooper 
2884*57718be8SEnji Cooper 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2885*57718be8SEnji Cooper 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
2886*57718be8SEnji Cooper 
2887*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2888*57718be8SEnji Cooper 
2889*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2890*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2891*57718be8SEnji Cooper 
2892*57718be8SEnji Cooper 	for (k = 1; k <= sizeof(pkt); k++)
2893*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2894*57718be8SEnji Cooper 
2895*57718be8SEnji Cooper 	bpfjit_free_code(code);
2896*57718be8SEnji Cooper }
2897*57718be8SEnji Cooper 
2898*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_1);
2899*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
2900*57718be8SEnji Cooper {
2901*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2902*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
2903*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_ABS");
2904*57718be8SEnji Cooper }
2905*57718be8SEnji Cooper 
2906*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
2907*57718be8SEnji Cooper {
2908*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2909*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2910*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2911*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2912*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2913*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2914*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2915*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2916*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2917*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2918*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2919*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
2920*57718be8SEnji Cooper 	};
2921*57718be8SEnji Cooper 
2922*57718be8SEnji Cooper 	size_t i, j;
2923*57718be8SEnji Cooper 	bpfjit_func_t code;
2924*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
2925*57718be8SEnji Cooper 		{
2926*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2927*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2928*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
2929*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
2930*57718be8SEnji Cooper 		},
2931*57718be8SEnji Cooper 		{
2932*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2933*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2934*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
2935*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
2936*57718be8SEnji Cooper 		}
2937*57718be8SEnji Cooper 	};
2938*57718be8SEnji Cooper 
2939*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2940*57718be8SEnji Cooper 
2941*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2942*57718be8SEnji Cooper 
2943*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
2944*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
2945*57718be8SEnji Cooper 
2946*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
2947*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
2948*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
2949*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
2950*57718be8SEnji Cooper 	}
2951*57718be8SEnji Cooper 
2952*57718be8SEnji Cooper 	bpfjit_free_code(code);
2953*57718be8SEnji Cooper }
2954*57718be8SEnji Cooper 
2955*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_2);
2956*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
2957*57718be8SEnji Cooper {
2958*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
2959*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
2960*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_ABS");
2961*57718be8SEnji Cooper }
2962*57718be8SEnji Cooper 
2963*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
2964*57718be8SEnji Cooper {
2965*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
2966*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2967*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2968*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2969*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2970*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2971*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2972*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2973*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2974*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2975*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2976*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
2977*57718be8SEnji Cooper 	};
2978*57718be8SEnji Cooper 
2979*57718be8SEnji Cooper 	size_t i, j;
2980*57718be8SEnji Cooper 	bpfjit_func_t code;
2981*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
2982*57718be8SEnji Cooper 		{
2983*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2984*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2985*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
2986*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
2987*57718be8SEnji Cooper 		},
2988*57718be8SEnji Cooper 		{
2989*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2990*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2991*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
2992*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
2993*57718be8SEnji Cooper 		}
2994*57718be8SEnji Cooper 	};
2995*57718be8SEnji Cooper 
2996*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2997*57718be8SEnji Cooper 
2998*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
2999*57718be8SEnji Cooper 
3000*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3001*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3002*57718be8SEnji Cooper 
3003*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3004*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3005*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3006*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3007*57718be8SEnji Cooper 	}
3008*57718be8SEnji Cooper 
3009*57718be8SEnji Cooper 	bpfjit_free_code(code);
3010*57718be8SEnji Cooper }
3011*57718be8SEnji Cooper 
3012*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_3);
3013*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
3014*57718be8SEnji Cooper {
3015*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3016*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
3017*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_ABS");
3018*57718be8SEnji Cooper }
3019*57718be8SEnji Cooper 
3020*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
3021*57718be8SEnji Cooper {
3022*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3023*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3024*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3025*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3026*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3027*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3028*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3029*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3030*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3031*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3032*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3033*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3034*57718be8SEnji Cooper 	};
3035*57718be8SEnji Cooper 
3036*57718be8SEnji Cooper 	size_t i, j;
3037*57718be8SEnji Cooper 	bpfjit_func_t code;
3038*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
3039*57718be8SEnji Cooper 		{
3040*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3041*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3042*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
3043*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
3044*57718be8SEnji Cooper 		},
3045*57718be8SEnji Cooper 		{
3046*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3047*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3048*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
3049*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
3050*57718be8SEnji Cooper 		}
3051*57718be8SEnji Cooper 	};
3052*57718be8SEnji Cooper 
3053*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3054*57718be8SEnji Cooper 
3055*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3056*57718be8SEnji Cooper 
3057*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3058*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3059*57718be8SEnji Cooper 
3060*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3061*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3062*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3063*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3064*57718be8SEnji Cooper 	}
3065*57718be8SEnji Cooper 
3066*57718be8SEnji Cooper 	bpfjit_free_code(code);
3067*57718be8SEnji Cooper }
3068*57718be8SEnji Cooper 
3069*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_1);
3070*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
3071*57718be8SEnji Cooper {
3072*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3073*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
3074*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_IND");
3075*57718be8SEnji Cooper }
3076*57718be8SEnji Cooper 
3077*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
3078*57718be8SEnji Cooper {
3079*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3080*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3081*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3082*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3083*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3084*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3085*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3086*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3087*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3088*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3089*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3090*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3091*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3092*57718be8SEnji Cooper 	};
3093*57718be8SEnji Cooper 
3094*57718be8SEnji Cooper 	size_t i, j;
3095*57718be8SEnji Cooper 	bpfjit_func_t code;
3096*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
3097*57718be8SEnji Cooper 		{
3098*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3099*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3100*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
3101*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
3102*57718be8SEnji Cooper 		},
3103*57718be8SEnji Cooper 		{
3104*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3105*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3106*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
3107*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
3108*57718be8SEnji Cooper 		}
3109*57718be8SEnji Cooper 	};
3110*57718be8SEnji Cooper 
3111*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3112*57718be8SEnji Cooper 
3113*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3114*57718be8SEnji Cooper 
3115*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3116*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3117*57718be8SEnji Cooper 
3118*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3119*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3120*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3121*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3122*57718be8SEnji Cooper 	}
3123*57718be8SEnji Cooper 
3124*57718be8SEnji Cooper 	bpfjit_free_code(code);
3125*57718be8SEnji Cooper }
3126*57718be8SEnji Cooper 
3127*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_2);
3128*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
3129*57718be8SEnji Cooper {
3130*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3131*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
3132*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_IND");
3133*57718be8SEnji Cooper }
3134*57718be8SEnji Cooper 
3135*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
3136*57718be8SEnji Cooper {
3137*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3138*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3139*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3140*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3141*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3142*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3143*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3144*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3145*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3146*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3147*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3148*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3149*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3150*57718be8SEnji Cooper 	};
3151*57718be8SEnji Cooper 
3152*57718be8SEnji Cooper 	size_t i, j;
3153*57718be8SEnji Cooper 	bpfjit_func_t code;
3154*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
3155*57718be8SEnji Cooper 		{
3156*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3157*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3158*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
3159*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
3160*57718be8SEnji Cooper 		},
3161*57718be8SEnji Cooper 		{
3162*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3163*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3164*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
3165*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
3166*57718be8SEnji Cooper 		}
3167*57718be8SEnji Cooper 	};
3168*57718be8SEnji Cooper 
3169*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3170*57718be8SEnji Cooper 
3171*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3172*57718be8SEnji Cooper 
3173*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3174*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3175*57718be8SEnji Cooper 
3176*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3177*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3178*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3179*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3180*57718be8SEnji Cooper 	}
3181*57718be8SEnji Cooper 
3182*57718be8SEnji Cooper 	bpfjit_free_code(code);
3183*57718be8SEnji Cooper }
3184*57718be8SEnji Cooper 
3185*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_3);
3186*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
3187*57718be8SEnji Cooper {
3188*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3189*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
3190*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_IND");
3191*57718be8SEnji Cooper }
3192*57718be8SEnji Cooper 
3193*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
3194*57718be8SEnji Cooper {
3195*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3196*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3197*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3198*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3199*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3200*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3201*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3202*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3203*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3204*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3205*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3206*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3207*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3208*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3209*57718be8SEnji Cooper 	};
3210*57718be8SEnji Cooper 
3211*57718be8SEnji Cooper 	size_t i, j;
3212*57718be8SEnji Cooper 	bpfjit_func_t code;
3213*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
3214*57718be8SEnji Cooper 		{
3215*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3216*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3217*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
3218*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
3219*57718be8SEnji Cooper 		},
3220*57718be8SEnji Cooper 		{
3221*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3222*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3223*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
3224*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
3225*57718be8SEnji Cooper 		}
3226*57718be8SEnji Cooper 	};
3227*57718be8SEnji Cooper 
3228*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3229*57718be8SEnji Cooper 
3230*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3231*57718be8SEnji Cooper 
3232*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3233*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3234*57718be8SEnji Cooper 
3235*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3236*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3237*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3238*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3239*57718be8SEnji Cooper 	}
3240*57718be8SEnji Cooper 
3241*57718be8SEnji Cooper 	bpfjit_free_code(code);
3242*57718be8SEnji Cooper }
3243*57718be8SEnji Cooper 
3244*57718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_4);
3245*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
3246*57718be8SEnji Cooper {
3247*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3248*57718be8SEnji Cooper 	    "Test JIT compilation with length optimization "
3249*57718be8SEnji Cooper 	    "applied to BPF_LD+BPF_IND");
3250*57718be8SEnji Cooper }
3251*57718be8SEnji Cooper 
3252*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
3253*57718be8SEnji Cooper {
3254*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3255*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3256*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3257*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3258*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3259*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3260*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3261*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3262*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3263*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3264*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3265*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3266*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3267*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3268*57718be8SEnji Cooper 	};
3269*57718be8SEnji Cooper 
3270*57718be8SEnji Cooper 	size_t i, j;
3271*57718be8SEnji Cooper 	bpfjit_func_t code;
3272*57718be8SEnji Cooper 	uint8_t pkt[2][34] = {
3273*57718be8SEnji Cooper 		{
3274*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3275*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3276*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f,
3277*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23
3278*57718be8SEnji Cooper 		},
3279*57718be8SEnji Cooper 		{
3280*57718be8SEnji Cooper 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3281*57718be8SEnji Cooper 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3282*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x23,
3283*57718be8SEnji Cooper 			0x80, 0x03, 0x70, 0x0f
3284*57718be8SEnji Cooper 		}
3285*57718be8SEnji Cooper 	};
3286*57718be8SEnji Cooper 
3287*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3288*57718be8SEnji Cooper 
3289*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3290*57718be8SEnji Cooper 
3291*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3292*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3293*57718be8SEnji Cooper 
3294*57718be8SEnji Cooper 	for (i = 0; i < 2; i++) {
3295*57718be8SEnji Cooper 		for (j = 1; j < sizeof(pkt[i]); j++)
3296*57718be8SEnji Cooper 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3297*57718be8SEnji Cooper 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3298*57718be8SEnji Cooper 	}
3299*57718be8SEnji Cooper 
3300*57718be8SEnji Cooper 	bpfjit_free_code(code);
3301*57718be8SEnji Cooper }
3302*57718be8SEnji Cooper 
3303*57718be8SEnji Cooper ATF_TC(libbpfjit_abc_ja);
3304*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ja, tc)
3305*57718be8SEnji Cooper {
3306*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3307*57718be8SEnji Cooper 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
3308*57718be8SEnji Cooper }
3309*57718be8SEnji Cooper 
3310*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ja, tc)
3311*57718be8SEnji Cooper {
3312*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3313*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3314*57718be8SEnji Cooper 		BPF_STMT(BPF_JMP+BPF_JA, 2),
3315*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3316*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3317*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3318*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_A, 0),
3319*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
3320*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3321*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
3322*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3323*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
3324*57718be8SEnji Cooper 	};
3325*57718be8SEnji Cooper 
3326*57718be8SEnji Cooper 	bpfjit_func_t code;
3327*57718be8SEnji Cooper 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3328*57718be8SEnji Cooper 
3329*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3330*57718be8SEnji Cooper 
3331*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3332*57718be8SEnji Cooper 
3333*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3334*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3335*57718be8SEnji Cooper 
3336*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3337*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3338*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3339*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3340*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3341*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3342*57718be8SEnji Cooper 
3343*57718be8SEnji Cooper 	bpfjit_free_code(code);
3344*57718be8SEnji Cooper }
3345*57718be8SEnji Cooper 
3346*57718be8SEnji Cooper ATF_TC(libbpfjit_abc_ja_over);
3347*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
3348*57718be8SEnji Cooper {
3349*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3350*57718be8SEnji Cooper 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
3351*57718be8SEnji Cooper }
3352*57718be8SEnji Cooper 
3353*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
3354*57718be8SEnji Cooper {
3355*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3356*57718be8SEnji Cooper 		BPF_STMT(BPF_JMP+BPF_JA, 2),
3357*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
3358*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3359*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3360*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
3361*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 1),
3362*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
3363*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 2),
3364*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3365*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 3),
3366*57718be8SEnji Cooper 	};
3367*57718be8SEnji Cooper 
3368*57718be8SEnji Cooper 	bpfjit_func_t code;
3369*57718be8SEnji Cooper 	uint8_t pkt[1]; /* the program doesn't read any data */
3370*57718be8SEnji Cooper 
3371*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3372*57718be8SEnji Cooper 
3373*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3374*57718be8SEnji Cooper 
3375*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3376*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3377*57718be8SEnji Cooper 
3378*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
3379*57718be8SEnji Cooper 
3380*57718be8SEnji Cooper 	bpfjit_free_code(code);
3381*57718be8SEnji Cooper }
3382*57718be8SEnji Cooper 
3383*57718be8SEnji Cooper ATF_TC(libbpfjit_abc_ld_chain);
3384*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
3385*57718be8SEnji Cooper {
3386*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3387*57718be8SEnji Cooper 	    "Test ABC optimization of a chain of BPF_LD instructions "
3388*57718be8SEnji Cooper 	    "with exits leading to a single BPF_RET");
3389*57718be8SEnji Cooper }
3390*57718be8SEnji Cooper 
3391*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
3392*57718be8SEnji Cooper {
3393*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3394*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3395*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
3396*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
3397*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
3398*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
3399*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
3400*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 123456789),
3401*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 987654321),
3402*57718be8SEnji Cooper 	};
3403*57718be8SEnji Cooper 
3404*57718be8SEnji Cooper 	bpfjit_func_t code;
3405*57718be8SEnji Cooper 	uint8_t pkt[10] = {};
3406*57718be8SEnji Cooper 
3407*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3408*57718be8SEnji Cooper 
3409*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3410*57718be8SEnji Cooper 
3411*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3412*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3413*57718be8SEnji Cooper 
3414*57718be8SEnji Cooper 	/* Packet is too short. */
3415*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3416*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3417*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3418*57718be8SEnji Cooper 
3419*57718be8SEnji Cooper 	/* !(pkt[3] == 8) => return 123456789 */
3420*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
3421*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
3422*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3423*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
3424*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
3425*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3426*57718be8SEnji Cooper 
3427*57718be8SEnji Cooper 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
3428*57718be8SEnji Cooper 	pkt[3] = 8;
3429*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3430*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3431*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3432*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3433*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3434*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3435*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3436*57718be8SEnji Cooper 
3437*57718be8SEnji Cooper 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
3438*57718be8SEnji Cooper 	pkt[4] = pkt[5] = 1;
3439*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3440*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3441*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3442*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3443*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3444*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3445*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3446*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3447*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3448*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
3449*57718be8SEnji Cooper 
3450*57718be8SEnji Cooper 	/* (pkt[6:4] > 6) => too short or return 123456789 */
3451*57718be8SEnji Cooper 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
3452*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3453*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3454*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3455*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3456*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3457*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3458*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3459*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3460*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3461*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
3462*57718be8SEnji Cooper 
3463*57718be8SEnji Cooper 	bpfjit_free_code(code);
3464*57718be8SEnji Cooper }
3465*57718be8SEnji Cooper 
3466*57718be8SEnji Cooper ATF_TC(libbpfjit_examples_1);
3467*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_1, tc)
3468*57718be8SEnji Cooper {
3469*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3470*57718be8SEnji Cooper 	    "Test the first example from bpf(4) - "
3471*57718be8SEnji Cooper 	    "accept Reverse ARP requests");
3472*57718be8SEnji Cooper }
3473*57718be8SEnji Cooper 
3474*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_1, tc)
3475*57718be8SEnji Cooper {
3476*57718be8SEnji Cooper 	/*
3477*57718be8SEnji Cooper 	 * The following filter is taken from the Reverse ARP
3478*57718be8SEnji Cooper 	 * Daemon. It accepts only Reverse ARP requests.
3479*57718be8SEnji Cooper 	 */
3480*57718be8SEnji Cooper 	struct bpf_insn insns[] = {
3481*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3482*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
3483*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3484*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
3485*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 42),
3486*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3487*57718be8SEnji Cooper 	};
3488*57718be8SEnji Cooper 
3489*57718be8SEnji Cooper 	bpfjit_func_t code;
3490*57718be8SEnji Cooper 	uint8_t pkt[22] = {};
3491*57718be8SEnji Cooper 
3492*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3493*57718be8SEnji Cooper 
3494*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3495*57718be8SEnji Cooper 
3496*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3497*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3498*57718be8SEnji Cooper 
3499*57718be8SEnji Cooper 	/* Packet is too short. */
3500*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3501*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3502*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3503*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3504*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3505*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3506*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3507*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3508*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3509*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3510*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3511*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3512*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3513*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3514*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3515*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3516*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3517*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3518*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3519*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3520*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3521*57718be8SEnji Cooper 
3522*57718be8SEnji Cooper 	/* The packet doesn't match. */
3523*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3524*57718be8SEnji Cooper 
3525*57718be8SEnji Cooper 	/* Still no match after setting the protocol field. */
3526*57718be8SEnji Cooper 	pkt[12] = 0x80; pkt[13] = 0x35;
3527*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3528*57718be8SEnji Cooper 
3529*57718be8SEnji Cooper 	/* Set RARP message type. */
3530*57718be8SEnji Cooper 	pkt[21] = 3;
3531*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
3532*57718be8SEnji Cooper 
3533*57718be8SEnji Cooper 	/* Packet is too short. */
3534*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3535*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3536*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3537*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3538*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3539*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3540*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3541*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3542*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3543*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3544*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3545*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3546*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3547*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3548*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3549*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3550*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3551*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3552*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3553*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3554*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3555*57718be8SEnji Cooper 
3556*57718be8SEnji Cooper 	/* Change RARP message type. */
3557*57718be8SEnji Cooper 	pkt[20] = 3;
3558*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3559*57718be8SEnji Cooper 
3560*57718be8SEnji Cooper 	bpfjit_free_code(code);
3561*57718be8SEnji Cooper }
3562*57718be8SEnji Cooper 
3563*57718be8SEnji Cooper ATF_TC(libbpfjit_examples_2);
3564*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_2, tc)
3565*57718be8SEnji Cooper {
3566*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3567*57718be8SEnji Cooper 	    "Test the second example from bpf(4) - "
3568*57718be8SEnji Cooper 	    "accept IP packets between two specified hosts");
3569*57718be8SEnji Cooper }
3570*57718be8SEnji Cooper 
3571*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_2, tc)
3572*57718be8SEnji Cooper {
3573*57718be8SEnji Cooper 	/*
3574*57718be8SEnji Cooper 	 * This filter accepts only IP packets between host 128.3.112.15
3575*57718be8SEnji Cooper 	 * and 128.3.112.35.
3576*57718be8SEnji Cooper 	 */
3577*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3578*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3579*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
3580*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3581*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3582*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3583*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3584*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3585*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3586*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3587*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3588*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3589*57718be8SEnji Cooper 	};
3590*57718be8SEnji Cooper 
3591*57718be8SEnji Cooper 	bpfjit_func_t code;
3592*57718be8SEnji Cooper 	uint8_t pkt[34] = {};
3593*57718be8SEnji Cooper 
3594*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3595*57718be8SEnji Cooper 
3596*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3597*57718be8SEnji Cooper 
3598*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3599*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3600*57718be8SEnji Cooper 
3601*57718be8SEnji Cooper 	/* Packet is too short. */
3602*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3603*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3604*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3605*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3606*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3607*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3608*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3609*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3610*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3611*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3612*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3613*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3614*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3615*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3616*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3617*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3618*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3619*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3620*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3621*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3622*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3623*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3624*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3625*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3626*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3627*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3628*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3629*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3630*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3631*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3632*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3633*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3634*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3635*57718be8SEnji Cooper 
3636*57718be8SEnji Cooper 	/* The packet doesn't match. */
3637*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3638*57718be8SEnji Cooper 
3639*57718be8SEnji Cooper 	/* Still no match after setting the protocol field. */
3640*57718be8SEnji Cooper 	pkt[12] = 8;
3641*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3642*57718be8SEnji Cooper 
3643*57718be8SEnji Cooper 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
3644*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3645*57718be8SEnji Cooper 
3646*57718be8SEnji Cooper 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
3647*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3648*57718be8SEnji Cooper 
3649*57718be8SEnji Cooper 	/* Swap the ip addresses. */
3650*57718be8SEnji Cooper 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
3651*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3652*57718be8SEnji Cooper 
3653*57718be8SEnji Cooper 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
3654*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3655*57718be8SEnji Cooper 
3656*57718be8SEnji Cooper 	/* Packet is too short. */
3657*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3658*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3659*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3660*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3661*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3662*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3663*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3664*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3665*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3666*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3667*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3668*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3669*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3670*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3671*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3672*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3673*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3674*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3675*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3676*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3677*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3678*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3679*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3680*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3681*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3682*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3683*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3684*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3685*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3686*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3687*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3688*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3689*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3690*57718be8SEnji Cooper 
3691*57718be8SEnji Cooper 	/* Change the protocol field. */
3692*57718be8SEnji Cooper 	pkt[13] = 8;
3693*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3694*57718be8SEnji Cooper 
3695*57718be8SEnji Cooper 	bpfjit_free_code(code);
3696*57718be8SEnji Cooper }
3697*57718be8SEnji Cooper 
3698*57718be8SEnji Cooper ATF_TC(libbpfjit_examples_3);
3699*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_3, tc)
3700*57718be8SEnji Cooper {
3701*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
3702*57718be8SEnji Cooper 	    "Test the third example from bpf(4) - "
3703*57718be8SEnji Cooper 	    "accept TCP finger packets");
3704*57718be8SEnji Cooper }
3705*57718be8SEnji Cooper 
3706*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_3, tc)
3707*57718be8SEnji Cooper {
3708*57718be8SEnji Cooper 	/*
3709*57718be8SEnji Cooper 	 * This filter returns only TCP finger packets.
3710*57718be8SEnji Cooper 	 */
3711*57718be8SEnji Cooper 	struct bpf_insn insns[] = {
3712*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3713*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
3714*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
3715*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
3716*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3717*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
3718*57718be8SEnji Cooper 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
3719*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
3720*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
3721*57718be8SEnji Cooper 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
3722*57718be8SEnji Cooper 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
3723*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3724*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 0),
3725*57718be8SEnji Cooper 	};
3726*57718be8SEnji Cooper 
3727*57718be8SEnji Cooper 	bpfjit_func_t code;
3728*57718be8SEnji Cooper 	uint8_t pkt[30] = {};
3729*57718be8SEnji Cooper 
3730*57718be8SEnji Cooper 	/* Set IP fragment offset to non-zero. */
3731*57718be8SEnji Cooper 	pkt[20] = 1; pkt[21] = 1;
3732*57718be8SEnji Cooper 
3733*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3734*57718be8SEnji Cooper 
3735*57718be8SEnji Cooper 	ATF_CHECK(bpf_validate(insns, insn_count));
3736*57718be8SEnji Cooper 
3737*57718be8SEnji Cooper 	code = bpfjit_generate_code(NULL, insns, insn_count);
3738*57718be8SEnji Cooper 	ATF_REQUIRE(code != NULL);
3739*57718be8SEnji Cooper 
3740*57718be8SEnji Cooper 	/* Packet is too short. */
3741*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3742*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3743*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3744*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3745*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3746*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3747*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3748*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3749*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3750*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3751*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3752*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3753*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3754*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3755*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3756*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3757*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3758*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3759*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3760*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3761*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3762*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3763*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3764*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3765*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3766*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3767*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3768*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3769*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3770*57718be8SEnji Cooper 
3771*57718be8SEnji Cooper 	/* The packet doesn't match. */
3772*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3773*57718be8SEnji Cooper 
3774*57718be8SEnji Cooper 	/* Still no match after setting the protocol field. */
3775*57718be8SEnji Cooper 	pkt[12] = 8;
3776*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3777*57718be8SEnji Cooper 
3778*57718be8SEnji Cooper 	/* Get one step closer to the match. */
3779*57718be8SEnji Cooper 	pkt[23] = 6;
3780*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3781*57718be8SEnji Cooper 
3782*57718be8SEnji Cooper 	/* Set IP fragment offset to zero. */
3783*57718be8SEnji Cooper 	pkt[20] = 0x20; pkt[21] = 0;
3784*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3785*57718be8SEnji Cooper 
3786*57718be8SEnji Cooper 	/* Set IP header length to 12. */
3787*57718be8SEnji Cooper 	pkt[14] = 0xd3;
3788*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3789*57718be8SEnji Cooper 
3790*57718be8SEnji Cooper 	/* Match one branch of the program. */
3791*57718be8SEnji Cooper 	pkt[27] = 79;
3792*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3793*57718be8SEnji Cooper 
3794*57718be8SEnji Cooper 	/* Match the other branch of the program. */
3795*57718be8SEnji Cooper 	pkt[29] = 79; pkt[27] = 0;
3796*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3797*57718be8SEnji Cooper 
3798*57718be8SEnji Cooper 	/* Packet is too short. */
3799*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3800*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3801*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3802*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3803*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3804*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3805*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3806*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3807*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3808*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3809*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3810*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3811*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3812*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3813*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3814*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3815*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3816*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3817*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3818*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3819*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3820*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3821*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3822*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3823*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3824*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3825*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3826*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3827*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3828*57718be8SEnji Cooper 
3829*57718be8SEnji Cooper 	/* Set IP header length to 16. Packet is too short. */
3830*57718be8SEnji Cooper 	pkt[14] = 4;
3831*57718be8SEnji Cooper 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3832*57718be8SEnji Cooper 
3833*57718be8SEnji Cooper 	bpfjit_free_code(code);
3834*57718be8SEnji Cooper }
3835*57718be8SEnji Cooper 
3836*57718be8SEnji Cooper ATF_TC(libbpfjit_cop_no_ctx);
3837*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
3838*57718be8SEnji Cooper {
3839*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
3840*57718be8SEnji Cooper 	    "instruction can't be accepted without a context");
3841*57718be8SEnji Cooper }
3842*57718be8SEnji Cooper 
3843*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
3844*57718be8SEnji Cooper {
3845*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3846*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_COP, 0),
3847*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7)
3848*57718be8SEnji Cooper 	};
3849*57718be8SEnji Cooper 
3850*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3851*57718be8SEnji Cooper 
3852*57718be8SEnji Cooper 	ATF_CHECK(!bpf_validate(insns, insn_count));
3853*57718be8SEnji Cooper 
3854*57718be8SEnji Cooper 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
3855*57718be8SEnji Cooper }
3856*57718be8SEnji Cooper 
3857*57718be8SEnji Cooper ATF_TC(libbpfjit_copx_no_ctx);
3858*57718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
3859*57718be8SEnji Cooper {
3860*57718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
3861*57718be8SEnji Cooper 	    "instruction can't be accepted without a context");
3862*57718be8SEnji Cooper }
3863*57718be8SEnji Cooper 
3864*57718be8SEnji Cooper ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
3865*57718be8SEnji Cooper {
3866*57718be8SEnji Cooper 	static struct bpf_insn insns[] = {
3867*57718be8SEnji Cooper 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
3868*57718be8SEnji Cooper 		BPF_STMT(BPF_RET+BPF_K, 7)
3869*57718be8SEnji Cooper 	};
3870*57718be8SEnji Cooper 
3871*57718be8SEnji Cooper 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3872*57718be8SEnji Cooper 
3873*57718be8SEnji Cooper 	ATF_CHECK(!bpf_validate(insns, insn_count));
3874*57718be8SEnji Cooper 
3875*57718be8SEnji Cooper 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
3876*57718be8SEnji Cooper }
3877*57718be8SEnji Cooper 
3878*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
3879*57718be8SEnji Cooper {
3880*57718be8SEnji Cooper 
3881*57718be8SEnji Cooper 	/*
3882*57718be8SEnji Cooper 	 * For every new test please also add a similar test
3883*57718be8SEnji Cooper 	 * to ../../net/bpfjit/t_bpfjit.c
3884*57718be8SEnji Cooper 	 */
3885*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_empty);
3886*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
3887*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
3888*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
3889*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
3890*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
3891*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
3892*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
3893*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
3894*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
3895*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
3896*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
3897*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
3898*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
3899*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
3900*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
3901*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
3902*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
3903*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
3904*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
3905*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
3906*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
3907*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
3908*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
3909*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
3910*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
3911*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
3912*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
3913*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
3914*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
3915*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
3916*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
3917*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
3918*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
3919*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
3920*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
3921*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
3922*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
3923*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
3924*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
3925*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
3926*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
3927*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
3928*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
3929*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
3930*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
3931*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
3932*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
3933*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
3934*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
3935*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
3936*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
3937*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
3938*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
3939*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
3940*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
3941*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
3942*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
3943*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
3944*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
3945*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
3946*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
3947*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
3948*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
3949*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_st1);
3950*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_st2);
3951*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_st3);
3952*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_st4);
3953*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_st5);
3954*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_stx1);
3955*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_stx2);
3956*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_stx3);
3957*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_stx4);
3958*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
3959*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
3960*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
3961*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
3962*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
3963*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
3964*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
3965*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
3966*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
3967*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
3968*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
3969*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
3970*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
3971*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
3972*57718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
3973*57718be8SEnji Cooper 
3974*57718be8SEnji Cooper 	return atf_no_error();
3975*57718be8SEnji Cooper }
3976