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