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