xref: /netbsd-src/tests/net/bpfjit/t_bpfjit.c (revision c54cb81102ced2313cb40993fe05548aca9933a1)
1*c54cb811Schristos /*	$NetBSD: t_bpfjit.c,v 1.12 2017/01/13 21:30:42 christos Exp $ */
2d32d6008Salnsn 
3d32d6008Salnsn /*-
4e3ced4adSalnsn  * Copyright (c) 2011-2012, 2014-2015 Alexander Nasonov.
5d32d6008Salnsn  * All rights reserved.
6d32d6008Salnsn  *
7d32d6008Salnsn  * Redistribution and use in source and binary forms, with or without
8d32d6008Salnsn  * modification, are permitted provided that the following conditions
9d32d6008Salnsn  * are met:
10d32d6008Salnsn  * 1. Redistributions of source code must retain the above copyright
11d32d6008Salnsn  *    notice, this list of conditions and the following disclaimer.
12d32d6008Salnsn  * 2. Redistributions in binary form must reproduce the above copyright
13d32d6008Salnsn  *    notice, this list of conditions and the following disclaimer in the
14d32d6008Salnsn  *    documentation and/or other materials provided with the distribution.
15d32d6008Salnsn  *
16d32d6008Salnsn  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17d32d6008Salnsn  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18d32d6008Salnsn  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19d32d6008Salnsn  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d32d6008Salnsn  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d32d6008Salnsn  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22d32d6008Salnsn  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d32d6008Salnsn  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d32d6008Salnsn  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d32d6008Salnsn  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d32d6008Salnsn  * SUCH DAMAGE.
27d32d6008Salnsn  */
28e1f7888bSalnsn 
29d32d6008Salnsn #include <sys/cdefs.h>
30*c54cb811Schristos __RCSID("$NetBSD: t_bpfjit.c,v 1.12 2017/01/13 21:30:42 christos Exp $");
31d32d6008Salnsn 
32d32d6008Salnsn #include <sys/param.h>
33d32d6008Salnsn #include <sys/mbuf.h>
34d32d6008Salnsn #include <unistd.h>
35d32d6008Salnsn 
36d32d6008Salnsn #include <net/bpf.h>
37d32d6008Salnsn #include <net/bpfjit.h>
38d32d6008Salnsn 
39d32d6008Salnsn #include <stdint.h>
40d32d6008Salnsn #include <string.h>
41d32d6008Salnsn 
42d32d6008Salnsn #include <rump/rump.h>
43d32d6008Salnsn #include <rump/rump_syscalls.h>
44d32d6008Salnsn 
45e1f7888bSalnsn #include "../../net/bpf/h_bpf.h"
46e1f7888bSalnsn 
47d32d6008Salnsn /* XXX: atf-c.h has collisions with mbuf */
48d32d6008Salnsn #undef m_type
49d32d6008Salnsn #undef m_data
50d32d6008Salnsn #include <atf-c.h>
51d32d6008Salnsn 
52*c54cb811Schristos #include "h_macros.h"
53d32d6008Salnsn 
54d32d6008Salnsn 
55e1f7888bSalnsn static uint8_t deadbeef_at_5[16] = {
56e1f7888bSalnsn 	0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
57d32d6008Salnsn };
58d32d6008Salnsn 
59e1f7888bSalnsn static inline
jitcall(bpfjit_func_t fn,const uint8_t * pkt,unsigned int wirelen,unsigned int buflen)60e1f7888bSalnsn unsigned int jitcall(bpfjit_func_t fn,
61e1f7888bSalnsn     const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
62e1f7888bSalnsn {
63d32d6008Salnsn 	bpf_args_t args;
64d32d6008Salnsn 
65e1f7888bSalnsn 	args.pkt = pkt;
66e1f7888bSalnsn 	args.wirelen = wirelen;
67e1f7888bSalnsn 	args.buflen = buflen;
68d32d6008Salnsn 
69e1f7888bSalnsn 	return fn(NULL, &args);
70d32d6008Salnsn }
71d32d6008Salnsn 
72e1f7888bSalnsn ATF_TC(bpfjit_empty);
ATF_TC_HEAD(bpfjit_empty,tc)73e1f7888bSalnsn ATF_TC_HEAD(bpfjit_empty, tc)
74d32d6008Salnsn {
75e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
76e1f7888bSalnsn 	    "Test that JIT compilation of an empty bpf program fails");
77e1f7888bSalnsn }
78d32d6008Salnsn 
ATF_TC_BODY(bpfjit_empty,tc)79e1f7888bSalnsn ATF_TC_BODY(bpfjit_empty, tc)
80e1f7888bSalnsn {
81e1f7888bSalnsn 	struct bpf_insn dummy;
82fe765d60Salnsn 	bpfjit_func_t code;
83d32d6008Salnsn 
84d32d6008Salnsn 	RZ(rump_init());
85d32d6008Salnsn 
86fe765d60Salnsn 	ATF_CHECK(!prog_validate(&dummy, 0));
87fe765d60Salnsn 
88e1f7888bSalnsn 	rump_schedule();
89fe765d60Salnsn 	code = rumpns_bpfjit_generate_code(NULL, &dummy, 0);
90e1f7888bSalnsn 	rump_unschedule();
91e1f7888bSalnsn 
92fe765d60Salnsn 	ATF_CHECK(code == NULL);
93fe765d60Salnsn }
94fe765d60Salnsn 
95fe765d60Salnsn ATF_TC(bpfjit_ret_k);
ATF_TC_HEAD(bpfjit_ret_k,tc)96fe765d60Salnsn ATF_TC_HEAD(bpfjit_ret_k, tc)
97fe765d60Salnsn {
98fe765d60Salnsn 	atf_tc_set_md_var(tc, "descr",
99fe765d60Salnsn 	    "Test JIT compilation of a trivial bpf program");
100fe765d60Salnsn }
101fe765d60Salnsn 
ATF_TC_BODY(bpfjit_ret_k,tc)102fe765d60Salnsn ATF_TC_BODY(bpfjit_ret_k, tc)
103fe765d60Salnsn {
104fe765d60Salnsn 	static struct bpf_insn insns[] = {
105fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K, 17)
106fe765d60Salnsn 	};
107fe765d60Salnsn 
108fe765d60Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
109fe765d60Salnsn 
110fe765d60Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
111fe765d60Salnsn 
112fe765d60Salnsn 	RZ(rump_init());
113fe765d60Salnsn 
114fe765d60Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
115fe765d60Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 17);
116fe765d60Salnsn }
117fe765d60Salnsn 
118fe765d60Salnsn ATF_TC(bpfjit_bad_ret_k);
ATF_TC_HEAD(bpfjit_bad_ret_k,tc)119fe765d60Salnsn ATF_TC_HEAD(bpfjit_bad_ret_k, tc)
120fe765d60Salnsn {
121fe765d60Salnsn 	atf_tc_set_md_var(tc, "descr",
122fe765d60Salnsn 	    "Test that JIT compilation of a program with bad BPF_RET fails");
123fe765d60Salnsn }
124fe765d60Salnsn 
ATF_TC_BODY(bpfjit_bad_ret_k,tc)125fe765d60Salnsn ATF_TC_BODY(bpfjit_bad_ret_k, tc)
126fe765d60Salnsn {
127fe765d60Salnsn 	static struct bpf_insn insns[] = {
128fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K+0x8000, 13)
129fe765d60Salnsn 	};
130fe765d60Salnsn 
131fe765d60Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
132fe765d60Salnsn 
133fe765d60Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
134fe765d60Salnsn 
135fe765d60Salnsn 	/*
136fe765d60Salnsn 	 * The point of this test is checking a bad instruction of
137fe765d60Salnsn 	 * a valid class and with a valid BPF_RVAL data.
138fe765d60Salnsn 	 */
139fe765d60Salnsn 	const uint16_t rcode = insns[0].code;
140fe765d60Salnsn 	ATF_CHECK(BPF_CLASS(rcode) == BPF_RET &&
141fe765d60Salnsn 	    (BPF_RVAL(rcode) == BPF_K || BPF_RVAL(rcode) == BPF_A));
142fe765d60Salnsn 
143fe765d60Salnsn 	RZ(rump_init());
144fe765d60Salnsn 
145fe765d60Salnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
146fe765d60Salnsn 
147fe765d60Salnsn 	/* Current implementation generates code. */
148fe765d60Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 13);
149d32d6008Salnsn }
150d32d6008Salnsn 
151e1f7888bSalnsn ATF_TC(bpfjit_alu_add_k);
ATF_TC_HEAD(bpfjit_alu_add_k,tc)152e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_add_k, tc)
153d32d6008Salnsn {
154e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
155e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
156d32d6008Salnsn }
157d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_add_k,tc)158e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_add_k, tc)
159d32d6008Salnsn {
160e1f7888bSalnsn 	static struct bpf_insn insns[] = {
161e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
162e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
163e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
164e1f7888bSalnsn 	};
165e1f7888bSalnsn 
166e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
167e1f7888bSalnsn 
168e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
169d32d6008Salnsn 
170d32d6008Salnsn 	RZ(rump_init());
171d32d6008Salnsn 
172e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
173e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
174d32d6008Salnsn }
175d32d6008Salnsn 
176e1f7888bSalnsn ATF_TC(bpfjit_alu_sub_k);
ATF_TC_HEAD(bpfjit_alu_sub_k,tc)177e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
178d32d6008Salnsn {
179e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
180e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
181d32d6008Salnsn }
182d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_sub_k,tc)183e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_sub_k, tc)
184d32d6008Salnsn {
185e1f7888bSalnsn 	static struct bpf_insn insns[] = {
186e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 1),
187e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
188e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
189e1f7888bSalnsn 	};
190e1f7888bSalnsn 
191e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
192e1f7888bSalnsn 
193e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
194d32d6008Salnsn 
195d32d6008Salnsn 	RZ(rump_init());
196d32d6008Salnsn 
197e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
198e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
199d32d6008Salnsn }
200d32d6008Salnsn 
201e1f7888bSalnsn ATF_TC(bpfjit_alu_mul_k);
ATF_TC_HEAD(bpfjit_alu_mul_k,tc)202e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
203d32d6008Salnsn {
204e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
205e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
206d32d6008Salnsn }
207d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_mul_k,tc)208e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_mul_k, tc)
209d32d6008Salnsn {
210e1f7888bSalnsn 	static struct bpf_insn insns[] = {
211e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
212e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
213e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
214e1f7888bSalnsn 	};
215e1f7888bSalnsn 
216e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
217e1f7888bSalnsn 
218e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
219d32d6008Salnsn 
220d32d6008Salnsn 	RZ(rump_init());
221d32d6008Salnsn 
222e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
223e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
224d32d6008Salnsn }
225d32d6008Salnsn 
226e1f7888bSalnsn ATF_TC(bpfjit_alu_div0_k);
ATF_TC_HEAD(bpfjit_alu_div0_k,tc)227e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
228d32d6008Salnsn {
229e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
230e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
231d32d6008Salnsn }
232d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_div0_k,tc)233e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div0_k, tc)
234d32d6008Salnsn {
235e1f7888bSalnsn 	static struct bpf_insn insns[] = {
236e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
237e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
238e1f7888bSalnsn 	};
239e1f7888bSalnsn 
240e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
241e1f7888bSalnsn 
242e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
243d32d6008Salnsn 
244d32d6008Salnsn 	RZ(rump_init());
245d32d6008Salnsn 
246e1f7888bSalnsn 	//ATF_CHECK(prog_validate(insns, insn_count));
247e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
248d32d6008Salnsn }
249d32d6008Salnsn 
250e1f7888bSalnsn ATF_TC(bpfjit_alu_div1_k);
ATF_TC_HEAD(bpfjit_alu_div1_k,tc)251e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
252d32d6008Salnsn {
253e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
254e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
255d32d6008Salnsn }
256d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_div1_k,tc)257e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div1_k, tc)
258d32d6008Salnsn {
259e1f7888bSalnsn 	static struct bpf_insn insns[] = {
260e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
261e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
262e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
263e1f7888bSalnsn 	};
264e1f7888bSalnsn 
265e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
266e1f7888bSalnsn 
267e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
268d32d6008Salnsn 
269d32d6008Salnsn 	RZ(rump_init());
270d32d6008Salnsn 
271e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
272e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
273d32d6008Salnsn }
274d32d6008Salnsn 
275e1f7888bSalnsn ATF_TC(bpfjit_alu_div2_k);
ATF_TC_HEAD(bpfjit_alu_div2_k,tc)276e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
277d32d6008Salnsn {
278e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
279e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
280d32d6008Salnsn }
281d32d6008Salnsn 
ATF_TC_BODY(bpfjit_alu_div2_k,tc)282e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div2_k, tc)
283d32d6008Salnsn {
284e1f7888bSalnsn 	static struct bpf_insn insns[] = {
285e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
286e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
287e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
288e1f7888bSalnsn 	};
289e1f7888bSalnsn 
290e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
291e1f7888bSalnsn 
292e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
293d32d6008Salnsn 
294d32d6008Salnsn 	RZ(rump_init());
295d32d6008Salnsn 
296e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
297e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
298e1f7888bSalnsn }
299e1f7888bSalnsn 
300e1f7888bSalnsn ATF_TC(bpfjit_alu_div4_k);
ATF_TC_HEAD(bpfjit_alu_div4_k,tc)301e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
302e1f7888bSalnsn {
303e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
304e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
305e1f7888bSalnsn }
306e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div4_k,tc)307e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div4_k, tc)
308e1f7888bSalnsn {
309e1f7888bSalnsn 	static struct bpf_insn insns[] = {
310e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
311e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
312e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
313e1f7888bSalnsn 	};
314e1f7888bSalnsn 
315e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
316e1f7888bSalnsn 
317e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
318e1f7888bSalnsn 
319e1f7888bSalnsn 	RZ(rump_init());
320e1f7888bSalnsn 
321e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
322e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
323e1f7888bSalnsn }
324e1f7888bSalnsn 
325e1f7888bSalnsn ATF_TC(bpfjit_alu_div10_k);
ATF_TC_HEAD(bpfjit_alu_div10_k,tc)326e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
327e1f7888bSalnsn {
328e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
329e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
330e1f7888bSalnsn }
331e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div10_k,tc)332e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div10_k, tc)
333e1f7888bSalnsn {
334e1f7888bSalnsn 	static struct bpf_insn insns[] = {
335e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
336e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
337e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
338e1f7888bSalnsn 	};
339e1f7888bSalnsn 
340e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
341e1f7888bSalnsn 
342e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
343e1f7888bSalnsn 
344e1f7888bSalnsn 	RZ(rump_init());
345e1f7888bSalnsn 
346e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
347e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
348e1f7888bSalnsn }
349e1f7888bSalnsn 
350e1f7888bSalnsn ATF_TC(bpfjit_alu_div10000_k);
ATF_TC_HEAD(bpfjit_alu_div10000_k,tc)351e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
352e1f7888bSalnsn {
353e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
354e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
355e1f7888bSalnsn }
356e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div10000_k,tc)357e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
358e1f7888bSalnsn {
359e1f7888bSalnsn 	static struct bpf_insn insns[] = {
360e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
361e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
362e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
363e1f7888bSalnsn 	};
364e1f7888bSalnsn 
365e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
366e1f7888bSalnsn 
367e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
368e1f7888bSalnsn 
369e1f7888bSalnsn 	RZ(rump_init());
370e1f7888bSalnsn 
371e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
372e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
373e1f7888bSalnsn }
374e1f7888bSalnsn 
375e1f7888bSalnsn ATF_TC(bpfjit_alu_div7609801_k);
ATF_TC_HEAD(bpfjit_alu_div7609801_k,tc)376e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
377e1f7888bSalnsn {
378e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
379e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
380e1f7888bSalnsn }
381e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div7609801_k,tc)382e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
383e1f7888bSalnsn {
384e1f7888bSalnsn 	static struct bpf_insn insns[] = {
385e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
386e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
387e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
388e1f7888bSalnsn 	};
389e1f7888bSalnsn 
390e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
391e1f7888bSalnsn 
392e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
393e1f7888bSalnsn 
394e1f7888bSalnsn 	RZ(rump_init());
395e1f7888bSalnsn 
396e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
397e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
398e1f7888bSalnsn }
399e1f7888bSalnsn 
400e1f7888bSalnsn ATF_TC(bpfjit_alu_div80000000_k);
ATF_TC_HEAD(bpfjit_alu_div80000000_k,tc)401e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
402e1f7888bSalnsn {
403e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
404e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
405e1f7888bSalnsn }
406e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div80000000_k,tc)407e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
408e1f7888bSalnsn {
409e1f7888bSalnsn 	static struct bpf_insn insns[] = {
410e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
411e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
412e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
413e1f7888bSalnsn 	};
414e1f7888bSalnsn 
415e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
416e1f7888bSalnsn 
417e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
418e1f7888bSalnsn 
419e1f7888bSalnsn 	RZ(rump_init());
420e1f7888bSalnsn 
421e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
422e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
423e1f7888bSalnsn }
424e1f7888bSalnsn 
425215bab86Salnsn ATF_TC(bpfjit_alu_mod0_k);
ATF_TC_HEAD(bpfjit_alu_mod0_k,tc)426215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod0_k, tc)
427215bab86Salnsn {
428215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
429215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0");
430215bab86Salnsn }
431215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod0_k,tc)432215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod0_k, tc)
433215bab86Salnsn {
434215bab86Salnsn 	static struct bpf_insn insns[] = {
435215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0),
436215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
437215bab86Salnsn 	};
438215bab86Salnsn 
439215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
440215bab86Salnsn 
441215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
442215bab86Salnsn 
443215bab86Salnsn 	RZ(rump_init());
444215bab86Salnsn 
445215bab86Salnsn 	//ATF_CHECK(prog_validate(insns, insn_count));
446215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
447215bab86Salnsn }
448215bab86Salnsn 
449215bab86Salnsn ATF_TC(bpfjit_alu_mod1_k);
ATF_TC_HEAD(bpfjit_alu_mod1_k,tc)450215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod1_k, tc)
451215bab86Salnsn {
452215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
453215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1");
454215bab86Salnsn }
455215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod1_k,tc)456215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod1_k, tc)
457215bab86Salnsn {
458215bab86Salnsn 	static struct bpf_insn insns[] = {
459215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
460215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1),
461215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
462215bab86Salnsn 	};
463215bab86Salnsn 
464215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
465215bab86Salnsn 
466215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
467215bab86Salnsn 
468215bab86Salnsn 	RZ(rump_init());
469215bab86Salnsn 
470215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
471215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
472215bab86Salnsn }
473215bab86Salnsn 
474215bab86Salnsn ATF_TC(bpfjit_alu_mod2_k);
ATF_TC_HEAD(bpfjit_alu_mod2_k,tc)475215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod2_k, tc)
476215bab86Salnsn {
477215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
478215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2");
479215bab86Salnsn }
480215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod2_k,tc)481215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod2_k, tc)
482215bab86Salnsn {
483215bab86Salnsn 	static struct bpf_insn insns[] = {
484215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
485215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2),
486215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
487215bab86Salnsn 	};
488215bab86Salnsn 
489215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
490215bab86Salnsn 
491215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
492215bab86Salnsn 
493215bab86Salnsn 	RZ(rump_init());
494215bab86Salnsn 
495215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
496215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
497215bab86Salnsn }
498215bab86Salnsn 
499215bab86Salnsn ATF_TC(bpfjit_alu_mod4_k);
ATF_TC_HEAD(bpfjit_alu_mod4_k,tc)500215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod4_k, tc)
501215bab86Salnsn {
502215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
503215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4");
504215bab86Salnsn }
505215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod4_k,tc)506215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod4_k, tc)
507215bab86Salnsn {
508215bab86Salnsn 	static struct bpf_insn insns[] = {
509215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
510215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4),
511215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
512215bab86Salnsn 	};
513215bab86Salnsn 
514215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
515215bab86Salnsn 
516215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
517215bab86Salnsn 
518215bab86Salnsn 	RZ(rump_init());
519215bab86Salnsn 
520215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
521215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
522215bab86Salnsn }
523215bab86Salnsn 
524215bab86Salnsn ATF_TC(bpfjit_alu_mod10_k);
ATF_TC_HEAD(bpfjit_alu_mod10_k,tc)525215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod10_k, tc)
526215bab86Salnsn {
527215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
528215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10");
529215bab86Salnsn }
530215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod10_k,tc)531215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod10_k, tc)
532215bab86Salnsn {
533215bab86Salnsn 	static struct bpf_insn insns[] = {
534215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
535215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10),
536215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
537215bab86Salnsn 	};
538215bab86Salnsn 
539215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
540215bab86Salnsn 
541215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
542215bab86Salnsn 
543215bab86Salnsn 	RZ(rump_init());
544215bab86Salnsn 
545215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
546215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 9);
547215bab86Salnsn }
548215bab86Salnsn 
549215bab86Salnsn ATF_TC(bpfjit_alu_mod10000_k);
ATF_TC_HEAD(bpfjit_alu_mod10000_k,tc)550215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod10000_k, tc)
551215bab86Salnsn {
552215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
553215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10000");
554215bab86Salnsn }
555215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod10000_k,tc)556215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod10000_k, tc)
557215bab86Salnsn {
558215bab86Salnsn 	static struct bpf_insn insns[] = {
559215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
560215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10000),
561215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
562215bab86Salnsn 	};
563215bab86Salnsn 
564215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
565215bab86Salnsn 
566215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
567215bab86Salnsn 
568215bab86Salnsn 	RZ(rump_init());
569215bab86Salnsn 
570215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
571215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3849);
572215bab86Salnsn }
573215bab86Salnsn 
574215bab86Salnsn ATF_TC(bpfjit_alu_mod7609801_k);
ATF_TC_HEAD(bpfjit_alu_mod7609801_k,tc)575215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod7609801_k, tc)
576215bab86Salnsn {
577215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
578215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=7609801");
579215bab86Salnsn }
580215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod7609801_k,tc)581215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod7609801_k, tc)
582215bab86Salnsn {
583215bab86Salnsn 	static struct bpf_insn insns[] = {
584215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
585215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(7609801)),
586215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
587215bab86Salnsn 	};
588215bab86Salnsn 
589215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
590215bab86Salnsn 
591215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
592215bab86Salnsn 
593215bab86Salnsn 	RZ(rump_init());
594215bab86Salnsn 
595215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
596215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3039531);
597215bab86Salnsn }
598215bab86Salnsn 
599215bab86Salnsn ATF_TC(bpfjit_alu_mod80000000_k);
ATF_TC_HEAD(bpfjit_alu_mod80000000_k,tc)600215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod80000000_k, tc)
601215bab86Salnsn {
602215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
603215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0x80000000");
604215bab86Salnsn }
605215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod80000000_k,tc)606215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod80000000_k, tc)
607215bab86Salnsn {
608215bab86Salnsn 	static struct bpf_insn insns[] = {
609215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
610215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(0x80000000)),
611215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
612215bab86Salnsn 	};
613215bab86Salnsn 
614215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
615215bab86Salnsn 
616215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
617215bab86Salnsn 
618215bab86Salnsn 	RZ(rump_init());
619215bab86Salnsn 
620215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
621215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_C(0x7fffffde));
622215bab86Salnsn }
623215bab86Salnsn 
624e1f7888bSalnsn ATF_TC(bpfjit_alu_and_k);
ATF_TC_HEAD(bpfjit_alu_and_k,tc)625e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_and_k, tc)
626e1f7888bSalnsn {
627e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
628e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
629e1f7888bSalnsn }
630e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_and_k,tc)631e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_and_k, tc)
632e1f7888bSalnsn {
633e1f7888bSalnsn 	static struct bpf_insn insns[] = {
634e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
635e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
636e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
637e1f7888bSalnsn 	};
638e1f7888bSalnsn 
639e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
640e1f7888bSalnsn 
641e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
642e1f7888bSalnsn 
643e1f7888bSalnsn 	RZ(rump_init());
644e1f7888bSalnsn 
645e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
646e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
647e1f7888bSalnsn }
648e1f7888bSalnsn 
649e1f7888bSalnsn ATF_TC(bpfjit_alu_or_k);
ATF_TC_HEAD(bpfjit_alu_or_k,tc)650e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_or_k, tc)
651e1f7888bSalnsn {
652e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
653e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
654e1f7888bSalnsn }
655e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_or_k,tc)656e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_or_k, tc)
657e1f7888bSalnsn {
658e1f7888bSalnsn 	static struct bpf_insn insns[] = {
659e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
660e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
661e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
662e1f7888bSalnsn 	};
663e1f7888bSalnsn 
664e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
665e1f7888bSalnsn 
666e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
667e1f7888bSalnsn 
668e1f7888bSalnsn 	RZ(rump_init());
669e1f7888bSalnsn 
670e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
671e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
672e1f7888bSalnsn }
673e1f7888bSalnsn 
674b61069b6Salnsn ATF_TC(bpfjit_alu_xor_k);
ATF_TC_HEAD(bpfjit_alu_xor_k,tc)675b61069b6Salnsn ATF_TC_HEAD(bpfjit_alu_xor_k, tc)
676b61069b6Salnsn {
677b61069b6Salnsn 	atf_tc_set_md_var(tc, "descr",
678b61069b6Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K");
679b61069b6Salnsn }
680b61069b6Salnsn 
ATF_TC_BODY(bpfjit_alu_xor_k,tc)681b61069b6Salnsn ATF_TC_BODY(bpfjit_alu_xor_k, tc)
682b61069b6Salnsn {
683b61069b6Salnsn 	static struct bpf_insn insns[] = {
684b61069b6Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
685b61069b6Salnsn 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0x0000b1e0),
686b61069b6Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
687b61069b6Salnsn 	};
688b61069b6Salnsn 
689b61069b6Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
690b61069b6Salnsn 
691b61069b6Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
692b61069b6Salnsn 
693b61069b6Salnsn 	RZ(rump_init());
694b61069b6Salnsn 
695b61069b6Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
696b61069b6Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
697b61069b6Salnsn }
698b61069b6Salnsn 
699e1f7888bSalnsn ATF_TC(bpfjit_alu_lsh_k);
ATF_TC_HEAD(bpfjit_alu_lsh_k,tc)700e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
701e1f7888bSalnsn {
702e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
703e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
704e1f7888bSalnsn }
705e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_lsh_k,tc)706e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
707e1f7888bSalnsn {
708e1f7888bSalnsn 	static struct bpf_insn insns[] = {
709e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
710e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
711e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
712e1f7888bSalnsn 	};
713e1f7888bSalnsn 
714e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
715e1f7888bSalnsn 
716e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
717e1f7888bSalnsn 
718e1f7888bSalnsn 	RZ(rump_init());
719e1f7888bSalnsn 
720e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
721e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
722e1f7888bSalnsn }
723e1f7888bSalnsn 
724e1f7888bSalnsn ATF_TC(bpfjit_alu_lsh0_k);
ATF_TC_HEAD(bpfjit_alu_lsh0_k,tc)725e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
726e1f7888bSalnsn {
727e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
728e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
729e1f7888bSalnsn }
730e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_lsh0_k,tc)731e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
732e1f7888bSalnsn {
733e1f7888bSalnsn 	static struct bpf_insn insns[] = {
734e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
735e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
736e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
737e1f7888bSalnsn 	};
738e1f7888bSalnsn 
739e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
740e1f7888bSalnsn 
741e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
742e1f7888bSalnsn 
743e1f7888bSalnsn 	RZ(rump_init());
744e1f7888bSalnsn 
745e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
746e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
747e1f7888bSalnsn }
748e1f7888bSalnsn 
749e1f7888bSalnsn ATF_TC(bpfjit_alu_rsh_k);
ATF_TC_HEAD(bpfjit_alu_rsh_k,tc)750e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
751e1f7888bSalnsn {
752e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
753e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
754e1f7888bSalnsn }
755e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_rsh_k,tc)756e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
757e1f7888bSalnsn {
758e1f7888bSalnsn 	static struct bpf_insn insns[] = {
759e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
760e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
761e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
762e1f7888bSalnsn 	};
763e1f7888bSalnsn 
764e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
765e1f7888bSalnsn 
766e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
767e1f7888bSalnsn 
768e1f7888bSalnsn 	RZ(rump_init());
769e1f7888bSalnsn 
770e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
771e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
772e1f7888bSalnsn }
773e1f7888bSalnsn 
774e1f7888bSalnsn ATF_TC(bpfjit_alu_rsh0_k);
ATF_TC_HEAD(bpfjit_alu_rsh0_k,tc)775e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
776e1f7888bSalnsn {
777e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
778e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
779e1f7888bSalnsn }
780e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_rsh0_k,tc)781e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
782e1f7888bSalnsn {
783e1f7888bSalnsn 	static struct bpf_insn insns[] = {
784e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
785e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
786e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
787e1f7888bSalnsn 	};
788e1f7888bSalnsn 
789e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
790e1f7888bSalnsn 
791e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
792e1f7888bSalnsn 
793e1f7888bSalnsn 	RZ(rump_init());
794e1f7888bSalnsn 
795e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
796e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
797e1f7888bSalnsn }
798e1f7888bSalnsn 
799e1f7888bSalnsn ATF_TC(bpfjit_alu_modulo_k);
ATF_TC_HEAD(bpfjit_alu_modulo_k,tc)800e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
801e1f7888bSalnsn {
802e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
803e1f7888bSalnsn 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
804e1f7888bSalnsn }
805e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_modulo_k,tc)806e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
807e1f7888bSalnsn {
808e1f7888bSalnsn 	static struct bpf_insn insns[] = {
809e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
810e1f7888bSalnsn 
811e1f7888bSalnsn 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
812e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
813e1f7888bSalnsn 
814e1f7888bSalnsn 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
815e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
816e1f7888bSalnsn 
817e1f7888bSalnsn 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
818e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
819e1f7888bSalnsn 
820e1f7888bSalnsn 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
821e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
822e1f7888bSalnsn 
823e1f7888bSalnsn 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
824e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
825e1f7888bSalnsn 
826e1f7888bSalnsn 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
827e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
828e1f7888bSalnsn 
829e1f7888bSalnsn 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
830e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
831e1f7888bSalnsn 
832e1f7888bSalnsn 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
833e1f7888bSalnsn 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
834e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
835e1f7888bSalnsn 
836e1f7888bSalnsn 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
837e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
838e1f7888bSalnsn 
839e1f7888bSalnsn 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
840e1f7888bSalnsn 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
841e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
842e1f7888bSalnsn 
843e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
844e1f7888bSalnsn 	};
845e1f7888bSalnsn 
846e1f7888bSalnsn 	bpfjit_func_t code;
847e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
848e1f7888bSalnsn 
849e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
850e1f7888bSalnsn 
851e1f7888bSalnsn 	RZ(rump_init());
852e1f7888bSalnsn 
853e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
854e1f7888bSalnsn 
855e1f7888bSalnsn 	rump_schedule();
856e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
857e1f7888bSalnsn 	rump_unschedule();
858e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
859e1f7888bSalnsn 
860e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
861e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
862e1f7888bSalnsn 
863e1f7888bSalnsn 	rump_schedule();
864e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
865e1f7888bSalnsn 	rump_unschedule();
866e1f7888bSalnsn }
867e1f7888bSalnsn 
868e1f7888bSalnsn ATF_TC(bpfjit_alu_add_x);
ATF_TC_HEAD(bpfjit_alu_add_x,tc)869e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_add_x, tc)
870e1f7888bSalnsn {
871e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
872e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
873e1f7888bSalnsn }
874e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_add_x,tc)875e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_add_x, tc)
876e1f7888bSalnsn {
877e1f7888bSalnsn 	static struct bpf_insn insns[] = {
878e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
879e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
880e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
881e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
882e1f7888bSalnsn 	};
883e1f7888bSalnsn 
884e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
885e1f7888bSalnsn 
886e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
887e1f7888bSalnsn 
888e1f7888bSalnsn 	RZ(rump_init());
889e1f7888bSalnsn 
890e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
891e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
892e1f7888bSalnsn }
893e1f7888bSalnsn 
894e1f7888bSalnsn ATF_TC(bpfjit_alu_sub_x);
ATF_TC_HEAD(bpfjit_alu_sub_x,tc)895e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
896e1f7888bSalnsn {
897e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
898e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
899e1f7888bSalnsn }
900e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_sub_x,tc)901e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_sub_x, tc)
902e1f7888bSalnsn {
903e1f7888bSalnsn 	static struct bpf_insn insns[] = {
904e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 1),
905e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
906e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
907e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
908e1f7888bSalnsn 	};
909e1f7888bSalnsn 
910e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
911e1f7888bSalnsn 
912e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
913e1f7888bSalnsn 
914e1f7888bSalnsn 	RZ(rump_init());
915e1f7888bSalnsn 
916e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
917e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
918e1f7888bSalnsn }
919e1f7888bSalnsn 
920e1f7888bSalnsn ATF_TC(bpfjit_alu_mul_x);
ATF_TC_HEAD(bpfjit_alu_mul_x,tc)921e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
922e1f7888bSalnsn {
923e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
924e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
925e1f7888bSalnsn }
926e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_mul_x,tc)927e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_mul_x, tc)
928e1f7888bSalnsn {
929e1f7888bSalnsn 	static struct bpf_insn insns[] = {
930e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
931e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
932e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
933e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
934e1f7888bSalnsn 	};
935e1f7888bSalnsn 
936e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
937e1f7888bSalnsn 
938e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
939e1f7888bSalnsn 
940e1f7888bSalnsn 	RZ(rump_init());
941e1f7888bSalnsn 
942e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
943e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
944e1f7888bSalnsn }
945e1f7888bSalnsn 
946e1f7888bSalnsn ATF_TC(bpfjit_alu_div0_x);
ATF_TC_HEAD(bpfjit_alu_div0_x,tc)947e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
948e1f7888bSalnsn {
949e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
950e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
951e1f7888bSalnsn }
952e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div0_x,tc)953e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div0_x, tc)
954e1f7888bSalnsn {
955e1f7888bSalnsn 	static struct bpf_insn insns[] = {
956e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
957e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
958e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
959e1f7888bSalnsn 	};
960e1f7888bSalnsn 
961e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
962e1f7888bSalnsn 
963e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
964e1f7888bSalnsn 
965e1f7888bSalnsn 	RZ(rump_init());
966e1f7888bSalnsn 
967e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
968e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
969e1f7888bSalnsn }
970e1f7888bSalnsn 
971e1f7888bSalnsn ATF_TC(bpfjit_alu_div1_x);
ATF_TC_HEAD(bpfjit_alu_div1_x,tc)972e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
973e1f7888bSalnsn {
974e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
975e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
976e1f7888bSalnsn }
977e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div1_x,tc)978e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div1_x, tc)
979e1f7888bSalnsn {
980e1f7888bSalnsn 	static struct bpf_insn insns[] = {
981e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
982e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
983e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
984e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
985e1f7888bSalnsn 	};
986e1f7888bSalnsn 
987e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
988e1f7888bSalnsn 
989e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
990e1f7888bSalnsn 
991e1f7888bSalnsn 	RZ(rump_init());
992e1f7888bSalnsn 
993e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
994e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
995e1f7888bSalnsn }
996e1f7888bSalnsn 
997e1f7888bSalnsn ATF_TC(bpfjit_alu_div2_x);
ATF_TC_HEAD(bpfjit_alu_div2_x,tc)998e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
999e1f7888bSalnsn {
1000e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1001e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
1002e1f7888bSalnsn }
1003e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div2_x,tc)1004e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div2_x, tc)
1005e1f7888bSalnsn {
1006e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1007e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1008e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1009e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1010e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1011e1f7888bSalnsn 	};
1012e1f7888bSalnsn 
1013e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1014e1f7888bSalnsn 
1015e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1016e1f7888bSalnsn 
1017e1f7888bSalnsn 	RZ(rump_init());
1018e1f7888bSalnsn 
1019e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1020e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
1021e1f7888bSalnsn }
1022e1f7888bSalnsn 
1023e1f7888bSalnsn ATF_TC(bpfjit_alu_div4_x);
ATF_TC_HEAD(bpfjit_alu_div4_x,tc)1024e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
1025e1f7888bSalnsn {
1026e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1027e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
1028e1f7888bSalnsn }
1029e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div4_x,tc)1030e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div4_x, tc)
1031e1f7888bSalnsn {
1032e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1033e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1034e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1035e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1036e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1037e1f7888bSalnsn 	};
1038e1f7888bSalnsn 
1039e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1040e1f7888bSalnsn 
1041e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1042e1f7888bSalnsn 
1043e1f7888bSalnsn 	RZ(rump_init());
1044e1f7888bSalnsn 
1045e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1046e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
1047e1f7888bSalnsn }
1048e1f7888bSalnsn 
1049e1f7888bSalnsn ATF_TC(bpfjit_alu_div10_x);
ATF_TC_HEAD(bpfjit_alu_div10_x,tc)1050e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
1051e1f7888bSalnsn {
1052e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1053e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
1054e1f7888bSalnsn }
1055e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div10_x,tc)1056e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div10_x, tc)
1057e1f7888bSalnsn {
1058e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1059e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1060e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1061e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1062e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1063e1f7888bSalnsn 	};
1064e1f7888bSalnsn 
1065e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1066e1f7888bSalnsn 
1067e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1068e1f7888bSalnsn 
1069e1f7888bSalnsn 	RZ(rump_init());
1070e1f7888bSalnsn 
1071e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1072e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
1073e1f7888bSalnsn }
1074e1f7888bSalnsn 
1075e1f7888bSalnsn ATF_TC(bpfjit_alu_div10000_x);
ATF_TC_HEAD(bpfjit_alu_div10000_x,tc)1076e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
1077e1f7888bSalnsn {
1078e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1079e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
1080e1f7888bSalnsn }
1081e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div10000_x,tc)1082e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
1083e1f7888bSalnsn {
1084e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1085e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1086e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1087e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1088e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1089e1f7888bSalnsn 	};
1090e1f7888bSalnsn 
1091e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1092e1f7888bSalnsn 
1093e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1094e1f7888bSalnsn 
1095e1f7888bSalnsn 	RZ(rump_init());
1096e1f7888bSalnsn 
1097e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1098e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
1099e1f7888bSalnsn }
1100e1f7888bSalnsn 
1101e1f7888bSalnsn ATF_TC(bpfjit_alu_div7609801_x);
ATF_TC_HEAD(bpfjit_alu_div7609801_x,tc)1102e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
1103e1f7888bSalnsn {
1104e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1105e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
1106e1f7888bSalnsn }
1107e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div7609801_x,tc)1108e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
1109e1f7888bSalnsn {
1110e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1111e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1112e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1113e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1114e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1115e1f7888bSalnsn 	};
1116e1f7888bSalnsn 
1117e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1118e1f7888bSalnsn 
1119e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1120e1f7888bSalnsn 
1121e1f7888bSalnsn 	RZ(rump_init());
1122e1f7888bSalnsn 
1123e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1124e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
1125e1f7888bSalnsn }
1126e1f7888bSalnsn 
1127e1f7888bSalnsn ATF_TC(bpfjit_alu_div80000000_x);
ATF_TC_HEAD(bpfjit_alu_div80000000_x,tc)1128e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
1129e1f7888bSalnsn {
1130e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1131e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
1132e1f7888bSalnsn }
1133e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_div80000000_x,tc)1134e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
1135e1f7888bSalnsn {
1136e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1137215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1138e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1139e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1140e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1141e1f7888bSalnsn 	};
1142e1f7888bSalnsn 
1143e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1144e1f7888bSalnsn 
1145e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1146e1f7888bSalnsn 
1147e1f7888bSalnsn 	RZ(rump_init());
1148e1f7888bSalnsn 
1149e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1150e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
1151e1f7888bSalnsn }
1152e1f7888bSalnsn 
1153215bab86Salnsn ATF_TC(bpfjit_alu_mod0_x);
ATF_TC_HEAD(bpfjit_alu_mod0_x,tc)1154215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod0_x, tc)
1155215bab86Salnsn {
1156215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1157215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0");
1158215bab86Salnsn }
1159215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod0_x,tc)1160215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod0_x, tc)
1161215bab86Salnsn {
1162215bab86Salnsn 	static struct bpf_insn insns[] = {
1163215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1164215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1165215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1166215bab86Salnsn 	};
1167215bab86Salnsn 
1168215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1169215bab86Salnsn 
1170215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1171215bab86Salnsn 
1172215bab86Salnsn 	RZ(rump_init());
1173215bab86Salnsn 
1174215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1175215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
1176215bab86Salnsn }
1177215bab86Salnsn 
1178215bab86Salnsn ATF_TC(bpfjit_alu_mod1_x);
ATF_TC_HEAD(bpfjit_alu_mod1_x,tc)1179215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod1_x, tc)
1180215bab86Salnsn {
1181215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1182215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=1");
1183215bab86Salnsn }
1184215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod1_x,tc)1185215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod1_x, tc)
1186215bab86Salnsn {
1187215bab86Salnsn 	static struct bpf_insn insns[] = {
1188215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1189215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1190215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1191215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1192215bab86Salnsn 	};
1193215bab86Salnsn 
1194215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1195215bab86Salnsn 
1196215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1197215bab86Salnsn 
1198215bab86Salnsn 	RZ(rump_init());
1199215bab86Salnsn 
1200215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1201215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
1202215bab86Salnsn }
1203215bab86Salnsn 
1204215bab86Salnsn ATF_TC(bpfjit_alu_mod2_x);
ATF_TC_HEAD(bpfjit_alu_mod2_x,tc)1205215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod2_x, tc)
1206215bab86Salnsn {
1207215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1208215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=2");
1209215bab86Salnsn }
1210215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod2_x,tc)1211215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod2_x, tc)
1212215bab86Salnsn {
1213215bab86Salnsn 	static struct bpf_insn insns[] = {
1214215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1215215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1216215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1217215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1218215bab86Salnsn 	};
1219215bab86Salnsn 
1220215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1221215bab86Salnsn 
1222215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1223215bab86Salnsn 
1224215bab86Salnsn 	RZ(rump_init());
1225215bab86Salnsn 
1226215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1227215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
1228215bab86Salnsn }
1229215bab86Salnsn 
1230215bab86Salnsn ATF_TC(bpfjit_alu_mod4_x);
ATF_TC_HEAD(bpfjit_alu_mod4_x,tc)1231215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod4_x, tc)
1232215bab86Salnsn {
1233215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1234215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=4");
1235215bab86Salnsn }
1236215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod4_x,tc)1237215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod4_x, tc)
1238215bab86Salnsn {
1239215bab86Salnsn 	static struct bpf_insn insns[] = {
1240215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1241215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1242215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1243215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1244215bab86Salnsn 	};
1245215bab86Salnsn 
1246215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1247215bab86Salnsn 
1248215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1249215bab86Salnsn 
1250215bab86Salnsn 	RZ(rump_init());
1251215bab86Salnsn 
1252215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1253215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
1254215bab86Salnsn }
1255215bab86Salnsn 
1256215bab86Salnsn ATF_TC(bpfjit_alu_mod10_x);
ATF_TC_HEAD(bpfjit_alu_mod10_x,tc)1257215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod10_x, tc)
1258215bab86Salnsn {
1259215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1260215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10");
1261215bab86Salnsn }
1262215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod10_x,tc)1263215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod10_x, tc)
1264215bab86Salnsn {
1265215bab86Salnsn 	static struct bpf_insn insns[] = {
1266215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1267215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1268215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1269215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1270215bab86Salnsn 	};
1271215bab86Salnsn 
1272215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1273215bab86Salnsn 
1274215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1275215bab86Salnsn 
1276215bab86Salnsn 	RZ(rump_init());
1277215bab86Salnsn 
1278215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1279215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 9);
1280215bab86Salnsn }
1281215bab86Salnsn 
1282215bab86Salnsn ATF_TC(bpfjit_alu_mod10000_x);
ATF_TC_HEAD(bpfjit_alu_mod10000_x,tc)1283215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod10000_x, tc)
1284215bab86Salnsn {
1285215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1286215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10000");
1287215bab86Salnsn }
1288215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod10000_x,tc)1289215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod10000_x, tc)
1290215bab86Salnsn {
1291215bab86Salnsn 	static struct bpf_insn insns[] = {
1292215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1293215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1294215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1295215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1296215bab86Salnsn 	};
1297215bab86Salnsn 
1298215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1299215bab86Salnsn 
1300215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1301215bab86Salnsn 
1302215bab86Salnsn 	RZ(rump_init());
1303215bab86Salnsn 
1304215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1305215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3849);
1306215bab86Salnsn }
1307215bab86Salnsn 
1308215bab86Salnsn ATF_TC(bpfjit_alu_mod7609801_x);
ATF_TC_HEAD(bpfjit_alu_mod7609801_x,tc)1309215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod7609801_x, tc)
1310215bab86Salnsn {
1311215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1312215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=7609801");
1313215bab86Salnsn }
1314215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod7609801_x,tc)1315215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod7609801_x, tc)
1316215bab86Salnsn {
1317215bab86Salnsn 	static struct bpf_insn insns[] = {
1318215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1319215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1320215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1321215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1322215bab86Salnsn 	};
1323215bab86Salnsn 
1324215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1325215bab86Salnsn 
1326215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1327215bab86Salnsn 
1328215bab86Salnsn 	RZ(rump_init());
1329215bab86Salnsn 
1330215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1331215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3039531);
1332215bab86Salnsn }
1333215bab86Salnsn 
1334215bab86Salnsn ATF_TC(bpfjit_alu_mod80000000_x);
ATF_TC_HEAD(bpfjit_alu_mod80000000_x,tc)1335215bab86Salnsn ATF_TC_HEAD(bpfjit_alu_mod80000000_x, tc)
1336215bab86Salnsn {
1337215bab86Salnsn 	atf_tc_set_md_var(tc, "descr",
1338215bab86Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0x80000000");
1339215bab86Salnsn }
1340215bab86Salnsn 
ATF_TC_BODY(bpfjit_alu_mod80000000_x,tc)1341215bab86Salnsn ATF_TC_BODY(bpfjit_alu_mod80000000_x, tc)
1342215bab86Salnsn {
1343215bab86Salnsn 	static struct bpf_insn insns[] = {
1344215bab86Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1345215bab86Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1346215bab86Salnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1347215bab86Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1348215bab86Salnsn 	};
1349215bab86Salnsn 
1350215bab86Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1351215bab86Salnsn 
1352215bab86Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1353215bab86Salnsn 
1354215bab86Salnsn 	RZ(rump_init());
1355215bab86Salnsn 
1356215bab86Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1357215bab86Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_C(0x7fffffde));
1358215bab86Salnsn }
1359215bab86Salnsn 
1360e1f7888bSalnsn ATF_TC(bpfjit_alu_and_x);
ATF_TC_HEAD(bpfjit_alu_and_x,tc)1361e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_and_x, tc)
1362e1f7888bSalnsn {
1363e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1364e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
1365e1f7888bSalnsn }
1366e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_and_x,tc)1367e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_and_x, tc)
1368e1f7888bSalnsn {
1369e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1370e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
1371e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
1372e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1373e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1374e1f7888bSalnsn 	};
1375e1f7888bSalnsn 
1376e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1377e1f7888bSalnsn 
1378e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1379e1f7888bSalnsn 
1380e1f7888bSalnsn 	RZ(rump_init());
1381e1f7888bSalnsn 
1382e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1383e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
1384e1f7888bSalnsn }
1385e1f7888bSalnsn 
1386e1f7888bSalnsn ATF_TC(bpfjit_alu_or_x);
ATF_TC_HEAD(bpfjit_alu_or_x,tc)1387e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_or_x, tc)
1388e1f7888bSalnsn {
1389e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1390e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1391e1f7888bSalnsn }
1392e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_or_x,tc)1393e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_or_x, tc)
1394e1f7888bSalnsn {
1395e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1396e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1397e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1398e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1399e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1400e1f7888bSalnsn 	};
1401e1f7888bSalnsn 
1402e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1403e1f7888bSalnsn 
1404e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1405e1f7888bSalnsn 
1406e1f7888bSalnsn 	RZ(rump_init());
1407e1f7888bSalnsn 
1408e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1409e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1410e1f7888bSalnsn }
1411e1f7888bSalnsn 
1412b61069b6Salnsn ATF_TC(bpfjit_alu_xor_x);
ATF_TC_HEAD(bpfjit_alu_xor_x,tc)1413b61069b6Salnsn ATF_TC_HEAD(bpfjit_alu_xor_x, tc)
1414b61069b6Salnsn {
1415b61069b6Salnsn 	atf_tc_set_md_var(tc, "descr",
1416b61069b6Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X");
1417b61069b6Salnsn }
1418b61069b6Salnsn 
ATF_TC_BODY(bpfjit_alu_xor_x,tc)1419b61069b6Salnsn ATF_TC_BODY(bpfjit_alu_xor_x, tc)
1420b61069b6Salnsn {
1421b61069b6Salnsn 	static struct bpf_insn insns[] = {
1422b61069b6Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
1423b61069b6Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000b1e0),
1424b61069b6Salnsn 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0),
1425b61069b6Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1426b61069b6Salnsn 	};
1427b61069b6Salnsn 
1428b61069b6Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1429b61069b6Salnsn 
1430b61069b6Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1431b61069b6Salnsn 
1432b61069b6Salnsn 	RZ(rump_init());
1433b61069b6Salnsn 
1434b61069b6Salnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1435b61069b6Salnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1436b61069b6Salnsn }
1437b61069b6Salnsn 
1438e1f7888bSalnsn ATF_TC(bpfjit_alu_lsh_x);
ATF_TC_HEAD(bpfjit_alu_lsh_x,tc)1439e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
1440e1f7888bSalnsn {
1441e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1442e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1443e1f7888bSalnsn }
1444e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_lsh_x,tc)1445e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
1446e1f7888bSalnsn {
1447e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1448e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1449e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1450e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1451e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1452e1f7888bSalnsn 	};
1453e1f7888bSalnsn 
1454e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1455e1f7888bSalnsn 
1456e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1457e1f7888bSalnsn 
1458e1f7888bSalnsn 	RZ(rump_init());
1459e1f7888bSalnsn 
1460e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1461e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
1462e1f7888bSalnsn }
1463e1f7888bSalnsn 
1464e1f7888bSalnsn ATF_TC(bpfjit_alu_lsh0_x);
ATF_TC_HEAD(bpfjit_alu_lsh0_x,tc)1465e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
1466e1f7888bSalnsn {
1467e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1468e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1469e1f7888bSalnsn }
1470e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_lsh0_x,tc)1471e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
1472e1f7888bSalnsn {
1473e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1474e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1475e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1476e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1477e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1478e1f7888bSalnsn 	};
1479e1f7888bSalnsn 
1480e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1481e1f7888bSalnsn 
1482e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1483e1f7888bSalnsn 
1484e1f7888bSalnsn 	RZ(rump_init());
1485e1f7888bSalnsn 
1486e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1487e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1488e1f7888bSalnsn }
1489e1f7888bSalnsn 
1490e1f7888bSalnsn ATF_TC(bpfjit_alu_rsh_x);
ATF_TC_HEAD(bpfjit_alu_rsh_x,tc)1491e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
1492e1f7888bSalnsn {
1493e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1494e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1495e1f7888bSalnsn }
1496e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_rsh_x,tc)1497e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
1498e1f7888bSalnsn {
1499e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1500e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1501e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1502e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1503e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1504e1f7888bSalnsn 	};
1505e1f7888bSalnsn 
1506e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1507e1f7888bSalnsn 
1508e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1509e1f7888bSalnsn 
1510e1f7888bSalnsn 	RZ(rump_init());
1511e1f7888bSalnsn 
1512e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1513e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
1514e1f7888bSalnsn }
1515e1f7888bSalnsn 
1516e1f7888bSalnsn ATF_TC(bpfjit_alu_rsh0_x);
ATF_TC_HEAD(bpfjit_alu_rsh0_x,tc)1517e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
1518e1f7888bSalnsn {
1519e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1520e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1521e1f7888bSalnsn }
1522e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_rsh0_x,tc)1523e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
1524e1f7888bSalnsn {
1525e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1526e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1527e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1528e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1529e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1530e1f7888bSalnsn 	};
1531e1f7888bSalnsn 
1532e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1533e1f7888bSalnsn 
1534e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1535e1f7888bSalnsn 
1536e1f7888bSalnsn 	RZ(rump_init());
1537e1f7888bSalnsn 
1538e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1539e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1540e1f7888bSalnsn }
1541e1f7888bSalnsn 
1542e1f7888bSalnsn ATF_TC(bpfjit_alu_modulo_x);
ATF_TC_HEAD(bpfjit_alu_modulo_x,tc)1543e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
1544e1f7888bSalnsn {
1545e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1546e1f7888bSalnsn 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1547e1f7888bSalnsn }
1548e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_modulo_x,tc)1549e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
1550e1f7888bSalnsn {
1551e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1552e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1553e1f7888bSalnsn 
1554e1f7888bSalnsn 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1555e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1556e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1557e1f7888bSalnsn 
1558e1f7888bSalnsn 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1559e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1560e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1561e1f7888bSalnsn 
1562e1f7888bSalnsn 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1563e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1564e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1565e1f7888bSalnsn 
1566e1f7888bSalnsn 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1567e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1568e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1569e1f7888bSalnsn 
1570e1f7888bSalnsn 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1571e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1572e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1573e1f7888bSalnsn 
1574e1f7888bSalnsn 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1575e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1576e1f7888bSalnsn 
1577e1f7888bSalnsn 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1578e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1579e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1580e1f7888bSalnsn 
1581e1f7888bSalnsn 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1582e1f7888bSalnsn 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
1583e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1584e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1585e1f7888bSalnsn 
1586e1f7888bSalnsn 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1587e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1588e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1589e1f7888bSalnsn 
1590e1f7888bSalnsn 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1591e1f7888bSalnsn 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
1592e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1593e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1594e1f7888bSalnsn 
1595e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1596e1f7888bSalnsn 	};
1597e1f7888bSalnsn 
1598e1f7888bSalnsn 	bpfjit_func_t code;
1599e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1600e1f7888bSalnsn 
1601e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1602e1f7888bSalnsn 
1603e1f7888bSalnsn 	RZ(rump_init());
1604e1f7888bSalnsn 
1605e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1606e1f7888bSalnsn 
1607e1f7888bSalnsn 	rump_schedule();
1608e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1609e1f7888bSalnsn 	rump_unschedule();
1610e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
1611e1f7888bSalnsn 
1612e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1613e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
1614e1f7888bSalnsn 
1615e1f7888bSalnsn 	rump_schedule();
1616e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
1617e1f7888bSalnsn 	rump_unschedule();
1618e1f7888bSalnsn }
1619e1f7888bSalnsn 
1620e1f7888bSalnsn ATF_TC(bpfjit_alu_neg);
ATF_TC_HEAD(bpfjit_alu_neg,tc)1621e1f7888bSalnsn ATF_TC_HEAD(bpfjit_alu_neg, tc)
1622e1f7888bSalnsn {
1623e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1624e1f7888bSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_NEG");
1625e1f7888bSalnsn }
1626e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_alu_neg,tc)1627e1f7888bSalnsn ATF_TC_BODY(bpfjit_alu_neg, tc)
1628e1f7888bSalnsn {
1629e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1630e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 777),
1631e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1632e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1633e1f7888bSalnsn 	};
1634e1f7888bSalnsn 
1635e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1636e1f7888bSalnsn 
1637e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1638e1f7888bSalnsn 
1639e1f7888bSalnsn 	RZ(rump_init());
1640e1f7888bSalnsn 
1641e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1642e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0u-777u);
1643e1f7888bSalnsn }
1644e1f7888bSalnsn 
1645e1f7888bSalnsn ATF_TC(bpfjit_jmp_ja);
ATF_TC_HEAD(bpfjit_jmp_ja,tc)1646e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_ja, tc)
1647e1f7888bSalnsn {
1648e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1649e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JA");
1650e1f7888bSalnsn }
1651e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_ja,tc)1652e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_ja, tc)
1653e1f7888bSalnsn {
1654e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1655e1f7888bSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1656e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1657e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1658e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1659e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1660e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1661e1f7888bSalnsn 	};
1662e1f7888bSalnsn 
1663e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1664e1f7888bSalnsn 
1665e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1666e1f7888bSalnsn 
1667e1f7888bSalnsn 	RZ(rump_init());
1668e1f7888bSalnsn 
1669e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1670e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
1671e1f7888bSalnsn }
1672e1f7888bSalnsn 
1673fe765d60Salnsn ATF_TC(bpfjit_jmp_ja_invalid);
ATF_TC_HEAD(bpfjit_jmp_ja_invalid,tc)1674fe765d60Salnsn ATF_TC_HEAD(bpfjit_jmp_ja_invalid, tc)
1675fe765d60Salnsn {
1676fe765d60Salnsn 	atf_tc_set_md_var(tc, "descr",
1677fe765d60Salnsn 	    "Test BPF_JMP+BPF_JA to invalid destination");
1678fe765d60Salnsn }
1679fe765d60Salnsn 
ATF_TC_BODY(bpfjit_jmp_ja_invalid,tc)1680fe765d60Salnsn ATF_TC_BODY(bpfjit_jmp_ja_invalid, tc)
1681fe765d60Salnsn {
1682fe765d60Salnsn 	static struct bpf_insn insns[] = {
1683fe765d60Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, 4),
1684fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1685fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1686fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1687fe765d60Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1688fe765d60Salnsn 	};
1689fe765d60Salnsn 
1690fe765d60Salnsn 	bpfjit_func_t code;
1691fe765d60Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1692fe765d60Salnsn 
1693fe765d60Salnsn 	RZ(rump_init());
1694fe765d60Salnsn 
1695fe765d60Salnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
1696fe765d60Salnsn 
1697fe765d60Salnsn 	rump_schedule();
1698fe765d60Salnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1699fe765d60Salnsn 	rump_unschedule();
1700fe765d60Salnsn 	ATF_CHECK(code == NULL);
1701fe765d60Salnsn }
1702fe765d60Salnsn 
1703c57239cfSalnsn ATF_TC(bpfjit_jmp_ja_overflow);
ATF_TC_HEAD(bpfjit_jmp_ja_overflow,tc)1704c57239cfSalnsn ATF_TC_HEAD(bpfjit_jmp_ja_overflow, tc)
1705c57239cfSalnsn {
1706c57239cfSalnsn 	atf_tc_set_md_var(tc, "descr",
1707c57239cfSalnsn 	    "Test BPF_JMP+BPF_JA with negative offset");
1708c57239cfSalnsn }
1709c57239cfSalnsn 
ATF_TC_BODY(bpfjit_jmp_ja_overflow,tc)1710c57239cfSalnsn ATF_TC_BODY(bpfjit_jmp_ja_overflow, tc)
1711c57239cfSalnsn {
1712c57239cfSalnsn 	static struct bpf_insn insns[] = {
1713c57239cfSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1714c57239cfSalnsn 		BPF_STMT(BPF_RET+BPF_K, 777),
1715c57239cfSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, UINT32_MAX - 1), // -2
1716c57239cfSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0)
1717c57239cfSalnsn 	};
1718c57239cfSalnsn 
1719c57239cfSalnsn 	bpfjit_func_t code;
1720c57239cfSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1721c57239cfSalnsn 
1722c57239cfSalnsn 	RZ(rump_init());
1723c57239cfSalnsn 
1724c57239cfSalnsn 	/* Jumps with negative offsets work only in userspace. */
1725c57239cfSalnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
1726c57239cfSalnsn 
1727c57239cfSalnsn 	rump_schedule();
1728c57239cfSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1729c57239cfSalnsn 	rump_unschedule();
1730c57239cfSalnsn 	ATF_CHECK(code == NULL);
1731c57239cfSalnsn }
1732c57239cfSalnsn 
1733e1f7888bSalnsn ATF_TC(bpfjit_jmp_jgt_k);
ATF_TC_HEAD(bpfjit_jmp_jgt_k,tc)1734e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
1735e1f7888bSalnsn {
1736e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1737e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1738e1f7888bSalnsn }
1739e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jgt_k,tc)1740e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
1741e1f7888bSalnsn {
1742e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1743e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1744e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1745e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1746e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1747e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1748e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1749e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1750e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1751e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1752e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1753e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
1754e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
1755e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1756e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
1757e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1758e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
1759e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
1760e1f7888bSalnsn 	};
1761e1f7888bSalnsn 
1762e1f7888bSalnsn 	bpfjit_func_t code;
1763e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
1764e1f7888bSalnsn 
1765e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1766e1f7888bSalnsn 
1767e1f7888bSalnsn 	RZ(rump_init());
1768e1f7888bSalnsn 
1769e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1770e1f7888bSalnsn 
1771e1f7888bSalnsn 	rump_schedule();
1772e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1773e1f7888bSalnsn 	rump_unschedule();
1774e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
1775e1f7888bSalnsn 
1776e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1777e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1778e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1779e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1780e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1781e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1782e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1783e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1784e1f7888bSalnsn 
1785e1f7888bSalnsn 	rump_schedule();
1786e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
1787e1f7888bSalnsn 	rump_unschedule();
1788e1f7888bSalnsn }
1789e1f7888bSalnsn 
1790e1f7888bSalnsn ATF_TC(bpfjit_jmp_jge_k);
ATF_TC_HEAD(bpfjit_jmp_jge_k,tc)1791e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
1792e1f7888bSalnsn {
1793e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1794e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1795e1f7888bSalnsn }
1796e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jge_k,tc)1797e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
1798e1f7888bSalnsn {
1799e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1800e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1801e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1802e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1803e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1804e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1805e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1806e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1807e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1808e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1809e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1810e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
1811e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
1812e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1813e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
1814e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1815e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
1816e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
1817e1f7888bSalnsn 	};
1818e1f7888bSalnsn 
1819e1f7888bSalnsn 	bpfjit_func_t code;
1820e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
1821e1f7888bSalnsn 
1822e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1823e1f7888bSalnsn 
1824e1f7888bSalnsn 	RZ(rump_init());
1825e1f7888bSalnsn 
1826e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1827e1f7888bSalnsn 
1828e1f7888bSalnsn 	rump_schedule();
1829e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1830e1f7888bSalnsn 	rump_unschedule();
1831e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
1832e1f7888bSalnsn 
1833e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1834e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1835e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1836e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1837e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1838e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1839e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1840e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1841e1f7888bSalnsn 
1842e1f7888bSalnsn 	rump_schedule();
1843e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
1844e1f7888bSalnsn 	rump_unschedule();
1845e1f7888bSalnsn }
1846e1f7888bSalnsn 
1847e1f7888bSalnsn ATF_TC(bpfjit_jmp_jeq_k);
ATF_TC_HEAD(bpfjit_jmp_jeq_k,tc)1848e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
1849e1f7888bSalnsn {
1850e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1851e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1852e1f7888bSalnsn }
1853e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jeq_k,tc)1854e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
1855e1f7888bSalnsn {
1856e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1857e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1858e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1859e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1860e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1861e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1862e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1863e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1864e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1865e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1866e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1867e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
1868e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
1869e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1870e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
1871e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1872e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
1873e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
1874e1f7888bSalnsn 	};
1875e1f7888bSalnsn 
1876e1f7888bSalnsn 	bpfjit_func_t code;
1877e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
1878e1f7888bSalnsn 
1879e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1880e1f7888bSalnsn 
1881e1f7888bSalnsn 	RZ(rump_init());
1882e1f7888bSalnsn 
1883e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1884e1f7888bSalnsn 
1885e1f7888bSalnsn 	rump_schedule();
1886e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1887e1f7888bSalnsn 	rump_unschedule();
1888e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
1889e1f7888bSalnsn 
1890e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1891e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1892e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1893e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1894e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1895e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1896e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1897e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1898e1f7888bSalnsn 
1899e1f7888bSalnsn 	rump_schedule();
1900e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
1901e1f7888bSalnsn 	rump_unschedule();
1902e1f7888bSalnsn }
1903e1f7888bSalnsn 
1904e1f7888bSalnsn ATF_TC(bpfjit_jmp_jset_k);
ATF_TC_HEAD(bpfjit_jmp_jset_k,tc)1905e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
1906e1f7888bSalnsn {
1907e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1908e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1909e1f7888bSalnsn }
1910e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jset_k,tc)1911e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
1912e1f7888bSalnsn {
1913e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1914e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1915e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1916e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1917e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1918e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1919e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1920e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1921e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1922e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1923e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1924e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
1925e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
1926e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1927e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
1928e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1929e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
1930e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
1931e1f7888bSalnsn 	};
1932e1f7888bSalnsn 
1933e1f7888bSalnsn 	bpfjit_func_t code;
1934e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
1935e1f7888bSalnsn 
1936e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1937e1f7888bSalnsn 
1938e1f7888bSalnsn 	RZ(rump_init());
1939e1f7888bSalnsn 
1940e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
1941e1f7888bSalnsn 
1942e1f7888bSalnsn 	rump_schedule();
1943e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1944e1f7888bSalnsn 	rump_unschedule();
1945e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
1946e1f7888bSalnsn 
1947e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1948e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1949e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1950e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1951e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1952e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1953e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1954e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1955e1f7888bSalnsn 
1956e1f7888bSalnsn 	rump_schedule();
1957e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
1958e1f7888bSalnsn 	rump_unschedule();
1959e1f7888bSalnsn }
1960e1f7888bSalnsn 
1961e1f7888bSalnsn ATF_TC(bpfjit_jmp_modulo_k);
ATF_TC_HEAD(bpfjit_jmp_modulo_k,tc)1962e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
1963e1f7888bSalnsn {
1964e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
1965e1f7888bSalnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1966e1f7888bSalnsn }
1967e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_modulo_k,tc)1968e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
1969e1f7888bSalnsn {
1970e1f7888bSalnsn 	static struct bpf_insn insns[] = {
1971e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1972e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1973e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1974e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
1975e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1976e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
1977e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1978e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
1979e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1980e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1981e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1982e1f7888bSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1983e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
1984e1f7888bSalnsn 
1985e1f7888bSalnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1986e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1987e1f7888bSalnsn 
1988e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1989e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
1990e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1991e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
1992e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1993e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
1994e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1995e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1996e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1997e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1998e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
1999e1f7888bSalnsn 	};
2000e1f7888bSalnsn 
2001e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
2002e1f7888bSalnsn 
2003e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2004e1f7888bSalnsn 
2005e1f7888bSalnsn 	RZ(rump_init());
2006e1f7888bSalnsn 
2007e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2008e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2009e1f7888bSalnsn }
2010e1f7888bSalnsn 
2011e1f7888bSalnsn ATF_TC(bpfjit_jmp_jgt_x);
ATF_TC_HEAD(bpfjit_jmp_jgt_x,tc)2012e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
2013e1f7888bSalnsn {
2014e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2015e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
2016e1f7888bSalnsn }
2017e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jgt_x,tc)2018e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
2019e1f7888bSalnsn {
2020e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2021e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2022e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2023e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2024e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
2025e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2026e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2027e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2028e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
2029e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
2030e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
2031e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
2032e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
2033e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2034e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
2035e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
2036e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
2037e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
2038e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2039e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
2040e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
2041e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
2042e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
2043e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
2044e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
2045e1f7888bSalnsn 	};
2046e1f7888bSalnsn 
2047e1f7888bSalnsn 	bpfjit_func_t code;
2048e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2049e1f7888bSalnsn 
2050e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2051e1f7888bSalnsn 
2052e1f7888bSalnsn 	RZ(rump_init());
2053e1f7888bSalnsn 
2054e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2055e1f7888bSalnsn 
2056e1f7888bSalnsn 	rump_schedule();
2057e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2058e1f7888bSalnsn 	rump_unschedule();
2059e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2060e1f7888bSalnsn 
2061e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2062e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2063e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
2064e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2065e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2066e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2067e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2068e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2069e1f7888bSalnsn 
2070e1f7888bSalnsn 	rump_schedule();
2071e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2072e1f7888bSalnsn 	rump_unschedule();
2073e1f7888bSalnsn }
2074e1f7888bSalnsn 
2075e1f7888bSalnsn ATF_TC(bpfjit_jmp_jge_x);
ATF_TC_HEAD(bpfjit_jmp_jge_x,tc)2076e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
2077e1f7888bSalnsn {
2078e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2079e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
2080e1f7888bSalnsn }
2081e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jge_x,tc)2082e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
2083e1f7888bSalnsn {
2084e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2085e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2086e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2087e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2088e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
2089e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2090e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
2091e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2092e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
2093e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
2094e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2095e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
2096e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
2097e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2098e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
2099e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
2100e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
2101e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
2102e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2103e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
2104e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
2105e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
2106e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
2107e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
2108e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
2109e1f7888bSalnsn 	};
2110e1f7888bSalnsn 
2111e1f7888bSalnsn 	bpfjit_func_t code;
2112e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2113e1f7888bSalnsn 
2114e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2115e1f7888bSalnsn 
2116e1f7888bSalnsn 	RZ(rump_init());
2117e1f7888bSalnsn 
2118e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2119e1f7888bSalnsn 
2120e1f7888bSalnsn 	rump_schedule();
2121e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2122e1f7888bSalnsn 	rump_unschedule();
2123e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2124e1f7888bSalnsn 
2125e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2126e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2127e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
2128e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2129e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2130e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2131e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2132e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2133e1f7888bSalnsn 
2134e1f7888bSalnsn 	rump_schedule();
2135e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2136e1f7888bSalnsn 	rump_unschedule();
2137e1f7888bSalnsn }
2138e1f7888bSalnsn 
2139e1f7888bSalnsn ATF_TC(bpfjit_jmp_jeq_x);
ATF_TC_HEAD(bpfjit_jmp_jeq_x,tc)2140e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
2141e1f7888bSalnsn {
2142e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2143e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
2144e1f7888bSalnsn }
2145e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jeq_x,tc)2146e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
2147e1f7888bSalnsn {
2148e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2149e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2150e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2151e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
215273969c29Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
2153e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2154e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
2155e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2156e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
2157e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
215873969c29Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
215973969c29Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
216073969c29Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
2161e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2162e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
2163e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
2164e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
216573969c29Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
2166e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2167e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
2168e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
216973969c29Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
217073969c29Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8),
217173969c29Salnsn 		BPF_STMT(BPF_RET+BPF_K, 9)
2172e1f7888bSalnsn 	};
2173e1f7888bSalnsn 
2174e1f7888bSalnsn 	bpfjit_func_t code;
2175e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2176e1f7888bSalnsn 
2177e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2178e1f7888bSalnsn 
2179e1f7888bSalnsn 	RZ(rump_init());
2180e1f7888bSalnsn 
2181e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2182e1f7888bSalnsn 
2183e1f7888bSalnsn 	rump_schedule();
2184e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2185e1f7888bSalnsn 	rump_unschedule();
2186e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2187e1f7888bSalnsn 
218873969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 8);
218973969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 8);
219073969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 2);
219173969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 8);
219273969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 3);
219373969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 9);
219473969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 6);
219573969c29Salnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 1);
2196e1f7888bSalnsn 
2197e1f7888bSalnsn 	rump_schedule();
2198e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2199e1f7888bSalnsn 	rump_unschedule();
2200e1f7888bSalnsn }
2201e1f7888bSalnsn 
2202e1f7888bSalnsn ATF_TC(bpfjit_jmp_jset_x);
ATF_TC_HEAD(bpfjit_jmp_jset_x,tc)2203e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
2204e1f7888bSalnsn {
2205e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2206e1f7888bSalnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
2207e1f7888bSalnsn }
2208e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_jset_x,tc)2209e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
2210e1f7888bSalnsn {
2211e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2212e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2213e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2214e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
2215e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
2216e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
2217e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
2218e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
2219e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
2220e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2221e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
2222e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
2223e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
2224e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
2225e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
2226e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
2227e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
2228e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2229e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
2230e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
2231e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2232e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
2233e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
2234e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
2235e1f7888bSalnsn 	};
2236e1f7888bSalnsn 
2237e1f7888bSalnsn 	bpfjit_func_t code;
2238e1f7888bSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2239e1f7888bSalnsn 
2240e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2241e1f7888bSalnsn 
2242e1f7888bSalnsn 	RZ(rump_init());
2243e1f7888bSalnsn 
2244e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2245e1f7888bSalnsn 
2246e1f7888bSalnsn 	rump_schedule();
2247e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2248e1f7888bSalnsn 	rump_unschedule();
2249e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2250e1f7888bSalnsn 
2251e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2252e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2253e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
2254e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2255e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
2256e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2257e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2258e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2259e1f7888bSalnsn 
2260e1f7888bSalnsn 	rump_schedule();
2261e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2262e1f7888bSalnsn 	rump_unschedule();
2263e1f7888bSalnsn }
2264e1f7888bSalnsn 
226586cd3d4dSalnsn ATF_TC(bpfjit_jmp_jeq_x_noinit_ax);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax,tc)226686cd3d4dSalnsn ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax, tc)
226735489d09Salnsn {
226835489d09Salnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
226986cd3d4dSalnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X");
227035489d09Salnsn }
227135489d09Salnsn 
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax,tc)227286cd3d4dSalnsn ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax, tc)
227335489d09Salnsn {
227435489d09Salnsn 	static struct bpf_insn insns[] = {
227586cd3d4dSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
227686cd3d4dSalnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
227786cd3d4dSalnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
227835489d09Salnsn 	};
227935489d09Salnsn 
228035489d09Salnsn 	bpfjit_func_t code;
228135489d09Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
228235489d09Salnsn 
228335489d09Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
228435489d09Salnsn 
228535489d09Salnsn 	RZ(rump_init());
228635489d09Salnsn 
2287009978ddSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
228835489d09Salnsn 
228935489d09Salnsn 	rump_schedule();
229035489d09Salnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
229135489d09Salnsn 	rump_unschedule();
229235489d09Salnsn 	ATF_REQUIRE(code != NULL);
229335489d09Salnsn 
2294009978ddSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
229535489d09Salnsn 
229635489d09Salnsn 	rump_schedule();
229735489d09Salnsn 	rumpns_bpfjit_free_code(code);
229835489d09Salnsn 	rump_unschedule();
229935489d09Salnsn }
230035489d09Salnsn 
2301e3ced4adSalnsn ATF_TC(bpfjit_jmp_jeq_x_noinit_a);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_a,tc)2302e3ced4adSalnsn ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_a, tc)
2303e3ced4adSalnsn {
2304e3ced4adSalnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2305e3ced4adSalnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A");
2306e3ced4adSalnsn }
2307e3ced4adSalnsn 
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_a,tc)2308e3ced4adSalnsn ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_a, tc)
2309e3ced4adSalnsn {
2310e3ced4adSalnsn 	static struct bpf_insn insns[] = {
2311e3ced4adSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0), /* X > 0 */
2312e3ced4adSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2313e3ced4adSalnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
2314e3ced4adSalnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
2315e3ced4adSalnsn 	};
2316e3ced4adSalnsn 
2317e3ced4adSalnsn 	bpfjit_func_t code;
2318e3ced4adSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2319e3ced4adSalnsn 
2320e3ced4adSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2321e3ced4adSalnsn 
2322e3ced4adSalnsn 	RZ(rump_init());
2323e3ced4adSalnsn 
2324e3ced4adSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2325e3ced4adSalnsn 
2326e3ced4adSalnsn 	rump_schedule();
2327e3ced4adSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2328e3ced4adSalnsn 	rump_unschedule();
2329e3ced4adSalnsn 	ATF_REQUIRE(code != NULL);
2330e3ced4adSalnsn 
2331e3ced4adSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2332e3ced4adSalnsn 
2333e3ced4adSalnsn 	rump_schedule();
2334e3ced4adSalnsn 	rumpns_bpfjit_free_code(code);
2335e3ced4adSalnsn 	rump_unschedule();
2336e3ced4adSalnsn }
2337e3ced4adSalnsn 
2338e3ced4adSalnsn ATF_TC(bpfjit_jmp_jeq_x_noinit_x);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_x,tc)2339e3ced4adSalnsn ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_x, tc)
2340e3ced4adSalnsn {
2341e3ced4adSalnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2342e3ced4adSalnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
2343e3ced4adSalnsn }
2344e3ced4adSalnsn 
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_x,tc)2345e3ced4adSalnsn ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_x, tc)
2346e3ced4adSalnsn {
2347e3ced4adSalnsn 	static struct bpf_insn insns[] = {
2348e3ced4adSalnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0), /* A > 0 */
2349e3ced4adSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2350e3ced4adSalnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
2351e3ced4adSalnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
2352e3ced4adSalnsn 	};
2353e3ced4adSalnsn 
2354e3ced4adSalnsn 	bpfjit_func_t code;
2355e3ced4adSalnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
2356e3ced4adSalnsn 
2357e3ced4adSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2358e3ced4adSalnsn 
2359e3ced4adSalnsn 	RZ(rump_init());
2360e3ced4adSalnsn 
2361e3ced4adSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2362e3ced4adSalnsn 
2363e3ced4adSalnsn 	rump_schedule();
2364e3ced4adSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2365e3ced4adSalnsn 	rump_unschedule();
2366e3ced4adSalnsn 	ATF_REQUIRE(code != NULL);
2367e3ced4adSalnsn 
2368e3ced4adSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2369e3ced4adSalnsn 
2370e3ced4adSalnsn 	rump_schedule();
2371e3ced4adSalnsn 	rumpns_bpfjit_free_code(code);
2372e3ced4adSalnsn 	rump_unschedule();
2373e3ced4adSalnsn }
2374e3ced4adSalnsn 
2375e1f7888bSalnsn ATF_TC(bpfjit_jmp_modulo_x);
ATF_TC_HEAD(bpfjit_jmp_modulo_x,tc)2376e1f7888bSalnsn ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
2377e1f7888bSalnsn {
2378e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2379e1f7888bSalnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
2380e1f7888bSalnsn }
2381e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_jmp_modulo_x,tc)2382e1f7888bSalnsn ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
2383e1f7888bSalnsn {
2384e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2385e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
2386e1f7888bSalnsn 		/* FFFFF770 << 4 = FFFFF770 */
2387e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
2388e1f7888bSalnsn 
2389e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2390e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2391e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
2392e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2393e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
2394e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2395e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2396e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
2397e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2398e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2399e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2400e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2401e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2402e1f7888bSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
2403e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
2404e1f7888bSalnsn 
2405e1f7888bSalnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
2406e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
2407e1f7888bSalnsn 
2408e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2409e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2410e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
2411e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2412e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
2413e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2414e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2415e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
2416e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2417e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2418e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2419e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2420e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2421e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2422e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
2423e1f7888bSalnsn 	};
2424e1f7888bSalnsn 
2425e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
2426e1f7888bSalnsn 
2427e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2428e1f7888bSalnsn 
2429e1f7888bSalnsn 	RZ(rump_init());
2430e1f7888bSalnsn 
2431e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2432e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2433e1f7888bSalnsn }
2434e1f7888bSalnsn 
2435e1f7888bSalnsn ATF_TC(bpfjit_ld_abs);
ATF_TC_HEAD(bpfjit_ld_abs,tc)2436e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_abs, tc)
2437e1f7888bSalnsn {
2438e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2439e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS");
2440e1f7888bSalnsn }
2441e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_abs,tc)2442e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_abs, tc)
2443e1f7888bSalnsn {
2444e1f7888bSalnsn 	static struct bpf_insn insns[3][2] = {
2445e1f7888bSalnsn 		{
2446e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
2447e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2448e1f7888bSalnsn 		},
2449e1f7888bSalnsn 		{
2450e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
2451e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2452e1f7888bSalnsn 		},
2453e1f7888bSalnsn 		{
2454e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
2455e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2456e1f7888bSalnsn 		}
2457e1f7888bSalnsn 	};
2458e1f7888bSalnsn 
2459e1f7888bSalnsn 	static size_t lengths[3] = { 1, 2, 4 };
2460e1f7888bSalnsn 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
2461e1f7888bSalnsn 
2462e1f7888bSalnsn 	size_t i, l;
2463e1f7888bSalnsn 	uint8_t *pkt = deadbeef_at_5;
2464e1f7888bSalnsn 	size_t pktsize = sizeof(deadbeef_at_5);
2465e1f7888bSalnsn 
2466e1f7888bSalnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2467e1f7888bSalnsn 
2468e1f7888bSalnsn 	RZ(rump_init());
2469e1f7888bSalnsn 
2470e1f7888bSalnsn 	for (i = 0; i < 3; i++) {
2471e1f7888bSalnsn 		bpfjit_func_t code;
2472e1f7888bSalnsn 
2473e1f7888bSalnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
2474e1f7888bSalnsn 
2475e1f7888bSalnsn 		rump_schedule();
2476e1f7888bSalnsn 		code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
2477e1f7888bSalnsn 		rump_unschedule();
2478e1f7888bSalnsn 		ATF_REQUIRE(code != NULL);
2479e1f7888bSalnsn 
2480e1f7888bSalnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
2481e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2482e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2483e1f7888bSalnsn 		}
2484e1f7888bSalnsn 
2485e1f7888bSalnsn 		l = 5 + lengths[i];
2486e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2487e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2488e1f7888bSalnsn 
2489e1f7888bSalnsn 		l = pktsize;
2490e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2491e1f7888bSalnsn 
2492e1f7888bSalnsn 		rump_schedule();
2493e1f7888bSalnsn 		rumpns_bpfjit_free_code(code);
2494e1f7888bSalnsn 		rump_unschedule();
2495e1f7888bSalnsn 	}
2496e1f7888bSalnsn }
2497e1f7888bSalnsn 
2498e1f7888bSalnsn ATF_TC(bpfjit_ld_abs_k_overflow);
ATF_TC_HEAD(bpfjit_ld_abs_k_overflow,tc)2499e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
2500e1f7888bSalnsn {
2501e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2502e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
2503e1f7888bSalnsn }
2504e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_abs_k_overflow,tc)2505e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
2506e1f7888bSalnsn {
2507e1f7888bSalnsn 	static struct bpf_insn insns[12][3] = {
2508e1f7888bSalnsn 		{
2509e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2510e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2511e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2512e1f7888bSalnsn 		},
2513e1f7888bSalnsn 		{
2514e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2515e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2516e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2517e1f7888bSalnsn 		},
2518e1f7888bSalnsn 		{
2519e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2520e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2521e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2522e1f7888bSalnsn 		},
2523e1f7888bSalnsn 		{
2524e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2525e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2526e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2527e1f7888bSalnsn 		},
2528e1f7888bSalnsn 		{
2529e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2530e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2531e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2532e1f7888bSalnsn 		},
2533e1f7888bSalnsn 		{
2534e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2535e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2536e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2537e1f7888bSalnsn 		},
2538e1f7888bSalnsn 		{
2539e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2540e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2541e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2542e1f7888bSalnsn 		},
2543e1f7888bSalnsn 		{
2544e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2545e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2546e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2547e1f7888bSalnsn 		},
2548e1f7888bSalnsn 		{
2549e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2550e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2551e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2552e1f7888bSalnsn 		},
2553e1f7888bSalnsn 		{
2554e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2555e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2556e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2557e1f7888bSalnsn 		},
2558e1f7888bSalnsn 		{
2559e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2560e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2561e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2562e1f7888bSalnsn 		},
2563e1f7888bSalnsn 		{
2564e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2565e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2566e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2567e1f7888bSalnsn 		}
2568e1f7888bSalnsn 	};
2569e1f7888bSalnsn 
2570e1f7888bSalnsn 	int i;
2571e1f7888bSalnsn 	uint8_t pkt[8] = { 0 };
2572e1f7888bSalnsn 
2573e1f7888bSalnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2574e1f7888bSalnsn 
2575e1f7888bSalnsn 	RZ(rump_init());
2576e1f7888bSalnsn 
2577e1f7888bSalnsn 	for (i = 0; i < 3; i++) {
2578e1f7888bSalnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
2579e1f7888bSalnsn 		ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
2580e1f7888bSalnsn 	}
2581e1f7888bSalnsn }
2582e1f7888bSalnsn 
2583e1f7888bSalnsn ATF_TC(bpfjit_ld_ind);
ATF_TC_HEAD(bpfjit_ld_ind,tc)2584e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_ind, tc)
2585e1f7888bSalnsn {
2586e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2587e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_IND");
2588e1f7888bSalnsn }
2589e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_ind,tc)2590e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_ind, tc)
2591e1f7888bSalnsn {
2592e1f7888bSalnsn 	static struct bpf_insn insns[6][3] = {
2593e1f7888bSalnsn 		{
2594e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2595e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2596e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2597e1f7888bSalnsn 		},
2598e1f7888bSalnsn 		{
2599e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2600e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2601e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2602e1f7888bSalnsn 		},
2603e1f7888bSalnsn 		{
2604e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2605e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2606e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2607e1f7888bSalnsn 		},
2608e1f7888bSalnsn 		{
2609e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2610e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2611e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2612e1f7888bSalnsn 		},
2613e1f7888bSalnsn 		{
2614e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2615e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2616e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2617e1f7888bSalnsn 		},
2618e1f7888bSalnsn 		{
2619e1f7888bSalnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2620e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2621e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
2622e1f7888bSalnsn 		}
2623e1f7888bSalnsn 	};
2624e1f7888bSalnsn 
2625e1f7888bSalnsn 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2626e1f7888bSalnsn 
2627e1f7888bSalnsn 	static unsigned int expected[6] = {
2628e1f7888bSalnsn 		0xde, 0xdead, 0xdeadbeef,
2629e1f7888bSalnsn 		0xde, 0xdead, 0xdeadbeef
2630e1f7888bSalnsn 	};
2631e1f7888bSalnsn 
2632e1f7888bSalnsn 	size_t i, l;
2633e1f7888bSalnsn 	uint8_t *pkt = deadbeef_at_5;
2634e1f7888bSalnsn 	size_t pktsize = sizeof(deadbeef_at_5);
2635e1f7888bSalnsn 
2636e1f7888bSalnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2637e1f7888bSalnsn 
2638e1f7888bSalnsn 	RZ(rump_init());
2639e1f7888bSalnsn 
2640e1f7888bSalnsn 	for (i = 0; i < 3; i++) {
2641e1f7888bSalnsn 		bpfjit_func_t code;
2642e1f7888bSalnsn 
2643e1f7888bSalnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
2644e1f7888bSalnsn 
2645e1f7888bSalnsn 		rump_schedule();
2646e1f7888bSalnsn 		code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
2647e1f7888bSalnsn 		rump_unschedule();
2648e1f7888bSalnsn 		ATF_REQUIRE(code != NULL);
2649e1f7888bSalnsn 
2650e1f7888bSalnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
2651e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2652e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2653e1f7888bSalnsn 		}
2654e1f7888bSalnsn 
2655e1f7888bSalnsn 		l = 5 + lengths[i];
2656e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2657e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2658e1f7888bSalnsn 
2659e1f7888bSalnsn 		l = pktsize;
2660e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2661e1f7888bSalnsn 
2662e1f7888bSalnsn 		rump_schedule();
2663e1f7888bSalnsn 		rumpns_bpfjit_free_code(code);
2664e1f7888bSalnsn 		rump_unschedule();
2665e1f7888bSalnsn 	}
2666e1f7888bSalnsn }
2667e1f7888bSalnsn 
2668e1f7888bSalnsn ATF_TC(bpfjit_ld_ind_k_overflow);
ATF_TC_HEAD(bpfjit_ld_ind_k_overflow,tc)2669e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
2670e1f7888bSalnsn {
2671e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2672e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2673e1f7888bSalnsn }
2674e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_ind_k_overflow,tc)2675e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
2676e1f7888bSalnsn {
2677e1f7888bSalnsn 	static struct bpf_insn insns[12][3] = {
2678e1f7888bSalnsn 		{
2679e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2680e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2681e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2682e1f7888bSalnsn 		},
2683e1f7888bSalnsn 		{
2684e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2685e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2686e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2687e1f7888bSalnsn 		},
2688e1f7888bSalnsn 		{
2689e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2690e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2691e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2692e1f7888bSalnsn 		},
2693e1f7888bSalnsn 		{
2694e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2695e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2696e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2697e1f7888bSalnsn 		},
2698e1f7888bSalnsn 		{
2699e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2700e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2701e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2702e1f7888bSalnsn 		},
2703e1f7888bSalnsn 		{
2704e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2705e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2706e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2707e1f7888bSalnsn 		},
2708e1f7888bSalnsn 		{
2709e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2710e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2711e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2712e1f7888bSalnsn 		},
2713e1f7888bSalnsn 		{
2714e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2715e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2716e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2717e1f7888bSalnsn 		},
2718e1f7888bSalnsn 		{
2719e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2720e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2721e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2722e1f7888bSalnsn 		},
2723e1f7888bSalnsn 		{
2724e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2725e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2726e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2727e1f7888bSalnsn 		},
2728e1f7888bSalnsn 		{
2729e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2730e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2731e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2732e1f7888bSalnsn 		},
2733e1f7888bSalnsn 		{
2734e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2735e1f7888bSalnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2736e1f7888bSalnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
2737e1f7888bSalnsn 		}
2738e1f7888bSalnsn 	};
2739e1f7888bSalnsn 
2740e1f7888bSalnsn 	int i;
2741e1f7888bSalnsn 	uint8_t pkt[8] = { 0 };
2742e1f7888bSalnsn 
2743e1f7888bSalnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2744e1f7888bSalnsn 
2745e1f7888bSalnsn 	RZ(rump_init());
2746e1f7888bSalnsn 
2747e1f7888bSalnsn 	for (i = 0; i < 3; i++) {
2748e1f7888bSalnsn 
2749e1f7888bSalnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
2750e1f7888bSalnsn 		ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
2751e1f7888bSalnsn 	}
2752e1f7888bSalnsn }
2753e1f7888bSalnsn 
2754e1f7888bSalnsn ATF_TC(bpfjit_ld_ind_x_overflow1);
ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1,tc)2755e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2756e1f7888bSalnsn {
2757e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2758e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2759e1f7888bSalnsn }
2760e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_ind_x_overflow1,tc)2761e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2762e1f7888bSalnsn {
2763e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2764e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2765e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2766e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2767e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2768e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2769e1f7888bSalnsn 	};
2770e1f7888bSalnsn 
2771e1f7888bSalnsn 	size_t i;
2772e1f7888bSalnsn 	bpfjit_func_t code;
2773e1f7888bSalnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2774e1f7888bSalnsn 
2775e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2776e1f7888bSalnsn 
2777e1f7888bSalnsn 	RZ(rump_init());
2778e1f7888bSalnsn 
2779e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2780e1f7888bSalnsn 
2781e1f7888bSalnsn 	rump_schedule();
2782e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2783e1f7888bSalnsn 	rump_unschedule();
2784e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2785e1f7888bSalnsn 
2786e1f7888bSalnsn 	for (i = 1; i <= sizeof(pkt); i++) {
2787e1f7888bSalnsn 		//ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2788e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2789e1f7888bSalnsn 	}
2790e1f7888bSalnsn 
2791e1f7888bSalnsn 	rump_schedule();
2792e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2793e1f7888bSalnsn 	rump_unschedule();
2794e1f7888bSalnsn }
2795e1f7888bSalnsn 
2796e1f7888bSalnsn ATF_TC(bpfjit_ld_ind_x_overflow2);
ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2,tc)2797e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2798e1f7888bSalnsn {
2799e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2800e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2801e1f7888bSalnsn }
2802e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_ind_x_overflow2,tc)2803e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2804e1f7888bSalnsn {
2805e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2806e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2807e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2808e1f7888bSalnsn 		BPF_STMT(BPF_ST, 3),
2809e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2810e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2811e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2812e1f7888bSalnsn 	};
2813e1f7888bSalnsn 
2814e1f7888bSalnsn 	size_t i;
2815e1f7888bSalnsn 	bpfjit_func_t code;
2816e1f7888bSalnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2817e1f7888bSalnsn 
2818e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2819e1f7888bSalnsn 
2820e1f7888bSalnsn 	RZ(rump_init());
2821e1f7888bSalnsn 
2822e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2823e1f7888bSalnsn 
2824e1f7888bSalnsn 	rump_schedule();
2825e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2826e1f7888bSalnsn 	rump_unschedule();
2827e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2828e1f7888bSalnsn 
2829e1f7888bSalnsn 	for (i = 1; i <= sizeof(pkt); i++) {
2830e1f7888bSalnsn 		//ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2831e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2832e1f7888bSalnsn 	}
2833e1f7888bSalnsn 
2834e1f7888bSalnsn 	rump_schedule();
2835e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2836e1f7888bSalnsn 	rump_unschedule();
2837e1f7888bSalnsn }
2838e1f7888bSalnsn 
2839e1f7888bSalnsn ATF_TC(bpfjit_ld_len);
ATF_TC_HEAD(bpfjit_ld_len,tc)2840e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_len, tc)
2841e1f7888bSalnsn {
2842e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2843e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2844e1f7888bSalnsn }
2845e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_len,tc)2846e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_len, tc)
2847e1f7888bSalnsn {
2848e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2849e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2850e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2851e1f7888bSalnsn 	};
2852e1f7888bSalnsn 
2853e1f7888bSalnsn 	size_t i;
2854e1f7888bSalnsn 	bpfjit_func_t code;
2855e1f7888bSalnsn 	uint8_t pkt[32]; /* the program doesn't read any data */
2856e1f7888bSalnsn 
2857e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2858e1f7888bSalnsn 
2859e1f7888bSalnsn 	RZ(rump_init());
2860e1f7888bSalnsn 
2861e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2862e1f7888bSalnsn 
2863e1f7888bSalnsn 	rump_schedule();
2864e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2865e1f7888bSalnsn 	rump_unschedule();
2866e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2867e1f7888bSalnsn 
2868e1f7888bSalnsn 	for (i = 0; i < sizeof(pkt); i++)
2869e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2870e1f7888bSalnsn 
2871e1f7888bSalnsn 	rump_schedule();
2872e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2873e1f7888bSalnsn 	rump_unschedule();
2874e1f7888bSalnsn }
2875e1f7888bSalnsn 
2876e1f7888bSalnsn ATF_TC(bpfjit_ld_imm);
ATF_TC_HEAD(bpfjit_ld_imm,tc)2877e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ld_imm, tc)
2878e1f7888bSalnsn {
2879e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2880e1f7888bSalnsn 	    "Test JIT compilation of BPF_LD+BPF_IMM");
2881e1f7888bSalnsn }
2882e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ld_imm,tc)2883e1f7888bSalnsn ATF_TC_BODY(bpfjit_ld_imm, tc)
2884e1f7888bSalnsn {
2885e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2886e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2887e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2888e1f7888bSalnsn 	};
2889e1f7888bSalnsn 
2890e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
2891e1f7888bSalnsn 
2892e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2893e1f7888bSalnsn 
2894e1f7888bSalnsn 	RZ(rump_init());
2895e1f7888bSalnsn 
2896e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2897e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2898e1f7888bSalnsn }
2899e1f7888bSalnsn 
2900e1f7888bSalnsn ATF_TC(bpfjit_ldx_imm1);
ATF_TC_HEAD(bpfjit_ldx_imm1,tc)2901e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2902e1f7888bSalnsn {
2903e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2904e1f7888bSalnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2905e1f7888bSalnsn }
2906e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ldx_imm1,tc)2907e1f7888bSalnsn ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2908e1f7888bSalnsn {
2909e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2910e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2911e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2912e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2913e1f7888bSalnsn 	};
2914e1f7888bSalnsn 
2915e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
2916e1f7888bSalnsn 
2917e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2918e1f7888bSalnsn 
2919e1f7888bSalnsn 	RZ(rump_init());
2920e1f7888bSalnsn 
2921e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2922e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX - 5);
2923e1f7888bSalnsn }
2924e1f7888bSalnsn 
2925e1f7888bSalnsn ATF_TC(bpfjit_ldx_imm2);
ATF_TC_HEAD(bpfjit_ldx_imm2,tc)2926e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2927e1f7888bSalnsn {
2928e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2929e1f7888bSalnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2930e1f7888bSalnsn }
2931e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ldx_imm2,tc)2932e1f7888bSalnsn ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2933e1f7888bSalnsn {
2934e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2935e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2936e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2937e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2938e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
2939e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2940e1f7888bSalnsn 	};
2941e1f7888bSalnsn 
2942e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
2943e1f7888bSalnsn 
2944e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2945e1f7888bSalnsn 
2946e1f7888bSalnsn 	RZ(rump_init());
2947e1f7888bSalnsn 
2948e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2949e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2950e1f7888bSalnsn }
2951e1f7888bSalnsn 
2952e1f7888bSalnsn ATF_TC(bpfjit_ldx_len1);
ATF_TC_HEAD(bpfjit_ldx_len1,tc)2953e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2954e1f7888bSalnsn {
2955e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2956e1f7888bSalnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2957e1f7888bSalnsn }
2958e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ldx_len1,tc)2959e1f7888bSalnsn ATF_TC_BODY(bpfjit_ldx_len1, tc)
2960e1f7888bSalnsn {
2961e1f7888bSalnsn 	static struct bpf_insn insns[] = {
2962e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2963e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2964e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
2965e1f7888bSalnsn 	};
2966e1f7888bSalnsn 
2967e1f7888bSalnsn 	size_t i;
2968e1f7888bSalnsn 	bpfjit_func_t code;
2969e1f7888bSalnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
2970e1f7888bSalnsn 
2971e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2972e1f7888bSalnsn 
2973e1f7888bSalnsn 	RZ(rump_init());
2974e1f7888bSalnsn 
2975e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
2976e1f7888bSalnsn 
2977e1f7888bSalnsn 	rump_schedule();
2978e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2979e1f7888bSalnsn 	rump_unschedule();
2980e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
2981e1f7888bSalnsn 
2982e1f7888bSalnsn 	for (i = 1; i < sizeof(pkt); i++) {
2983e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2984e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2985e1f7888bSalnsn 	}
2986e1f7888bSalnsn 
2987e1f7888bSalnsn 	rump_schedule();
2988e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
2989e1f7888bSalnsn 	rump_unschedule();
2990e1f7888bSalnsn }
2991e1f7888bSalnsn 
2992e1f7888bSalnsn ATF_TC(bpfjit_ldx_len2);
ATF_TC_HEAD(bpfjit_ldx_len2,tc)2993e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2994e1f7888bSalnsn {
2995e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
2996e1f7888bSalnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2997e1f7888bSalnsn }
2998e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ldx_len2,tc)2999e1f7888bSalnsn ATF_TC_BODY(bpfjit_ldx_len2, tc)
3000e1f7888bSalnsn {
3001e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3002e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3003e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
3004e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
3005e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
3006e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
3007e1f7888bSalnsn 	};
3008e1f7888bSalnsn 
3009e1f7888bSalnsn 	bpfjit_func_t code;
3010e1f7888bSalnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
3011e1f7888bSalnsn 
3012e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3013e1f7888bSalnsn 
3014e1f7888bSalnsn 	RZ(rump_init());
3015e1f7888bSalnsn 
3016e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3017e1f7888bSalnsn 
3018e1f7888bSalnsn 	rump_schedule();
3019e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3020e1f7888bSalnsn 	rump_unschedule();
3021e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3022e1f7888bSalnsn 
3023e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
3024e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
3025e1f7888bSalnsn 
3026e1f7888bSalnsn 	rump_schedule();
3027e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3028e1f7888bSalnsn 	rump_unschedule();
3029e1f7888bSalnsn }
3030e1f7888bSalnsn 
3031e1f7888bSalnsn ATF_TC(bpfjit_ldx_msh);
ATF_TC_HEAD(bpfjit_ldx_msh,tc)3032e1f7888bSalnsn ATF_TC_HEAD(bpfjit_ldx_msh, tc)
3033e1f7888bSalnsn {
3034e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3035e1f7888bSalnsn 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
3036e1f7888bSalnsn }
3037e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_ldx_msh,tc)3038e1f7888bSalnsn ATF_TC_BODY(bpfjit_ldx_msh, tc)
3039e1f7888bSalnsn {
3040e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3041e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
3042e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3043e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3044e1f7888bSalnsn 	};
3045e1f7888bSalnsn 
3046e1f7888bSalnsn 	uint8_t pkt[2] = { 0, 0x7a };
3047e1f7888bSalnsn 
3048e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3049e1f7888bSalnsn 
3050e1f7888bSalnsn 	RZ(rump_init());
3051e1f7888bSalnsn 
3052e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3053e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 2) == 40);
3054e1f7888bSalnsn }
3055e1f7888bSalnsn 
3056e1f7888bSalnsn ATF_TC(bpfjit_misc_tax);
ATF_TC_HEAD(bpfjit_misc_tax,tc)3057e1f7888bSalnsn ATF_TC_HEAD(bpfjit_misc_tax, tc)
3058e1f7888bSalnsn {
3059e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3060e1f7888bSalnsn 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
3061e1f7888bSalnsn }
3062e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_misc_tax,tc)3063e1f7888bSalnsn ATF_TC_BODY(bpfjit_misc_tax, tc)
3064e1f7888bSalnsn {
3065e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3066e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
3067e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
3068e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
3069e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3070e1f7888bSalnsn 	};
3071e1f7888bSalnsn 
3072e1f7888bSalnsn 	uint8_t pkt[6] = { 0, 11, 22, 33, 44, 55 };
3073e1f7888bSalnsn 
3074e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3075e1f7888bSalnsn 
3076e1f7888bSalnsn 	RZ(rump_init());
3077e1f7888bSalnsn 
3078e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3079e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 6) == 55);
3080e1f7888bSalnsn }
3081e1f7888bSalnsn 
3082e1f7888bSalnsn ATF_TC(bpfjit_misc_txa);
ATF_TC_HEAD(bpfjit_misc_txa,tc)3083e1f7888bSalnsn ATF_TC_HEAD(bpfjit_misc_txa, tc)
3084e1f7888bSalnsn {
3085e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3086e1f7888bSalnsn 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
3087e1f7888bSalnsn }
3088e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_misc_txa,tc)3089e1f7888bSalnsn ATF_TC_BODY(bpfjit_misc_txa, tc)
3090e1f7888bSalnsn {
3091e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3092e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
3093e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
3094e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3095e1f7888bSalnsn 	};
3096e1f7888bSalnsn 
3097e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
3098e1f7888bSalnsn 
3099e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3100e1f7888bSalnsn 
3101e1f7888bSalnsn 	RZ(rump_init());
3102e1f7888bSalnsn 
3103e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3104e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 391);
3105e1f7888bSalnsn }
3106e1f7888bSalnsn 
3107e1f7888bSalnsn ATF_TC(bpfjit_st1);
ATF_TC_HEAD(bpfjit_st1,tc)3108e1f7888bSalnsn ATF_TC_HEAD(bpfjit_st1, tc)
3109e1f7888bSalnsn {
3110e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3111e1f7888bSalnsn 	    "Test JIT compilation of BPF_ST");
3112e1f7888bSalnsn }
3113e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_st1,tc)3114e1f7888bSalnsn ATF_TC_BODY(bpfjit_st1, tc)
3115e1f7888bSalnsn {
3116e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3117e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3118e1f7888bSalnsn 		BPF_STMT(BPF_ST, 0),
3119e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
3120e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3121e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3122e1f7888bSalnsn 	};
3123e1f7888bSalnsn 
3124e1f7888bSalnsn 	size_t i;
3125e1f7888bSalnsn 	bpfjit_func_t code;
3126e1f7888bSalnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
3127e1f7888bSalnsn 
3128e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3129e1f7888bSalnsn 
3130e1f7888bSalnsn 	RZ(rump_init());
3131e1f7888bSalnsn 
3132e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3133e1f7888bSalnsn 
3134e1f7888bSalnsn 	rump_schedule();
3135e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3136e1f7888bSalnsn 	rump_unschedule();
3137e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3138e1f7888bSalnsn 
3139e1f7888bSalnsn 	for (i = 1; i <= sizeof(pkt); i++)
3140e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3141e1f7888bSalnsn 
3142e1f7888bSalnsn 	rump_schedule();
3143e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3144e1f7888bSalnsn 	rump_unschedule();
3145e1f7888bSalnsn }
3146e1f7888bSalnsn 
3147e1f7888bSalnsn ATF_TC(bpfjit_st2);
ATF_TC_HEAD(bpfjit_st2,tc)3148e1f7888bSalnsn ATF_TC_HEAD(bpfjit_st2, tc)
3149e1f7888bSalnsn {
3150e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3151e1f7888bSalnsn 	    "Test JIT compilation of BPF_ST");
3152e1f7888bSalnsn }
3153e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_st2,tc)3154e1f7888bSalnsn ATF_TC_BODY(bpfjit_st2, tc)
3155e1f7888bSalnsn {
3156e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3157e1f7888bSalnsn 		BPF_STMT(BPF_ST, 0),
3158e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3159e1f7888bSalnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3160e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3161e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3162e1f7888bSalnsn 	};
3163e1f7888bSalnsn 
3164e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
3165e1f7888bSalnsn 
3166e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3167e1f7888bSalnsn 
3168e1f7888bSalnsn 	RZ(rump_init());
3169e1f7888bSalnsn 
3170e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3171e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
3172e1f7888bSalnsn }
3173e1f7888bSalnsn 
3174e1f7888bSalnsn ATF_TC(bpfjit_st3);
ATF_TC_HEAD(bpfjit_st3,tc)3175e1f7888bSalnsn ATF_TC_HEAD(bpfjit_st3, tc)
3176e1f7888bSalnsn {
3177e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3178e1f7888bSalnsn 	    "Test JIT compilation of BPF_ST");
3179e1f7888bSalnsn }
3180e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_st3,tc)3181e1f7888bSalnsn ATF_TC_BODY(bpfjit_st3, tc)
3182e1f7888bSalnsn {
3183e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3184e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3185e1f7888bSalnsn 		BPF_STMT(BPF_ST, 0),
3186e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3187e1f7888bSalnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3188e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3189e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3190e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3191e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
3192e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3193e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3194e1f7888bSalnsn 	};
3195e1f7888bSalnsn 
3196e1f7888bSalnsn 	bpfjit_func_t code;
3197e1f7888bSalnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
3198e1f7888bSalnsn 
3199e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3200e1f7888bSalnsn 
3201e1f7888bSalnsn 	ATF_REQUIRE(BPF_MEMWORDS > 1);
3202e1f7888bSalnsn 
3203e1f7888bSalnsn 	RZ(rump_init());
3204e1f7888bSalnsn 
3205e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3206e1f7888bSalnsn 
3207e1f7888bSalnsn 	rump_schedule();
3208e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3209e1f7888bSalnsn 	rump_unschedule();
3210e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3211e1f7888bSalnsn 
3212e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3213e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3214e1f7888bSalnsn 
3215e1f7888bSalnsn 	rump_schedule();
3216e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3217e1f7888bSalnsn 	rump_unschedule();
3218e1f7888bSalnsn }
3219e1f7888bSalnsn 
3220e1f7888bSalnsn ATF_TC(bpfjit_st4);
ATF_TC_HEAD(bpfjit_st4,tc)3221e1f7888bSalnsn ATF_TC_HEAD(bpfjit_st4, tc)
3222e1f7888bSalnsn {
3223e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3224e1f7888bSalnsn 	    "Test JIT compilation of BPF_ST");
3225e1f7888bSalnsn }
3226e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_st4,tc)3227e1f7888bSalnsn ATF_TC_BODY(bpfjit_st4, tc)
3228e1f7888bSalnsn {
3229e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3230e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3231e1f7888bSalnsn 		BPF_STMT(BPF_ST, 5),
3232e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3233e1f7888bSalnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3234e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3235e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3236e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3237e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
3238e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_MEM, 5),
3239e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3240e1f7888bSalnsn 	};
3241e1f7888bSalnsn 
3242e1f7888bSalnsn 	bpfjit_func_t code;
3243e1f7888bSalnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
3244e1f7888bSalnsn 
3245e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3246e1f7888bSalnsn 
3247e1f7888bSalnsn 	ATF_REQUIRE(BPF_MEMWORDS > 6);
3248e1f7888bSalnsn 
3249e1f7888bSalnsn 	RZ(rump_init());
3250e1f7888bSalnsn 
3251e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3252e1f7888bSalnsn 
3253e1f7888bSalnsn 	rump_schedule();
3254e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3255e1f7888bSalnsn 	rump_unschedule();
3256e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3257e1f7888bSalnsn 
3258e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3259e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3260e1f7888bSalnsn 
3261e1f7888bSalnsn 	rump_schedule();
3262e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3263e1f7888bSalnsn 	rump_unschedule();
3264e1f7888bSalnsn }
3265e1f7888bSalnsn 
3266e1f7888bSalnsn ATF_TC(bpfjit_st5);
ATF_TC_HEAD(bpfjit_st5,tc)3267e1f7888bSalnsn ATF_TC_HEAD(bpfjit_st5, tc)
3268e1f7888bSalnsn {
3269e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3270e1f7888bSalnsn 	    "Test JIT compilation of BPF_ST");
3271e1f7888bSalnsn }
3272e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_st5,tc)3273e1f7888bSalnsn ATF_TC_BODY(bpfjit_st5, tc)
3274e1f7888bSalnsn {
3275e1f7888bSalnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
3276e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3277e1f7888bSalnsn 
3278e1f7888bSalnsn 	size_t k;
3279e1f7888bSalnsn 	bpfjit_func_t code;
3280e1f7888bSalnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3281e1f7888bSalnsn 
3282e1f7888bSalnsn 	memset(insns, 0, sizeof(insns));
3283e1f7888bSalnsn 
3284e1f7888bSalnsn 	/* for each k do M[k] = k */
3285e1f7888bSalnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
3286e1f7888bSalnsn 		insns[2*k].code   = BPF_LD+BPF_IMM;
3287e1f7888bSalnsn 		insns[2*k].k      = 3*k;
3288e1f7888bSalnsn 		insns[2*k+1].code = BPF_ST;
3289e1f7888bSalnsn 		insns[2*k+1].k    = k;
3290e1f7888bSalnsn 	}
3291e1f7888bSalnsn 
3292e1f7888bSalnsn 	/* load wirelen into A */
3293e1f7888bSalnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3294e1f7888bSalnsn 
3295e1f7888bSalnsn 	/* for each k, if (A == k + 1) return M[k] */
3296e1f7888bSalnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
3297e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3298e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
3299e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
3300e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
3301e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3302e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
3303e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3304e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
3305e1f7888bSalnsn 	}
3306e1f7888bSalnsn 
3307e1f7888bSalnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3308e1f7888bSalnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
3309e1f7888bSalnsn 
3310e1f7888bSalnsn 	RZ(rump_init());
3311e1f7888bSalnsn 
3312e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3313e1f7888bSalnsn 
3314e1f7888bSalnsn 	rump_schedule();
3315e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3316e1f7888bSalnsn 	rump_unschedule();
3317e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3318e1f7888bSalnsn 
3319e1f7888bSalnsn 	for (k = 1; k <= sizeof(pkt); k++)
3320e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3321e1f7888bSalnsn 
3322e1f7888bSalnsn 	rump_schedule();
3323e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3324e1f7888bSalnsn 	rump_unschedule();
3325e1f7888bSalnsn }
3326e1f7888bSalnsn 
3327e1f7888bSalnsn ATF_TC(bpfjit_stx1);
ATF_TC_HEAD(bpfjit_stx1,tc)3328e1f7888bSalnsn ATF_TC_HEAD(bpfjit_stx1, tc)
3329e1f7888bSalnsn {
3330e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3331e1f7888bSalnsn 	    "Test JIT compilation of BPF_STX");
3332e1f7888bSalnsn }
3333e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_stx1,tc)3334e1f7888bSalnsn ATF_TC_BODY(bpfjit_stx1, tc)
3335e1f7888bSalnsn {
3336e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3337e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3338e1f7888bSalnsn 		BPF_STMT(BPF_STX, 0),
3339e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3340e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3341e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3342e1f7888bSalnsn 	};
3343e1f7888bSalnsn 
3344e1f7888bSalnsn 	size_t i;
3345e1f7888bSalnsn 	bpfjit_func_t code;
3346e1f7888bSalnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
3347e1f7888bSalnsn 
3348e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3349e1f7888bSalnsn 
3350e1f7888bSalnsn 	RZ(rump_init());
3351e1f7888bSalnsn 
3352e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3353e1f7888bSalnsn 
3354e1f7888bSalnsn 	rump_schedule();
3355e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3356e1f7888bSalnsn 	rump_unschedule();
3357e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3358e1f7888bSalnsn 
3359e1f7888bSalnsn 	for (i = 1; i <= sizeof(pkt); i++)
3360e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3361e1f7888bSalnsn 
3362e1f7888bSalnsn 	rump_schedule();
3363e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3364e1f7888bSalnsn 	rump_unschedule();
3365e1f7888bSalnsn }
3366e1f7888bSalnsn 
3367e1f7888bSalnsn ATF_TC(bpfjit_stx2);
ATF_TC_HEAD(bpfjit_stx2,tc)3368e1f7888bSalnsn ATF_TC_HEAD(bpfjit_stx2, tc)
3369e1f7888bSalnsn {
3370e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3371e1f7888bSalnsn 	    "Test JIT compilation of BPF_STX");
3372e1f7888bSalnsn }
3373e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_stx2,tc)3374e1f7888bSalnsn ATF_TC_BODY(bpfjit_stx2, tc)
3375e1f7888bSalnsn {
3376e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3377e1f7888bSalnsn 		BPF_STMT(BPF_ST, 0),
3378e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3379e1f7888bSalnsn 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
3380e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3381e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
3382e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3383e1f7888bSalnsn 	};
3384e1f7888bSalnsn 
3385e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
3386e1f7888bSalnsn 
3387e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3388e1f7888bSalnsn 
3389e1f7888bSalnsn 	RZ(rump_init());
3390e1f7888bSalnsn 
3391e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3392e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
3393e1f7888bSalnsn }
3394e1f7888bSalnsn 
3395e1f7888bSalnsn ATF_TC(bpfjit_stx3);
ATF_TC_HEAD(bpfjit_stx3,tc)3396e1f7888bSalnsn ATF_TC_HEAD(bpfjit_stx3, tc)
3397e1f7888bSalnsn {
3398e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3399e1f7888bSalnsn 	    "Test JIT compilation of BPF_STX");
3400e1f7888bSalnsn }
3401e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_stx3,tc)3402e1f7888bSalnsn ATF_TC_BODY(bpfjit_stx3, tc)
3403e1f7888bSalnsn {
3404e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3405e1f7888bSalnsn 		BPF_STMT(BPF_STX, 6),
3406e1f7888bSalnsn 		BPF_STMT(BPF_ST, 1),
3407e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3408e1f7888bSalnsn 		BPF_STMT(BPF_STX, 5),
3409e1f7888bSalnsn 		BPF_STMT(BPF_STX, 2),
3410e1f7888bSalnsn 		BPF_STMT(BPF_STX, 3),
3411e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
3412e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3413e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
3414e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3415e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
3416e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3417e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
3418e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3419e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
3420e1f7888bSalnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3421e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
3422e1f7888bSalnsn 	};
3423e1f7888bSalnsn 
3424e1f7888bSalnsn 	size_t i;
3425e1f7888bSalnsn 	bpfjit_func_t code;
3426e1f7888bSalnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
3427e1f7888bSalnsn 
3428e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3429e1f7888bSalnsn 
3430e1f7888bSalnsn 	RZ(rump_init());
3431e1f7888bSalnsn 
3432e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3433e1f7888bSalnsn 
3434e1f7888bSalnsn 	rump_schedule();
3435e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3436e1f7888bSalnsn 	rump_unschedule();
3437e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3438e1f7888bSalnsn 
3439e1f7888bSalnsn 	for (i = 1; i <= sizeof(pkt); i++)
3440e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
3441e1f7888bSalnsn 
3442e1f7888bSalnsn 	rump_schedule();
3443e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3444e1f7888bSalnsn 	rump_unschedule();
3445e1f7888bSalnsn }
3446e1f7888bSalnsn 
3447e1f7888bSalnsn ATF_TC(bpfjit_stx4);
ATF_TC_HEAD(bpfjit_stx4,tc)3448e1f7888bSalnsn ATF_TC_HEAD(bpfjit_stx4, tc)
3449e1f7888bSalnsn {
3450e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3451e1f7888bSalnsn 	    "Test JIT compilation of BPF_STX");
3452e1f7888bSalnsn }
3453e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_stx4,tc)3454e1f7888bSalnsn ATF_TC_BODY(bpfjit_stx4, tc)
3455e1f7888bSalnsn {
3456e1f7888bSalnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
3457e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3458e1f7888bSalnsn 
3459e1f7888bSalnsn 	size_t k;
3460e1f7888bSalnsn 	bpfjit_func_t code;
3461e1f7888bSalnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3462e1f7888bSalnsn 
3463e1f7888bSalnsn 	memset(insns, 0, sizeof(insns));
3464e1f7888bSalnsn 
3465e1f7888bSalnsn 	/* for each k do M[k] = k */
3466e1f7888bSalnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
3467e1f7888bSalnsn 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
3468e1f7888bSalnsn 		insns[2*k].k      = 3*k;
3469e1f7888bSalnsn 		insns[2*k+1].code = BPF_STX;
3470e1f7888bSalnsn 		insns[2*k+1].k    = k;
3471e1f7888bSalnsn 	}
3472e1f7888bSalnsn 
3473e1f7888bSalnsn 	/* load wirelen into A */
3474e1f7888bSalnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3475e1f7888bSalnsn 
3476e1f7888bSalnsn 	/* for each k, if (A == k + 1) return M[k] */
3477e1f7888bSalnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
3478e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3479e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
3480e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
3481e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
3482e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3483e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
3484e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3485e1f7888bSalnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
3486e1f7888bSalnsn 	}
3487e1f7888bSalnsn 
3488e1f7888bSalnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3489e1f7888bSalnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
3490e1f7888bSalnsn 
3491e1f7888bSalnsn 	RZ(rump_init());
3492e1f7888bSalnsn 
3493e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3494e1f7888bSalnsn 
3495e1f7888bSalnsn 	rump_schedule();
3496e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3497e1f7888bSalnsn 	rump_unschedule();
3498e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3499e1f7888bSalnsn 
3500e1f7888bSalnsn 	for (k = 1; k <= sizeof(pkt); k++)
3501e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3502e1f7888bSalnsn 
3503e1f7888bSalnsn 	rump_schedule();
3504e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3505e1f7888bSalnsn 	rump_unschedule();
3506e1f7888bSalnsn }
3507e1f7888bSalnsn 
3508e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_abs_1);
ATF_TC_HEAD(bpfjit_opt_ld_abs_1,tc)3509e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
3510e1f7888bSalnsn {
3511e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3512e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3513e1f7888bSalnsn 	    "applied to BPF_LD+BPF_ABS");
3514e1f7888bSalnsn }
3515e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_abs_1,tc)3516e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
3517e1f7888bSalnsn {
3518e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3519e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3520e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3521e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3522e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3523e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3524e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3525e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3526e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3527e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3528e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3529e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3530e1f7888bSalnsn 	};
3531e1f7888bSalnsn 
3532e1f7888bSalnsn 	size_t i, j;
3533e1f7888bSalnsn 	bpfjit_func_t code;
3534e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3535e1f7888bSalnsn 		{
3536e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3537e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3538e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3539e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3540e1f7888bSalnsn 		},
3541e1f7888bSalnsn 		{
3542e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3543e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3544e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3545e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3546e1f7888bSalnsn 		}
3547e1f7888bSalnsn 	};
3548e1f7888bSalnsn 
3549e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3550e1f7888bSalnsn 
3551e1f7888bSalnsn 	RZ(rump_init());
3552e1f7888bSalnsn 
3553e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3554e1f7888bSalnsn 
3555e1f7888bSalnsn 	rump_schedule();
3556e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3557e1f7888bSalnsn 	rump_unschedule();
3558e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3559e1f7888bSalnsn 
3560e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3561e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3562e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3563e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3564e1f7888bSalnsn 	}
3565e1f7888bSalnsn 
3566e1f7888bSalnsn 	rump_schedule();
3567e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3568e1f7888bSalnsn 	rump_unschedule();
3569e1f7888bSalnsn }
3570e1f7888bSalnsn 
3571e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_abs_2);
ATF_TC_HEAD(bpfjit_opt_ld_abs_2,tc)3572e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
3573e1f7888bSalnsn {
3574e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3575e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3576e1f7888bSalnsn 	    "applied to BPF_LD+BPF_ABS");
3577e1f7888bSalnsn }
3578e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_abs_2,tc)3579e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
3580e1f7888bSalnsn {
3581e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3582e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3583e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3584e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3585e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3586e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3587e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3588e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3589e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3590e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3591e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3592e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3593e1f7888bSalnsn 	};
3594e1f7888bSalnsn 
3595e1f7888bSalnsn 	size_t i, j;
3596e1f7888bSalnsn 	bpfjit_func_t code;
3597e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3598e1f7888bSalnsn 		{
3599e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3600e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3601e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3602e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3603e1f7888bSalnsn 		},
3604e1f7888bSalnsn 		{
3605e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3606e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3607e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3608e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3609e1f7888bSalnsn 		}
3610e1f7888bSalnsn 	};
3611e1f7888bSalnsn 
3612e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3613e1f7888bSalnsn 
3614e1f7888bSalnsn 	RZ(rump_init());
3615e1f7888bSalnsn 
3616e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3617e1f7888bSalnsn 
3618e1f7888bSalnsn 	rump_schedule();
3619e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3620e1f7888bSalnsn 	rump_unschedule();
3621e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3622e1f7888bSalnsn 
3623e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3624e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3625e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3626e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3627e1f7888bSalnsn 	}
3628e1f7888bSalnsn 
3629e1f7888bSalnsn 	rump_schedule();
3630e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3631e1f7888bSalnsn 	rump_unschedule();
3632e1f7888bSalnsn }
3633e1f7888bSalnsn 
3634e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_abs_3);
ATF_TC_HEAD(bpfjit_opt_ld_abs_3,tc)3635e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
3636e1f7888bSalnsn {
3637e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3638e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3639e1f7888bSalnsn 	    "applied to BPF_LD+BPF_ABS");
3640e1f7888bSalnsn }
3641e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_abs_3,tc)3642e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
3643e1f7888bSalnsn {
3644e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3645e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3646e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3647e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3648e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3649e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3650e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3651e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3652e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3653e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3654e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3655e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3656e1f7888bSalnsn 	};
3657e1f7888bSalnsn 
3658e1f7888bSalnsn 	size_t i, j;
3659e1f7888bSalnsn 	bpfjit_func_t code;
3660e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3661e1f7888bSalnsn 		{
3662e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3663e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3664e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3665e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3666e1f7888bSalnsn 		},
3667e1f7888bSalnsn 		{
3668e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3669e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3670e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3671e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3672e1f7888bSalnsn 		}
3673e1f7888bSalnsn 	};
3674e1f7888bSalnsn 
3675e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3676e1f7888bSalnsn 
3677e1f7888bSalnsn 	RZ(rump_init());
3678e1f7888bSalnsn 
3679e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3680e1f7888bSalnsn 
3681e1f7888bSalnsn 	rump_schedule();
3682e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3683e1f7888bSalnsn 	rump_unschedule();
3684e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3685e1f7888bSalnsn 
3686e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3687e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3688e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3689e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3690e1f7888bSalnsn 	}
3691e1f7888bSalnsn 
3692e1f7888bSalnsn 	rump_schedule();
3693e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3694e1f7888bSalnsn 	rump_unschedule();
3695e1f7888bSalnsn }
3696e1f7888bSalnsn 
3697e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_ind_1);
ATF_TC_HEAD(bpfjit_opt_ld_ind_1,tc)3698e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3699e1f7888bSalnsn {
3700e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3701e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3702e1f7888bSalnsn 	    "applied to BPF_LD+BPF_IND");
3703e1f7888bSalnsn }
3704e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_ind_1,tc)3705e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3706e1f7888bSalnsn {
3707e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3708e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3709e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3710e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3711e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3712e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3713e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3714e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3715e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3716e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3717e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3718e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3719e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3720e1f7888bSalnsn 	};
3721e1f7888bSalnsn 
3722e1f7888bSalnsn 	size_t i, j;
3723e1f7888bSalnsn 	bpfjit_func_t code;
3724e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3725e1f7888bSalnsn 		{
3726e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3727e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3728e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3729e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3730e1f7888bSalnsn 		},
3731e1f7888bSalnsn 		{
3732e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3733e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3734e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3735e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3736e1f7888bSalnsn 		}
3737e1f7888bSalnsn 	};
3738e1f7888bSalnsn 
3739e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3740e1f7888bSalnsn 
3741e1f7888bSalnsn 	RZ(rump_init());
3742e1f7888bSalnsn 
3743e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3744e1f7888bSalnsn 
3745e1f7888bSalnsn 	rump_schedule();
3746e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3747e1f7888bSalnsn 	rump_unschedule();
3748e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3749e1f7888bSalnsn 
3750e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3751e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3752e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3753e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3754e1f7888bSalnsn 	}
3755e1f7888bSalnsn 
3756e1f7888bSalnsn 	rump_schedule();
3757e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3758e1f7888bSalnsn 	rump_unschedule();
3759e1f7888bSalnsn }
3760e1f7888bSalnsn 
3761e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_ind_2);
ATF_TC_HEAD(bpfjit_opt_ld_ind_2,tc)3762e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3763e1f7888bSalnsn {
3764e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3765e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3766e1f7888bSalnsn 	    "applied to BPF_LD+BPF_IND");
3767e1f7888bSalnsn }
3768e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_ind_2,tc)3769e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3770e1f7888bSalnsn {
3771e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3772e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3773e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3774e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3775e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3776e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3777e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3778e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3779e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3780e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3781e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3782e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3783e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3784e1f7888bSalnsn 	};
3785e1f7888bSalnsn 
3786e1f7888bSalnsn 	size_t i, j;
3787e1f7888bSalnsn 	bpfjit_func_t code;
3788e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3789e1f7888bSalnsn 		{
3790e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3791e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3792e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3793e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3794e1f7888bSalnsn 		},
3795e1f7888bSalnsn 		{
3796e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3797e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3798e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3799e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3800e1f7888bSalnsn 		}
3801e1f7888bSalnsn 	};
3802e1f7888bSalnsn 
3803e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3804e1f7888bSalnsn 
3805e1f7888bSalnsn 	RZ(rump_init());
3806e1f7888bSalnsn 
3807e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3808e1f7888bSalnsn 
3809e1f7888bSalnsn 	rump_schedule();
3810e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3811e1f7888bSalnsn 	rump_unschedule();
3812e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3813e1f7888bSalnsn 
3814e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3815e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3816e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3817e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3818e1f7888bSalnsn 	}
3819e1f7888bSalnsn 
3820e1f7888bSalnsn 	rump_schedule();
3821e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3822e1f7888bSalnsn 	rump_unschedule();
3823e1f7888bSalnsn }
3824e1f7888bSalnsn 
3825e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_ind_3);
ATF_TC_HEAD(bpfjit_opt_ld_ind_3,tc)3826e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3827e1f7888bSalnsn {
3828e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3829e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3830e1f7888bSalnsn 	    "applied to BPF_LD+BPF_IND");
3831e1f7888bSalnsn }
3832e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_ind_3,tc)3833e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3834e1f7888bSalnsn {
3835e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3836e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3837e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3838e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3839e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3840e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3841e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3842e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3843e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3844e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3845e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3846e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3847e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3848e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3849e1f7888bSalnsn 	};
3850e1f7888bSalnsn 
3851e1f7888bSalnsn 	size_t i, j;
3852e1f7888bSalnsn 	bpfjit_func_t code;
3853e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3854e1f7888bSalnsn 		{
3855e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3856e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3857e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3858e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3859e1f7888bSalnsn 		},
3860e1f7888bSalnsn 		{
3861e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3862e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3863e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3864e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3865e1f7888bSalnsn 		}
3866e1f7888bSalnsn 	};
3867e1f7888bSalnsn 
3868e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3869e1f7888bSalnsn 
3870e1f7888bSalnsn 	RZ(rump_init());
3871e1f7888bSalnsn 
3872e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3873e1f7888bSalnsn 
3874e1f7888bSalnsn 	rump_schedule();
3875e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3876e1f7888bSalnsn 	rump_unschedule();
3877e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3878e1f7888bSalnsn 
3879e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3880e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3881e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3882e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3883e1f7888bSalnsn 	}
3884e1f7888bSalnsn 
3885e1f7888bSalnsn 	rump_schedule();
3886e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3887e1f7888bSalnsn 	rump_unschedule();
3888e1f7888bSalnsn }
3889e1f7888bSalnsn 
3890e1f7888bSalnsn ATF_TC(bpfjit_opt_ld_ind_4);
ATF_TC_HEAD(bpfjit_opt_ld_ind_4,tc)3891e1f7888bSalnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3892e1f7888bSalnsn {
3893e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3894e1f7888bSalnsn 	    "Test JIT compilation with length optimization "
3895e1f7888bSalnsn 	    "applied to BPF_LD+BPF_IND");
3896e1f7888bSalnsn }
3897e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_opt_ld_ind_4,tc)3898e1f7888bSalnsn ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3899e1f7888bSalnsn {
3900e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3901e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3902e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3903e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3904e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3905e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3906e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3907e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3908e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3909e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3910e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3911e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3912e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3913e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3914e1f7888bSalnsn 	};
3915e1f7888bSalnsn 
3916e1f7888bSalnsn 	size_t i, j;
3917e1f7888bSalnsn 	bpfjit_func_t code;
3918e1f7888bSalnsn 	uint8_t pkt[2][34] = {
3919e1f7888bSalnsn 		{
3920e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3921e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3922e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f,
3923e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23
3924e1f7888bSalnsn 		},
3925e1f7888bSalnsn 		{
3926e1f7888bSalnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3927e1f7888bSalnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3928e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x23,
3929e1f7888bSalnsn 			0x80, 0x03, 0x70, 0x0f
3930e1f7888bSalnsn 		}
3931e1f7888bSalnsn 	};
3932e1f7888bSalnsn 
3933e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3934e1f7888bSalnsn 
3935e1f7888bSalnsn 	RZ(rump_init());
3936e1f7888bSalnsn 
3937e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3938e1f7888bSalnsn 
3939e1f7888bSalnsn 	rump_schedule();
3940e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3941e1f7888bSalnsn 	rump_unschedule();
3942e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3943e1f7888bSalnsn 
3944e1f7888bSalnsn 	for (i = 0; i < 2; i++) {
3945e1f7888bSalnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
3946e1f7888bSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3947e1f7888bSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3948e1f7888bSalnsn 	}
3949e1f7888bSalnsn 
3950e1f7888bSalnsn 	rump_schedule();
3951e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
3952e1f7888bSalnsn 	rump_unschedule();
3953e1f7888bSalnsn }
3954e1f7888bSalnsn 
3955e1f7888bSalnsn ATF_TC(bpfjit_abc_ja);
ATF_TC_HEAD(bpfjit_abc_ja,tc)3956e1f7888bSalnsn ATF_TC_HEAD(bpfjit_abc_ja, tc)
3957e1f7888bSalnsn {
3958e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
3959e1f7888bSalnsn 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
3960e1f7888bSalnsn }
3961e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_abc_ja,tc)3962e1f7888bSalnsn ATF_TC_BODY(bpfjit_abc_ja, tc)
3963e1f7888bSalnsn {
3964e1f7888bSalnsn 	static struct bpf_insn insns[] = {
3965e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3966e1f7888bSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
3967e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3968e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
3969e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3970e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
3971e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
3972e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3973e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
3974e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3975e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
3976e1f7888bSalnsn 	};
3977e1f7888bSalnsn 
3978e1f7888bSalnsn 	bpfjit_func_t code;
3979e1f7888bSalnsn 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3980e1f7888bSalnsn 
3981e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3982e1f7888bSalnsn 
3983e1f7888bSalnsn 	RZ(rump_init());
3984e1f7888bSalnsn 
3985e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
3986e1f7888bSalnsn 
3987e1f7888bSalnsn 	rump_schedule();
3988e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3989e1f7888bSalnsn 	rump_unschedule();
3990e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
3991e1f7888bSalnsn 
3992e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3993e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3994e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3995e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3996e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3997e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3998e1f7888bSalnsn 
3999e1f7888bSalnsn 	rump_schedule();
4000e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
4001e1f7888bSalnsn 	rump_unschedule();
4002e1f7888bSalnsn }
4003e1f7888bSalnsn 
4004e1f7888bSalnsn ATF_TC(bpfjit_abc_ja_over);
ATF_TC_HEAD(bpfjit_abc_ja_over,tc)4005e1f7888bSalnsn ATF_TC_HEAD(bpfjit_abc_ja_over, tc)
4006e1f7888bSalnsn {
4007e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
4008e1f7888bSalnsn 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
4009e1f7888bSalnsn }
4010e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_abc_ja_over,tc)4011e1f7888bSalnsn ATF_TC_BODY(bpfjit_abc_ja_over, tc)
4012e1f7888bSalnsn {
4013e1f7888bSalnsn 	static struct bpf_insn insns[] = {
4014e1f7888bSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
4015e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
4016e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
4017e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4018e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
4019e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
4020e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
4021e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
4022e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
4023e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
4024e1f7888bSalnsn 	};
4025e1f7888bSalnsn 
4026e1f7888bSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
4027e1f7888bSalnsn 
4028e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4029e1f7888bSalnsn 
4030e1f7888bSalnsn 	RZ(rump_init());
4031e1f7888bSalnsn 
4032e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
4033e1f7888bSalnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
4034e1f7888bSalnsn }
4035e1f7888bSalnsn 
4036e1f7888bSalnsn ATF_TC(bpfjit_abc_ld_chain);
ATF_TC_HEAD(bpfjit_abc_ld_chain,tc)4037e1f7888bSalnsn ATF_TC_HEAD(bpfjit_abc_ld_chain, tc)
4038e1f7888bSalnsn {
4039e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
4040e1f7888bSalnsn 	    "Test ABC optimization of a chain of BPF_LD instructions "
4041e1f7888bSalnsn 	    "with exits leading to a single BPF_RET");
4042e1f7888bSalnsn }
4043e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_abc_ld_chain,tc)4044e1f7888bSalnsn ATF_TC_BODY(bpfjit_abc_ld_chain, tc)
4045e1f7888bSalnsn {
4046e1f7888bSalnsn 	static struct bpf_insn insns[] = {
4047e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
4048e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
4049e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
4050e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
4051e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
4052e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
4053e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 123456789),
4054e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 987654321),
4055e1f7888bSalnsn 	};
4056e1f7888bSalnsn 
4057e1f7888bSalnsn 	bpfjit_func_t code;
4058e1f7888bSalnsn 	uint8_t pkt[10] = {};
4059e1f7888bSalnsn 
4060e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4061e1f7888bSalnsn 
4062e1f7888bSalnsn 	RZ(rump_init());
4063e1f7888bSalnsn 
4064e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
4065e1f7888bSalnsn 
4066e1f7888bSalnsn 	rump_schedule();
4067e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4068e1f7888bSalnsn 	rump_unschedule();
4069e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
4070e1f7888bSalnsn 
4071e1f7888bSalnsn 	/* Packet is too short. */
4072e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4073e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4074e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4075e1f7888bSalnsn 
4076e1f7888bSalnsn 	/* !(pkt[3] == 8) => return 123456789 */
4077e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
4078e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
4079e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4080e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
4081e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
4082e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4083e1f7888bSalnsn 
4084e1f7888bSalnsn 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
4085e1f7888bSalnsn 	pkt[3] = 8;
4086e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4087e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4088e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4089e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4090e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4091e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4092e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4093e1f7888bSalnsn 
4094e1f7888bSalnsn 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
4095e1f7888bSalnsn 	pkt[4] = pkt[5] = 1;
4096e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4097e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4098e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4099e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4100e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4101e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4102e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4103e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4104e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4105e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
4106e1f7888bSalnsn 
4107e1f7888bSalnsn 	/* (pkt[6:4] > 6) => too short or return 123456789 */
4108e1f7888bSalnsn 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
4109e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4110e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4111e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4112e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4113e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4114e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4115e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4116e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4117e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4118e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
4119e1f7888bSalnsn 
4120e1f7888bSalnsn 	rump_schedule();
4121e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
4122e1f7888bSalnsn 	rump_unschedule();
4123e1f7888bSalnsn }
4124e1f7888bSalnsn 
4125e1f7888bSalnsn ATF_TC(bpfjit_examples_1);
ATF_TC_HEAD(bpfjit_examples_1,tc)4126e1f7888bSalnsn ATF_TC_HEAD(bpfjit_examples_1, tc)
4127e1f7888bSalnsn {
4128e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
4129e1f7888bSalnsn 	    "Test the first example from bpf(4) - "
4130e1f7888bSalnsn 	    "accept Reverse ARP requests");
4131e1f7888bSalnsn }
4132e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_examples_1,tc)4133e1f7888bSalnsn ATF_TC_BODY(bpfjit_examples_1, tc)
4134e1f7888bSalnsn {
4135e1f7888bSalnsn 	/*
4136e1f7888bSalnsn 	 * The following filter is taken from the Reverse ARP
4137e1f7888bSalnsn 	 * Daemon. It accepts only Reverse ARP requests.
4138e1f7888bSalnsn 	 */
4139e1f7888bSalnsn 	struct bpf_insn insns[] = {
4140e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4141e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
4142e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4143e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
4144e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 42),
4145e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
4146e1f7888bSalnsn 	};
4147e1f7888bSalnsn 
4148e1f7888bSalnsn 	bpfjit_func_t code;
4149e1f7888bSalnsn 	uint8_t pkt[22] = {};
4150e1f7888bSalnsn 
4151e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4152e1f7888bSalnsn 
4153e1f7888bSalnsn 	RZ(rump_init());
4154e1f7888bSalnsn 
4155e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
4156e1f7888bSalnsn 
4157e1f7888bSalnsn 	rump_schedule();
4158e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4159e1f7888bSalnsn 	rump_unschedule();
4160e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
4161e1f7888bSalnsn 
4162e1f7888bSalnsn 	/* Packet is too short. */
4163e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4164e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4165e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4166e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4167e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4168e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4169e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4170e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4171e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4172e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4173e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4174e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4175e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4176e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4177e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4178e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4179e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4180e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4181e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4182e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4183e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4184e1f7888bSalnsn 
4185e1f7888bSalnsn 	/* The packet doesn't match. */
4186e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4187e1f7888bSalnsn 
4188e1f7888bSalnsn 	/* Still no match after setting the protocol field. */
4189e1f7888bSalnsn 	pkt[12] = 0x80; pkt[13] = 0x35;
4190e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4191e1f7888bSalnsn 
4192e1f7888bSalnsn 	/* Set RARP message type. */
4193e1f7888bSalnsn 	pkt[21] = 3;
4194e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
4195e1f7888bSalnsn 
4196e1f7888bSalnsn 	/* Packet is too short. */
4197e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4198e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4199e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4200e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4201e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4202e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4203e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4204e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4205e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4206e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4207e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4208e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4209e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4210e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4211e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4212e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4213e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4214e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4215e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4216e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4217e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4218e1f7888bSalnsn 
4219e1f7888bSalnsn 	/* Change RARP message type. */
4220e1f7888bSalnsn 	pkt[20] = 3;
4221e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4222e1f7888bSalnsn 
4223e1f7888bSalnsn 	rump_schedule();
4224e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
4225e1f7888bSalnsn 	rump_unschedule();
4226e1f7888bSalnsn }
4227e1f7888bSalnsn 
4228e1f7888bSalnsn ATF_TC(bpfjit_examples_2);
ATF_TC_HEAD(bpfjit_examples_2,tc)4229e1f7888bSalnsn ATF_TC_HEAD(bpfjit_examples_2, tc)
4230e1f7888bSalnsn {
4231e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
4232e1f7888bSalnsn 	    "Test the second example from bpf(4) - "
4233e1f7888bSalnsn 	    "accept IP packets between two specified hosts");
4234e1f7888bSalnsn }
4235e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_examples_2,tc)4236e1f7888bSalnsn ATF_TC_BODY(bpfjit_examples_2, tc)
4237e1f7888bSalnsn {
4238e1f7888bSalnsn 	/*
4239e1f7888bSalnsn 	 * This filter accepts only IP packets between host 128.3.112.15
4240e1f7888bSalnsn 	 * and 128.3.112.35.
4241e1f7888bSalnsn 	 */
4242e1f7888bSalnsn 	static struct bpf_insn insns[] = {
4243e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4244e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
4245e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
4246e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
4247e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4248e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
4249e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
4250e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4251e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
4252e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4253e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
4254e1f7888bSalnsn 	};
4255e1f7888bSalnsn 
4256e1f7888bSalnsn 	bpfjit_func_t code;
4257e1f7888bSalnsn 	uint8_t pkt[34] = {};
4258e1f7888bSalnsn 
4259e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4260e1f7888bSalnsn 
4261e1f7888bSalnsn 	RZ(rump_init());
4262e1f7888bSalnsn 
4263e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
4264e1f7888bSalnsn 
4265e1f7888bSalnsn 	rump_schedule();
4266e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4267e1f7888bSalnsn 	rump_unschedule();
4268e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
4269e1f7888bSalnsn 
4270e1f7888bSalnsn 	/* Packet is too short. */
4271e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4272e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4273e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4274e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4275e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4276e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4277e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4278e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4279e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4280e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4281e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4282e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4283e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4284e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4285e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4286e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4287e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4288e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4289e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4290e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4291e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4292e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4293e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4294e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4295e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4296e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4297e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4298e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4299e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4300e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4301e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4302e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4303e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4304e1f7888bSalnsn 
4305e1f7888bSalnsn 	/* The packet doesn't match. */
4306e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4307e1f7888bSalnsn 
4308e1f7888bSalnsn 	/* Still no match after setting the protocol field. */
4309e1f7888bSalnsn 	pkt[12] = 8;
4310e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4311e1f7888bSalnsn 
4312e1f7888bSalnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
4313e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4314e1f7888bSalnsn 
4315e1f7888bSalnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
4316e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4317e1f7888bSalnsn 
4318e1f7888bSalnsn 	/* Swap the ip addresses. */
4319e1f7888bSalnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
4320e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4321e1f7888bSalnsn 
4322e1f7888bSalnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
4323e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4324e1f7888bSalnsn 
4325e1f7888bSalnsn 	/* Packet is too short. */
4326e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4327e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4328e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4329e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4330e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4331e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4332e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4333e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4334e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4335e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4336e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4337e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4338e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4339e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4340e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4341e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4342e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4343e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4344e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4345e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4346e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4347e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4348e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4349e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4350e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4351e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4352e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4353e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4354e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4355e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4356e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4357e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4358e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4359e1f7888bSalnsn 
4360e1f7888bSalnsn 	/* Change the protocol field. */
4361e1f7888bSalnsn 	pkt[13] = 8;
4362e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4363e1f7888bSalnsn 
4364e1f7888bSalnsn 	rump_schedule();
4365e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
4366e1f7888bSalnsn 	rump_unschedule();
4367e1f7888bSalnsn }
4368e1f7888bSalnsn 
4369e1f7888bSalnsn ATF_TC(bpfjit_examples_3);
ATF_TC_HEAD(bpfjit_examples_3,tc)4370e1f7888bSalnsn ATF_TC_HEAD(bpfjit_examples_3, tc)
4371e1f7888bSalnsn {
4372e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr",
4373e1f7888bSalnsn 	    "Test the third example from bpf(4) - "
4374e1f7888bSalnsn 	    "accept TCP finger packets");
4375e1f7888bSalnsn }
4376e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_examples_3,tc)4377e1f7888bSalnsn ATF_TC_BODY(bpfjit_examples_3, tc)
4378e1f7888bSalnsn {
4379e1f7888bSalnsn 	/*
4380e1f7888bSalnsn 	 * This filter returns only TCP finger packets.
4381e1f7888bSalnsn 	 */
4382e1f7888bSalnsn 	struct bpf_insn insns[] = {
4383e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4384e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
4385e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
4386e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
4387e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4388e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
4389e1f7888bSalnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
4390e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
4391e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
4392e1f7888bSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
4393e1f7888bSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
4394e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4395e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
4396e1f7888bSalnsn 	};
4397e1f7888bSalnsn 
4398e1f7888bSalnsn 	bpfjit_func_t code;
4399e1f7888bSalnsn 	uint8_t pkt[30] = {};
4400e1f7888bSalnsn 
4401e1f7888bSalnsn 	/* Set IP fragment offset to non-zero. */
4402e1f7888bSalnsn 	pkt[20] = 1; pkt[21] = 1;
4403e1f7888bSalnsn 
4404e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4405e1f7888bSalnsn 
4406e1f7888bSalnsn 	RZ(rump_init());
4407e1f7888bSalnsn 
4408e1f7888bSalnsn 	ATF_CHECK(prog_validate(insns, insn_count));
4409e1f7888bSalnsn 
4410e1f7888bSalnsn 	rump_schedule();
4411e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4412e1f7888bSalnsn 	rump_unschedule();
4413e1f7888bSalnsn 	ATF_REQUIRE(code != NULL);
4414e1f7888bSalnsn 
4415e1f7888bSalnsn 	/* Packet is too short. */
4416e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4417e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4418e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4419e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4420e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4421e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4422e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4423e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4424e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4425e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4426e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4427e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4428e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4429e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4430e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4431e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4432e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4433e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4434e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4435e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4436e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4437e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4438e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4439e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4440e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4441e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4442e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4443e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4444e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4445e1f7888bSalnsn 
4446e1f7888bSalnsn 	/* The packet doesn't match. */
4447e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4448e1f7888bSalnsn 
4449e1f7888bSalnsn 	/* Still no match after setting the protocol field. */
4450e1f7888bSalnsn 	pkt[12] = 8;
4451e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4452e1f7888bSalnsn 
4453e1f7888bSalnsn 	/* Get one step closer to the match. */
4454e1f7888bSalnsn 	pkt[23] = 6;
4455e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4456e1f7888bSalnsn 
4457e1f7888bSalnsn 	/* Set IP fragment offset to zero. */
4458e1f7888bSalnsn 	pkt[20] = 0x20; pkt[21] = 0;
4459e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4460e1f7888bSalnsn 
4461e1f7888bSalnsn 	/* Set IP header length to 12. */
4462e1f7888bSalnsn 	pkt[14] = 0xd3;
4463e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4464e1f7888bSalnsn 
4465e1f7888bSalnsn 	/* Match one branch of the program. */
4466e1f7888bSalnsn 	pkt[27] = 79;
4467e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4468e1f7888bSalnsn 
4469e1f7888bSalnsn 	/* Match the other branch of the program. */
4470e1f7888bSalnsn 	pkt[29] = 79; pkt[27] = 0;
4471e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4472e1f7888bSalnsn 
4473e1f7888bSalnsn 	/* Packet is too short. */
4474e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4475e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4476e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4477e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4478e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4479e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4480e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4481e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4482e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4483e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4484e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4485e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4486e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4487e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4488e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4489e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4490e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4491e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4492e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4493e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4494e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4495e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4496e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4497e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4498e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4499e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4500e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4501e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4502e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4503e1f7888bSalnsn 
4504e1f7888bSalnsn 	/* Set IP header length to 16. Packet is too short. */
4505e1f7888bSalnsn 	pkt[14] = 4;
4506e1f7888bSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4507e1f7888bSalnsn 
4508e1f7888bSalnsn 	rump_schedule();
4509e1f7888bSalnsn 	rumpns_bpfjit_free_code(code);
4510e1f7888bSalnsn 	rump_unschedule();
4511e1f7888bSalnsn }
4512e1f7888bSalnsn 
4513e1f7888bSalnsn ATF_TC(bpfjit_cop_no_ctx);
ATF_TC_HEAD(bpfjit_cop_no_ctx,tc)4514e1f7888bSalnsn ATF_TC_HEAD(bpfjit_cop_no_ctx, tc)
4515e1f7888bSalnsn {
4516e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
4517e1f7888bSalnsn 	    "instruction can't be accepted without a context");
4518e1f7888bSalnsn }
4519e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_cop_no_ctx,tc)4520e1f7888bSalnsn ATF_TC_BODY(bpfjit_cop_no_ctx, tc)
4521e1f7888bSalnsn {
4522e1f7888bSalnsn 	static struct bpf_insn insns[] = {
4523e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_COP, 0),
4524e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
4525e1f7888bSalnsn 	};
4526e1f7888bSalnsn 
4527e1f7888bSalnsn 	bpfjit_func_t code;
4528e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4529e1f7888bSalnsn 
4530e1f7888bSalnsn 	RZ(rump_init());
4531e1f7888bSalnsn 
4532e1f7888bSalnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
4533e1f7888bSalnsn 
4534e1f7888bSalnsn 	rump_schedule();
4535e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4536e1f7888bSalnsn 	rump_unschedule();
4537e1f7888bSalnsn 	ATF_CHECK(code == NULL);
4538e1f7888bSalnsn }
4539e1f7888bSalnsn 
4540e1f7888bSalnsn ATF_TC(bpfjit_copx_no_ctx);
ATF_TC_HEAD(bpfjit_copx_no_ctx,tc)4541e1f7888bSalnsn ATF_TC_HEAD(bpfjit_copx_no_ctx, tc)
4542e1f7888bSalnsn {
4543e1f7888bSalnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
4544e1f7888bSalnsn 	    "instruction can't be accepted without a context");
4545e1f7888bSalnsn }
4546e1f7888bSalnsn 
ATF_TC_BODY(bpfjit_copx_no_ctx,tc)4547e1f7888bSalnsn ATF_TC_BODY(bpfjit_copx_no_ctx, tc)
4548e1f7888bSalnsn {
4549e1f7888bSalnsn 	static struct bpf_insn insns[] = {
4550e1f7888bSalnsn 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
4551e1f7888bSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
4552e1f7888bSalnsn 	};
4553e1f7888bSalnsn 
4554e1f7888bSalnsn 	bpfjit_func_t code;
4555e1f7888bSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4556e1f7888bSalnsn 
4557e1f7888bSalnsn 	RZ(rump_init());
4558e1f7888bSalnsn 
4559e1f7888bSalnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
4560e1f7888bSalnsn 
4561e1f7888bSalnsn 	rump_schedule();
4562e1f7888bSalnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4563e1f7888bSalnsn 	rump_unschedule();
4564e1f7888bSalnsn 	ATF_CHECK(code == NULL);
4565d32d6008Salnsn }
4566d32d6008Salnsn 
ATF_TP_ADD_TCS(tp)4567d32d6008Salnsn ATF_TP_ADD_TCS(tp)
4568d32d6008Salnsn {
4569d32d6008Salnsn 
4570e1f7888bSalnsn 	/*
4571e1f7888bSalnsn 	 * For every new test please also add a similar test
4572e1f7888bSalnsn 	 * to ../../lib/libbpfjit/t_bpfjit.c
4573e1f7888bSalnsn 	 */
4574e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_empty);
4575fe765d60Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_ret_k);
4576fe765d60Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_bad_ret_k);
4577e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
4578e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
4579e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
4580e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
4581e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
4582e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
4583e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
4584e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
4585e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
4586e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
4587e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
4588215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_k);
4589215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_k);
4590215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_k);
4591215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_k);
4592215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_k);
4593215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_k);
4594215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_k);
4595215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_k);
4596e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
4597e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
4598b61069b6Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_xor_k);
4599e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
4600e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
4601e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
4602e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
4603e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
4604e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
4605e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
4606e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
4607e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
4608e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
4609e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
4610e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
4611e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
4612e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
4613e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
4614e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
4615215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_x);
4616215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_x);
4617215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_x);
4618215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_x);
4619215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_x);
4620215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_x);
4621215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_x);
4622215bab86Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_x);
4623e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
4624e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
4625b61069b6Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_xor_x);
4626e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
4627e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
4628e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
4629e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
4630e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
4631e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
4632e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
4633fe765d60Salnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid);
4634c57239cfSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_overflow);
4635e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
4636e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
4637e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
4638e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
4639e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
4640e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
4641e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
4642e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
4643e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
464486cd3d4dSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_ax);
4645e3ced4adSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_a);
4646e3ced4adSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_x);
4647e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
4648e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
4649e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
4650e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
4651e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
4652e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
4653e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
4654e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_len);
4655e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
4656e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
4657e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
4658e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
4659e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
4660e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
4661e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
4662e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
4663e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_st1);
4664e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_st2);
4665e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_st3);
4666e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_st4);
4667e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_st5);
4668e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx1);
4669e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx2);
4670e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx3);
4671e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx4);
4672e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
4673e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
4674e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
4675e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
4676e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
4677e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
4678e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
4679e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ja);
4680e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ja_over);
4681e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ld_chain);
4682e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_1);
4683e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_2);
4684e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_3);
4685e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_cop_no_ctx);
4686e1f7888bSalnsn 	ATF_TP_ADD_TC(tp, bpfjit_copx_no_ctx);
4687d32d6008Salnsn 
4688d32d6008Salnsn 	return atf_no_error();
4689d32d6008Salnsn }
4690