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