1 /* $NetBSD: t_bpfjit.c,v 1.2 2014/07/08 21:44:26 alnsn Exp $ */
4 * Copyright (c) 2011-2012, 2014 Alexander Nasonov.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <sys/cdefs.h>
30 __RCSID("$NetBSD: t_bpfjit.c,v 1.2 2014/07/08 21:44:26 alnsn Exp $");
32 #include <sys/param.h>
37 #include <net/bpfjit.h>
42 #include <rump/rump.h>
43 #include <rump/rump_syscalls.h>
45 #include "../../net/bpf/h_bpf.h"
47 /* XXX: atf-c.h has collisions with mbuf */
52 #include "../../h_macros.h"
55 static uint8_t deadbeef_at_5[16] = {
56 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
60 unsigned int jitcall(bpfjit_func_t fn,
61 const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
66 args.wirelen = wirelen;
69 return fn(NULL, &args);
73 ATF_TC_HEAD(bpfjit_empty, tc)
75 atf_tc_set_md_var(tc, "descr",
76 "Test that JIT compilation of an empty bpf program fails");
79 ATF_TC_BODY(bpfjit_empty, tc)
81 struct bpf_insn dummy;
87 fn = rumpns_bpfjit_generate_code(NULL, &dummy, 0);
90 ATF_CHECK(fn == NULL);
93 ATF_TC(bpfjit_alu_add_k);
94 ATF_TC_HEAD(bpfjit_alu_add_k, tc)
96 atf_tc_set_md_var(tc, "descr",
97 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
100 ATF_TC_BODY(bpfjit_alu_add_k, tc)
102 static struct bpf_insn insns[] = {
103 BPF_STMT(BPF_LD+BPF_IMM, 3),
104 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
105 BPF_STMT(BPF_RET+BPF_A, 0)
108 uint8_t pkt[1]; /* the program doesn't read any data */
110 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
114 ATF_CHECK(prog_validate(insns, insn_count));
115 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
118 ATF_TC(bpfjit_alu_sub_k);
119 ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
121 atf_tc_set_md_var(tc, "descr",
122 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
125 ATF_TC_BODY(bpfjit_alu_sub_k, tc)
127 static struct bpf_insn insns[] = {
128 BPF_STMT(BPF_LD+BPF_IMM, 1),
129 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
130 BPF_STMT(BPF_RET+BPF_A, 0)
133 uint8_t pkt[1]; /* the program doesn't read any data */
135 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
139 ATF_CHECK(prog_validate(insns, insn_count));
140 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
143 ATF_TC(bpfjit_alu_mul_k);
144 ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
146 atf_tc_set_md_var(tc, "descr",
147 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
150 ATF_TC_BODY(bpfjit_alu_mul_k, tc)
152 static struct bpf_insn insns[] = {
153 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
154 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
155 BPF_STMT(BPF_RET+BPF_A, 0)
158 uint8_t pkt[1]; /* the program doesn't read any data */
160 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
164 ATF_CHECK(prog_validate(insns, insn_count));
165 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
168 ATF_TC(bpfjit_alu_div0_k);
169 ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
171 atf_tc_set_md_var(tc, "descr",
172 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
175 ATF_TC_BODY(bpfjit_alu_div0_k, tc)
177 static struct bpf_insn insns[] = {
178 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
179 BPF_STMT(BPF_RET+BPF_A, 0)
182 uint8_t pkt[1]; /* the program doesn't read any data */
184 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
188 //ATF_CHECK(prog_validate(insns, insn_count));
189 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
192 ATF_TC(bpfjit_alu_div1_k);
193 ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
195 atf_tc_set_md_var(tc, "descr",
196 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
199 ATF_TC_BODY(bpfjit_alu_div1_k, tc)
201 static struct bpf_insn insns[] = {
202 BPF_STMT(BPF_LD+BPF_IMM, 7),
203 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
204 BPF_STMT(BPF_RET+BPF_A, 0)
207 uint8_t pkt[1]; /* the program doesn't read any data */
209 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
213 ATF_CHECK(prog_validate(insns, insn_count));
214 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
217 ATF_TC(bpfjit_alu_div2_k);
218 ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
220 atf_tc_set_md_var(tc, "descr",
221 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
224 ATF_TC_BODY(bpfjit_alu_div2_k, tc)
226 static struct bpf_insn insns[] = {
227 BPF_STMT(BPF_LD+BPF_IMM, 7),
228 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
229 BPF_STMT(BPF_RET+BPF_A, 0)
232 uint8_t pkt[1]; /* the program doesn't read any data */
234 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
238 ATF_CHECK(prog_validate(insns, insn_count));
239 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
242 ATF_TC(bpfjit_alu_div4_k);
243 ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
245 atf_tc_set_md_var(tc, "descr",
246 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
249 ATF_TC_BODY(bpfjit_alu_div4_k, tc)
251 static struct bpf_insn insns[] = {
252 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
253 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
254 BPF_STMT(BPF_RET+BPF_A, 0)
257 uint8_t pkt[1]; /* the program doesn't read any data */
259 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
263 ATF_CHECK(prog_validate(insns, insn_count));
264 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
267 ATF_TC(bpfjit_alu_div10_k);
268 ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
270 atf_tc_set_md_var(tc, "descr",
271 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
274 ATF_TC_BODY(bpfjit_alu_div10_k, tc)
276 static struct bpf_insn insns[] = {
277 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
278 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
279 BPF_STMT(BPF_RET+BPF_A, 0)
282 uint8_t pkt[1]; /* the program doesn't read any data */
284 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
288 ATF_CHECK(prog_validate(insns, insn_count));
289 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
292 ATF_TC(bpfjit_alu_div10000_k);
293 ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
295 atf_tc_set_md_var(tc, "descr",
296 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
299 ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
301 static struct bpf_insn insns[] = {
302 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
303 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
304 BPF_STMT(BPF_RET+BPF_A, 0)
307 uint8_t pkt[1]; /* the program doesn't read any data */
309 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
313 ATF_CHECK(prog_validate(insns, insn_count));
314 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
317 ATF_TC(bpfjit_alu_div7609801_k);
318 ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
320 atf_tc_set_md_var(tc, "descr",
321 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
324 ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
326 static struct bpf_insn insns[] = {
327 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
328 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
329 BPF_STMT(BPF_RET+BPF_A, 0)
332 uint8_t pkt[1]; /* the program doesn't read any data */
334 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
338 ATF_CHECK(prog_validate(insns, insn_count));
339 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
342 ATF_TC(bpfjit_alu_div80000000_k);
343 ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
345 atf_tc_set_md_var(tc, "descr",
346 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
349 ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
351 static struct bpf_insn insns[] = {
352 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
353 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
354 BPF_STMT(BPF_RET+BPF_A, 0)
357 uint8_t pkt[1]; /* the program doesn't read any data */
359 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
363 ATF_CHECK(prog_validate(insns, insn_count));
364 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
367 ATF_TC(bpfjit_alu_and_k);
368 ATF_TC_HEAD(bpfjit_alu_and_k, tc)
370 atf_tc_set_md_var(tc, "descr",
371 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
374 ATF_TC_BODY(bpfjit_alu_and_k, tc)
376 static struct bpf_insn insns[] = {
377 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
378 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
379 BPF_STMT(BPF_RET+BPF_A, 0)
382 uint8_t pkt[1]; /* the program doesn't read any data */
384 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
388 ATF_CHECK(prog_validate(insns, insn_count));
389 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
392 ATF_TC(bpfjit_alu_or_k);
393 ATF_TC_HEAD(bpfjit_alu_or_k, tc)
395 atf_tc_set_md_var(tc, "descr",
396 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
399 ATF_TC_BODY(bpfjit_alu_or_k, tc)
401 static struct bpf_insn insns[] = {
402 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
403 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
404 BPF_STMT(BPF_RET+BPF_A, 0)
407 uint8_t pkt[1]; /* the program doesn't read any data */
409 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
413 ATF_CHECK(prog_validate(insns, insn_count));
414 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
417 ATF_TC(bpfjit_alu_lsh_k);
418 ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
420 atf_tc_set_md_var(tc, "descr",
421 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
424 ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
426 static struct bpf_insn insns[] = {
427 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
428 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
429 BPF_STMT(BPF_RET+BPF_A, 0)
432 uint8_t pkt[1]; /* the program doesn't read any data */
434 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
438 ATF_CHECK(prog_validate(insns, insn_count));
439 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
442 ATF_TC(bpfjit_alu_lsh0_k);
443 ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
445 atf_tc_set_md_var(tc, "descr",
446 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
449 ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
451 static struct bpf_insn insns[] = {
452 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
453 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
454 BPF_STMT(BPF_RET+BPF_A, 0)
457 uint8_t pkt[1]; /* the program doesn't read any data */
459 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
463 ATF_CHECK(prog_validate(insns, insn_count));
464 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
467 ATF_TC(bpfjit_alu_rsh_k);
468 ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
470 atf_tc_set_md_var(tc, "descr",
471 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
474 ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
476 static struct bpf_insn insns[] = {
477 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
478 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
479 BPF_STMT(BPF_RET+BPF_A, 0)
482 uint8_t pkt[1]; /* the program doesn't read any data */
484 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
488 ATF_CHECK(prog_validate(insns, insn_count));
489 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
492 ATF_TC(bpfjit_alu_rsh0_k);
493 ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
495 atf_tc_set_md_var(tc, "descr",
496 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
499 ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
501 static struct bpf_insn insns[] = {
502 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
503 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
504 BPF_STMT(BPF_RET+BPF_A, 0)
507 uint8_t pkt[1]; /* the program doesn't read any data */
509 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
513 ATF_CHECK(prog_validate(insns, insn_count));
514 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
517 ATF_TC(bpfjit_alu_modulo_k);
518 ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
520 atf_tc_set_md_var(tc, "descr",
521 "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
524 ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
526 static struct bpf_insn insns[] = {
527 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
529 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
530 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
532 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
533 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
535 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
536 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
538 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
539 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
541 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
542 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
544 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
545 BPF_STMT(BPF_ALU+BPF_NEG, 0),
547 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
548 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
550 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
551 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
552 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
554 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
555 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
557 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
558 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
559 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
561 BPF_STMT(BPF_RET+BPF_A, 0)
565 uint8_t pkt[1]; /* the program doesn't read any data */
567 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
571 ATF_CHECK(prog_validate(insns, insn_count));
574 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
576 ATF_REQUIRE(code != NULL);
578 ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
579 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
582 rumpns_bpfjit_free_code(code);
586 ATF_TC(bpfjit_alu_add_x);
587 ATF_TC_HEAD(bpfjit_alu_add_x, tc)
589 atf_tc_set_md_var(tc, "descr",
590 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
593 ATF_TC_BODY(bpfjit_alu_add_x, tc)
595 static struct bpf_insn insns[] = {
596 BPF_STMT(BPF_LD+BPF_IMM, 3),
597 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
598 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
599 BPF_STMT(BPF_RET+BPF_A, 0)
602 uint8_t pkt[1]; /* the program doesn't read any data */
604 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
608 ATF_CHECK(prog_validate(insns, insn_count));
609 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
612 ATF_TC(bpfjit_alu_sub_x);
613 ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
615 atf_tc_set_md_var(tc, "descr",
616 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
619 ATF_TC_BODY(bpfjit_alu_sub_x, tc)
621 static struct bpf_insn insns[] = {
622 BPF_STMT(BPF_LD+BPF_IMM, 1),
623 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
624 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
625 BPF_STMT(BPF_RET+BPF_A, 0)
628 uint8_t pkt[1]; /* the program doesn't read any data */
630 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
634 ATF_CHECK(prog_validate(insns, insn_count));
635 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
638 ATF_TC(bpfjit_alu_mul_x);
639 ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
641 atf_tc_set_md_var(tc, "descr",
642 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
645 ATF_TC_BODY(bpfjit_alu_mul_x, tc)
647 static struct bpf_insn insns[] = {
648 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
649 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
650 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
651 BPF_STMT(BPF_RET+BPF_A, 0)
654 uint8_t pkt[1]; /* the program doesn't read any data */
656 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
660 ATF_CHECK(prog_validate(insns, insn_count));
661 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
664 ATF_TC(bpfjit_alu_div0_x);
665 ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
667 atf_tc_set_md_var(tc, "descr",
668 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
671 ATF_TC_BODY(bpfjit_alu_div0_x, tc)
673 static struct bpf_insn insns[] = {
674 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
675 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
676 BPF_STMT(BPF_RET+BPF_A, 0)
679 uint8_t pkt[1]; /* the program doesn't read any data */
681 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
685 ATF_CHECK(prog_validate(insns, insn_count));
686 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
689 ATF_TC(bpfjit_alu_div1_x);
690 ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
692 atf_tc_set_md_var(tc, "descr",
693 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
696 ATF_TC_BODY(bpfjit_alu_div1_x, tc)
698 static struct bpf_insn insns[] = {
699 BPF_STMT(BPF_LD+BPF_IMM, 7),
700 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
701 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
702 BPF_STMT(BPF_RET+BPF_A, 0)
705 uint8_t pkt[1]; /* the program doesn't read any data */
707 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
711 ATF_CHECK(prog_validate(insns, insn_count));
712 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
715 ATF_TC(bpfjit_alu_div2_x);
716 ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
718 atf_tc_set_md_var(tc, "descr",
719 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
722 ATF_TC_BODY(bpfjit_alu_div2_x, tc)
724 static struct bpf_insn insns[] = {
725 BPF_STMT(BPF_LD+BPF_IMM, 7),
726 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
727 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
728 BPF_STMT(BPF_RET+BPF_A, 0)
731 uint8_t pkt[1]; /* the program doesn't read any data */
733 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
737 ATF_CHECK(prog_validate(insns, insn_count));
738 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
741 ATF_TC(bpfjit_alu_div4_x);
742 ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
744 atf_tc_set_md_var(tc, "descr",
745 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
748 ATF_TC_BODY(bpfjit_alu_div4_x, tc)
750 static struct bpf_insn insns[] = {
751 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
752 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
753 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
754 BPF_STMT(BPF_RET+BPF_A, 0)
757 uint8_t pkt[1]; /* the program doesn't read any data */
759 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
763 ATF_CHECK(prog_validate(insns, insn_count));
764 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
767 ATF_TC(bpfjit_alu_div10_x);
768 ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
770 atf_tc_set_md_var(tc, "descr",
771 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
774 ATF_TC_BODY(bpfjit_alu_div10_x, tc)
776 static struct bpf_insn insns[] = {
777 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
778 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
779 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
780 BPF_STMT(BPF_RET+BPF_A, 0)
783 uint8_t pkt[1]; /* the program doesn't read any data */
785 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
789 ATF_CHECK(prog_validate(insns, insn_count));
790 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
793 ATF_TC(bpfjit_alu_div10000_x);
794 ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
796 atf_tc_set_md_var(tc, "descr",
797 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
800 ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
802 static struct bpf_insn insns[] = {
803 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
804 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
805 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
806 BPF_STMT(BPF_RET+BPF_A, 0)
809 uint8_t pkt[1]; /* the program doesn't read any data */
811 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
815 ATF_CHECK(prog_validate(insns, insn_count));
816 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
819 ATF_TC(bpfjit_alu_div7609801_x);
820 ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
822 atf_tc_set_md_var(tc, "descr",
823 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
826 ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
828 static struct bpf_insn insns[] = {
829 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
830 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
831 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
832 BPF_STMT(BPF_RET+BPF_A, 0)
835 uint8_t pkt[1]; /* the program doesn't read any data */
837 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
841 ATF_CHECK(prog_validate(insns, insn_count));
842 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
845 ATF_TC(bpfjit_alu_div80000000_x);
846 ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
848 atf_tc_set_md_var(tc, "descr",
849 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
852 ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
854 static struct bpf_insn insns[] = {
855 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
856 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
857 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
858 BPF_STMT(BPF_RET+BPF_A, 0)
861 uint8_t pkt[1]; /* the program doesn't read any data */
863 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
867 ATF_CHECK(prog_validate(insns, insn_count));
868 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
871 ATF_TC(bpfjit_alu_and_x);
872 ATF_TC_HEAD(bpfjit_alu_and_x, tc)
874 atf_tc_set_md_var(tc, "descr",
875 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
878 ATF_TC_BODY(bpfjit_alu_and_x, tc)
880 static struct bpf_insn insns[] = {
881 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
882 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
883 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
884 BPF_STMT(BPF_RET+BPF_A, 0)
887 uint8_t pkt[1]; /* the program doesn't read any data */
889 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
893 ATF_CHECK(prog_validate(insns, insn_count));
894 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
897 ATF_TC(bpfjit_alu_or_x);
898 ATF_TC_HEAD(bpfjit_alu_or_x, tc)
900 atf_tc_set_md_var(tc, "descr",
901 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
904 ATF_TC_BODY(bpfjit_alu_or_x, tc)
906 static struct bpf_insn insns[] = {
907 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
908 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
909 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
910 BPF_STMT(BPF_RET+BPF_A, 0)
913 uint8_t pkt[1]; /* the program doesn't read any data */
915 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
919 ATF_CHECK(prog_validate(insns, insn_count));
920 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
923 ATF_TC(bpfjit_alu_lsh_x);
924 ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
926 atf_tc_set_md_var(tc, "descr",
927 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
930 ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
932 static struct bpf_insn insns[] = {
933 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
934 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
935 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
936 BPF_STMT(BPF_RET+BPF_A, 0)
939 uint8_t pkt[1]; /* the program doesn't read any data */
941 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
945 ATF_CHECK(prog_validate(insns, insn_count));
946 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
949 ATF_TC(bpfjit_alu_lsh0_x);
950 ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
952 atf_tc_set_md_var(tc, "descr",
953 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
956 ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
958 static struct bpf_insn insns[] = {
959 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
960 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
961 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
962 BPF_STMT(BPF_RET+BPF_A, 0)
965 uint8_t pkt[1]; /* the program doesn't read any data */
967 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
971 ATF_CHECK(prog_validate(insns, insn_count));
972 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
975 ATF_TC(bpfjit_alu_rsh_x);
976 ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
978 atf_tc_set_md_var(tc, "descr",
979 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
982 ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
984 static struct bpf_insn insns[] = {
985 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
986 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
987 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
988 BPF_STMT(BPF_RET+BPF_A, 0)
991 uint8_t pkt[1]; /* the program doesn't read any data */
993 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
997 ATF_CHECK(prog_validate(insns, insn_count));
998 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
1001 ATF_TC(bpfjit_alu_rsh0_x);
1002 ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
1004 atf_tc_set_md_var(tc, "descr",
1005 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1008 ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
1010 static struct bpf_insn insns[] = {
1011 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1012 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1013 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1014 BPF_STMT(BPF_RET+BPF_A, 0)
1017 uint8_t pkt[1]; /* the program doesn't read any data */
1019 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1023 ATF_CHECK(prog_validate(insns, insn_count));
1024 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1027 ATF_TC(bpfjit_alu_modulo_x);
1028 ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
1030 atf_tc_set_md_var(tc, "descr",
1031 "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1034 ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
1036 static struct bpf_insn insns[] = {
1037 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1039 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1040 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1041 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1043 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1044 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1045 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1047 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1048 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1049 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1051 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1052 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1053 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1055 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1056 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1057 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1059 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1060 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1062 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1063 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1064 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1066 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1067 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
1068 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1069 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1071 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1072 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1073 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1075 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1076 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
1077 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1078 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1080 BPF_STMT(BPF_RET+BPF_A, 0)
1084 uint8_t pkt[1]; /* the program doesn't read any data */
1086 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1090 ATF_CHECK(prog_validate(insns, insn_count));
1093 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1095 ATF_REQUIRE(code != NULL);
1097 ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1098 ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
1101 rumpns_bpfjit_free_code(code);
1105 ATF_TC(bpfjit_alu_neg);
1106 ATF_TC_HEAD(bpfjit_alu_neg, tc)
1108 atf_tc_set_md_var(tc, "descr",
1109 "Test JIT compilation of BPF_ALU+BPF_NEG");
1112 ATF_TC_BODY(bpfjit_alu_neg, tc)
1114 static struct bpf_insn insns[] = {
1115 BPF_STMT(BPF_LD+BPF_IMM, 777),
1116 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1117 BPF_STMT(BPF_RET+BPF_A, 0)
1120 uint8_t pkt[1]; /* the program doesn't read any data */
1122 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1126 ATF_CHECK(prog_validate(insns, insn_count));
1127 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0u-777u);
1130 ATF_TC(bpfjit_jmp_ja);
1131 ATF_TC_HEAD(bpfjit_jmp_ja, tc)
1133 atf_tc_set_md_var(tc, "descr",
1134 "Test JIT compilation of BPF_JMP+BPF_JA");
1137 ATF_TC_BODY(bpfjit_jmp_ja, tc)
1139 static struct bpf_insn insns[] = {
1140 BPF_STMT(BPF_JMP+BPF_JA, 1),
1141 BPF_STMT(BPF_RET+BPF_K, 0),
1142 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1143 BPF_STMT(BPF_RET+BPF_K, 1),
1144 BPF_STMT(BPF_RET+BPF_K, 2),
1145 BPF_STMT(BPF_RET+BPF_K, 3),
1148 uint8_t pkt[1]; /* the program doesn't read any data */
1150 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1154 ATF_CHECK(prog_validate(insns, insn_count));
1155 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
1158 ATF_TC(bpfjit_jmp_jgt_k);
1159 ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
1161 atf_tc_set_md_var(tc, "descr",
1162 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1165 ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
1167 static struct bpf_insn insns[] = {
1168 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1169 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1170 BPF_STMT(BPF_RET+BPF_K, 0),
1171 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1172 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1173 BPF_STMT(BPF_RET+BPF_K, 1),
1174 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1175 BPF_STMT(BPF_RET+BPF_K, 2),
1176 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1177 BPF_STMT(BPF_RET+BPF_K, 3),
1178 BPF_STMT(BPF_RET+BPF_K, 4),
1179 BPF_STMT(BPF_RET+BPF_K, 5),
1180 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1181 BPF_STMT(BPF_RET+BPF_K, 6),
1182 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1183 BPF_STMT(BPF_RET+BPF_K, 7),
1184 BPF_STMT(BPF_RET+BPF_K, 8)
1188 uint8_t pkt[8]; /* the program doesn't read any data */
1190 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1194 ATF_CHECK(prog_validate(insns, insn_count));
1197 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1199 ATF_REQUIRE(code != NULL);
1201 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1202 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1203 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1204 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1205 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1206 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1207 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1208 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1211 rumpns_bpfjit_free_code(code);
1215 ATF_TC(bpfjit_jmp_jge_k);
1216 ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
1218 atf_tc_set_md_var(tc, "descr",
1219 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1222 ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
1224 static struct bpf_insn insns[] = {
1225 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1226 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1227 BPF_STMT(BPF_RET+BPF_K, 0),
1228 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1229 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1230 BPF_STMT(BPF_RET+BPF_K, 1),
1231 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1232 BPF_STMT(BPF_RET+BPF_K, 2),
1233 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1234 BPF_STMT(BPF_RET+BPF_K, 3),
1235 BPF_STMT(BPF_RET+BPF_K, 4),
1236 BPF_STMT(BPF_RET+BPF_K, 5),
1237 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1238 BPF_STMT(BPF_RET+BPF_K, 6),
1239 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1240 BPF_STMT(BPF_RET+BPF_K, 7),
1241 BPF_STMT(BPF_RET+BPF_K, 8)
1245 uint8_t pkt[8]; /* the program doesn't read any data */
1247 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1251 ATF_CHECK(prog_validate(insns, insn_count));
1254 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1256 ATF_REQUIRE(code != NULL);
1258 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1259 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1260 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1261 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1262 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1263 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1264 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1265 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1268 rumpns_bpfjit_free_code(code);
1272 ATF_TC(bpfjit_jmp_jeq_k);
1273 ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
1275 atf_tc_set_md_var(tc, "descr",
1276 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1279 ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
1281 static struct bpf_insn insns[] = {
1282 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1283 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1284 BPF_STMT(BPF_RET+BPF_K, 0),
1285 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1286 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1287 BPF_STMT(BPF_RET+BPF_K, 1),
1288 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1289 BPF_STMT(BPF_RET+BPF_K, 2),
1290 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1291 BPF_STMT(BPF_RET+BPF_K, 3),
1292 BPF_STMT(BPF_RET+BPF_K, 4),
1293 BPF_STMT(BPF_RET+BPF_K, 5),
1294 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1295 BPF_STMT(BPF_RET+BPF_K, 6),
1296 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1297 BPF_STMT(BPF_RET+BPF_K, 7),
1298 BPF_STMT(BPF_RET+BPF_K, 8)
1302 uint8_t pkt[8]; /* the program doesn't read any data */
1304 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1308 ATF_CHECK(prog_validate(insns, insn_count));
1311 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1313 ATF_REQUIRE(code != NULL);
1315 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1316 ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1317 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1318 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1319 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1320 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1321 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1322 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1325 rumpns_bpfjit_free_code(code);
1329 ATF_TC(bpfjit_jmp_jset_k);
1330 ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
1332 atf_tc_set_md_var(tc, "descr",
1333 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1336 ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
1338 static struct bpf_insn insns[] = {
1339 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1340 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1341 BPF_STMT(BPF_RET+BPF_K, 0),
1342 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1343 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1344 BPF_STMT(BPF_RET+BPF_K, 1),
1345 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1346 BPF_STMT(BPF_RET+BPF_K, 2),
1347 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1348 BPF_STMT(BPF_RET+BPF_K, 3),
1349 BPF_STMT(BPF_RET+BPF_K, 4),
1350 BPF_STMT(BPF_RET+BPF_K, 5),
1351 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1352 BPF_STMT(BPF_RET+BPF_K, 6),
1353 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1354 BPF_STMT(BPF_RET+BPF_K, 7),
1355 BPF_STMT(BPF_RET+BPF_K, 8)
1359 uint8_t pkt[8]; /* the program doesn't read any data */
1361 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1365 ATF_CHECK(prog_validate(insns, insn_count));
1368 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1370 ATF_REQUIRE(code != NULL);
1372 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1373 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1374 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1375 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1376 ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1377 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1378 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1379 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1382 rumpns_bpfjit_free_code(code);
1386 ATF_TC(bpfjit_jmp_modulo_k);
1387 ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
1389 atf_tc_set_md_var(tc, "descr",
1390 "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1393 ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
1395 static struct bpf_insn insns[] = {
1396 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1397 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1398 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1399 BPF_STMT(BPF_RET+BPF_K, 0),
1400 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1401 BPF_STMT(BPF_RET+BPF_K, 1),
1402 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1403 BPF_STMT(BPF_RET+BPF_K, 2),
1404 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1405 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1406 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1407 BPF_STMT(BPF_JMP+BPF_JA, 1),
1408 BPF_STMT(BPF_RET+BPF_K, 3),
1410 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1411 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1413 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1414 BPF_STMT(BPF_RET+BPF_K, 4),
1415 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1416 BPF_STMT(BPF_RET+BPF_K, 5),
1417 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1418 BPF_STMT(BPF_RET+BPF_K, 6),
1419 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1420 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1421 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1422 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1423 BPF_STMT(BPF_RET+BPF_K, 7)
1426 uint8_t pkt[1]; /* the program doesn't read any data */
1428 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1432 ATF_CHECK(prog_validate(insns, insn_count));
1433 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
1436 ATF_TC(bpfjit_jmp_jgt_x);
1437 ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
1439 atf_tc_set_md_var(tc, "descr",
1440 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1443 ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
1445 static struct bpf_insn insns[] = {
1446 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1447 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1448 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1449 BPF_STMT(BPF_RET+BPF_K, 0),
1450 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1451 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1452 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1453 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1454 BPF_STMT(BPF_RET+BPF_K, 1),
1455 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1456 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1457 BPF_STMT(BPF_RET+BPF_K, 2),
1458 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1459 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1460 BPF_STMT(BPF_RET+BPF_K, 3),
1461 BPF_STMT(BPF_RET+BPF_K, 4),
1462 BPF_STMT(BPF_RET+BPF_K, 5),
1463 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1464 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1465 BPF_STMT(BPF_RET+BPF_K, 6),
1466 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1467 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1468 BPF_STMT(BPF_RET+BPF_K, 7),
1469 BPF_STMT(BPF_RET+BPF_K, 8)
1473 uint8_t pkt[8]; /* the program doesn't read any data */
1475 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1479 ATF_CHECK(prog_validate(insns, insn_count));
1482 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1484 ATF_REQUIRE(code != NULL);
1486 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1487 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1488 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1489 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1490 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1491 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1492 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1493 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1496 rumpns_bpfjit_free_code(code);
1500 ATF_TC(bpfjit_jmp_jge_x);
1501 ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
1503 atf_tc_set_md_var(tc, "descr",
1504 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1507 ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
1509 static struct bpf_insn insns[] = {
1510 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1511 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1512 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1513 BPF_STMT(BPF_RET+BPF_K, 0),
1514 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1515 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1516 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1517 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1518 BPF_STMT(BPF_RET+BPF_K, 1),
1519 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1520 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1521 BPF_STMT(BPF_RET+BPF_K, 2),
1522 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1523 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1524 BPF_STMT(BPF_RET+BPF_K, 3),
1525 BPF_STMT(BPF_RET+BPF_K, 4),
1526 BPF_STMT(BPF_RET+BPF_K, 5),
1527 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1528 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1529 BPF_STMT(BPF_RET+BPF_K, 6),
1530 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1531 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1532 BPF_STMT(BPF_RET+BPF_K, 7),
1533 BPF_STMT(BPF_RET+BPF_K, 8)
1537 uint8_t pkt[8]; /* the program doesn't read any data */
1539 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1543 ATF_CHECK(prog_validate(insns, insn_count));
1546 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1548 ATF_REQUIRE(code != NULL);
1550 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1551 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1552 ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1553 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1554 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1555 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1556 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1557 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1560 rumpns_bpfjit_free_code(code);
1564 ATF_TC(bpfjit_jmp_jeq_x);
1565 ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
1567 atf_tc_set_md_var(tc, "descr",
1568 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1571 ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
1573 static struct bpf_insn insns[] = {
1574 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1575 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1576 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1577 BPF_STMT(BPF_RET+BPF_K, 0),
1578 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1579 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1580 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1581 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1582 BPF_STMT(BPF_RET+BPF_K, 1),
1583 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1584 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1585 BPF_STMT(BPF_RET+BPF_K, 2),
1586 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1587 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1588 BPF_STMT(BPF_RET+BPF_K, 3),
1589 BPF_STMT(BPF_RET+BPF_K, 4),
1590 BPF_STMT(BPF_RET+BPF_K, 5),
1591 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1592 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1593 BPF_STMT(BPF_RET+BPF_K, 6),
1594 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1595 BPF_STMT(BPF_RET+BPF_K, 7),
1596 BPF_STMT(BPF_RET+BPF_K, 8)
1600 uint8_t pkt[8]; /* the program doesn't read any data */
1602 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1606 ATF_CHECK(prog_validate(insns, insn_count));
1609 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1611 ATF_REQUIRE(code != NULL);
1613 ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1614 ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1615 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1616 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1617 ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1618 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1619 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1620 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1623 rumpns_bpfjit_free_code(code);
1627 ATF_TC(bpfjit_jmp_jset_x);
1628 ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
1630 atf_tc_set_md_var(tc, "descr",
1631 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1634 ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
1636 static struct bpf_insn insns[] = {
1637 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1638 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1639 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1640 BPF_STMT(BPF_RET+BPF_K, 0),
1641 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1642 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1643 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1644 BPF_STMT(BPF_RET+BPF_K, 1),
1645 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1646 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1647 BPF_STMT(BPF_RET+BPF_K, 2),
1648 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1649 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1650 BPF_STMT(BPF_RET+BPF_K, 3),
1651 BPF_STMT(BPF_RET+BPF_K, 4),
1652 BPF_STMT(BPF_RET+BPF_K, 5),
1653 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1654 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1655 BPF_STMT(BPF_RET+BPF_K, 6),
1656 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1657 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1658 BPF_STMT(BPF_RET+BPF_K, 7),
1659 BPF_STMT(BPF_RET+BPF_K, 8)
1663 uint8_t pkt[8]; /* the program doesn't read any data */
1665 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1669 ATF_CHECK(prog_validate(insns, insn_count));
1672 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1674 ATF_REQUIRE(code != NULL);
1676 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1677 ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1678 ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1679 ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1680 ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
1681 ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1682 ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1683 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1686 rumpns_bpfjit_free_code(code);
1690 ATF_TC(bpfjit_jmp_modulo_x);
1691 ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
1693 atf_tc_set_md_var(tc, "descr",
1694 "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1697 ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
1699 static struct bpf_insn insns[] = {
1700 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1701 /* FFFFF770 << 4 = FFFFF770 */
1702 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1704 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1705 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1706 BPF_STMT(BPF_RET+BPF_K, 0),
1707 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1708 BPF_STMT(BPF_RET+BPF_K, 1),
1709 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1710 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1711 BPF_STMT(BPF_RET+BPF_K, 2),
1712 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1713 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1714 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1715 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1716 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1717 BPF_STMT(BPF_JMP+BPF_JA, 1),
1718 BPF_STMT(BPF_RET+BPF_K, 3),
1720 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1721 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1723 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1724 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1725 BPF_STMT(BPF_RET+BPF_K, 4),
1726 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1727 BPF_STMT(BPF_RET+BPF_K, 5),
1728 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1729 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1730 BPF_STMT(BPF_RET+BPF_K, 6),
1731 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1732 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1733 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1734 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1735 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1736 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1737 BPF_STMT(BPF_RET+BPF_K, 7)
1740 uint8_t pkt[1]; /* the program doesn't read any data */
1742 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1746 ATF_CHECK(prog_validate(insns, insn_count));
1747 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
1750 ATF_TC(bpfjit_ld_abs);
1751 ATF_TC_HEAD(bpfjit_ld_abs, tc)
1753 atf_tc_set_md_var(tc, "descr",
1754 "Test JIT compilation of BPF_LD+BPF_ABS");
1757 ATF_TC_BODY(bpfjit_ld_abs, tc)
1759 static struct bpf_insn insns[3][2] = {
1761 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1762 BPF_STMT(BPF_RET+BPF_A, 0)
1765 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1766 BPF_STMT(BPF_RET+BPF_A, 0)
1769 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1770 BPF_STMT(BPF_RET+BPF_A, 0)
1774 static size_t lengths[3] = { 1, 2, 4 };
1775 static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1778 uint8_t *pkt = deadbeef_at_5;
1779 size_t pktsize = sizeof(deadbeef_at_5);
1781 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1785 for (i = 0; i < 3; i++) {
1788 ATF_CHECK(prog_validate(insns[i], insn_count));
1791 code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
1793 ATF_REQUIRE(code != NULL);
1795 for (l = 1; l < 5 + lengths[i]; l++) {
1796 ATF_CHECK(jitcall(code, pkt, l, l) == 0);
1797 ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
1801 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1802 ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
1805 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1808 rumpns_bpfjit_free_code(code);
1813 ATF_TC(bpfjit_ld_abs_k_overflow);
1814 ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
1816 atf_tc_set_md_var(tc, "descr",
1817 "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1820 ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
1822 static struct bpf_insn insns[12][3] = {
1824 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1825 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1826 BPF_STMT(BPF_RET+BPF_K, 1)
1829 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1830 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1831 BPF_STMT(BPF_RET+BPF_K, 1)
1834 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1835 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1836 BPF_STMT(BPF_RET+BPF_K, 1)
1839 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1840 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1841 BPF_STMT(BPF_RET+BPF_K, 1)
1844 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1845 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1846 BPF_STMT(BPF_RET+BPF_K, 1)
1849 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1850 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1851 BPF_STMT(BPF_RET+BPF_K, 1)
1854 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1855 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1856 BPF_STMT(BPF_RET+BPF_K, 1)
1859 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1860 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1861 BPF_STMT(BPF_RET+BPF_K, 1)
1864 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1865 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1866 BPF_STMT(BPF_RET+BPF_K, 1)
1869 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1870 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1871 BPF_STMT(BPF_RET+BPF_K, 1)
1874 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1875 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1876 BPF_STMT(BPF_RET+BPF_K, 1)
1879 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1880 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1881 BPF_STMT(BPF_RET+BPF_K, 1)
1886 uint8_t pkt[8] = { 0 };
1888 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1892 for (i = 0; i < 3; i++) {
1893 ATF_CHECK(prog_validate(insns[i], insn_count));
1894 ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
1898 ATF_TC(bpfjit_ld_ind);
1899 ATF_TC_HEAD(bpfjit_ld_ind, tc)
1901 atf_tc_set_md_var(tc, "descr",
1902 "Test JIT compilation of BPF_LD+BPF_IND");
1905 ATF_TC_BODY(bpfjit_ld_ind, tc)
1907 static struct bpf_insn insns[6][3] = {
1909 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1910 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
1911 BPF_STMT(BPF_RET+BPF_A, 0)
1914 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1915 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
1916 BPF_STMT(BPF_RET+BPF_A, 0)
1919 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1920 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
1921 BPF_STMT(BPF_RET+BPF_A, 0)
1924 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1925 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
1926 BPF_STMT(BPF_RET+BPF_A, 0)
1929 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1930 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
1931 BPF_STMT(BPF_RET+BPF_A, 0)
1934 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1935 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
1936 BPF_STMT(BPF_RET+BPF_A, 0)
1940 static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
1942 static unsigned int expected[6] = {
1943 0xde, 0xdead, 0xdeadbeef,
1944 0xde, 0xdead, 0xdeadbeef
1948 uint8_t *pkt = deadbeef_at_5;
1949 size_t pktsize = sizeof(deadbeef_at_5);
1951 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1955 for (i = 0; i < 3; i++) {
1958 ATF_CHECK(prog_validate(insns[i], insn_count));
1961 code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
1963 ATF_REQUIRE(code != NULL);
1965 for (l = 1; l < 5 + lengths[i]; l++) {
1966 ATF_CHECK(jitcall(code, pkt, l, l) == 0);
1967 ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
1971 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1972 ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
1975 ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
1978 rumpns_bpfjit_free_code(code);
1983 ATF_TC(bpfjit_ld_ind_k_overflow);
1984 ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
1986 atf_tc_set_md_var(tc, "descr",
1987 "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
1990 ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
1992 static struct bpf_insn insns[12][3] = {
1994 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
1995 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
1996 BPF_STMT(BPF_RET+BPF_K, 1)
1999 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2000 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2001 BPF_STMT(BPF_RET+BPF_K, 1)
2004 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2005 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2006 BPF_STMT(BPF_RET+BPF_K, 1)
2009 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2010 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2011 BPF_STMT(BPF_RET+BPF_K, 1)
2014 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2015 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2016 BPF_STMT(BPF_RET+BPF_K, 1)
2019 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2020 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2021 BPF_STMT(BPF_RET+BPF_K, 1)
2024 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2025 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2026 BPF_STMT(BPF_RET+BPF_K, 1)
2029 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2030 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2031 BPF_STMT(BPF_RET+BPF_K, 1)
2034 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2035 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2036 BPF_STMT(BPF_RET+BPF_K, 1)
2039 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2040 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2041 BPF_STMT(BPF_RET+BPF_K, 1)
2044 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2045 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2046 BPF_STMT(BPF_RET+BPF_K, 1)
2049 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2050 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2051 BPF_STMT(BPF_RET+BPF_K, 1)
2056 uint8_t pkt[8] = { 0 };
2058 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2062 for (i = 0; i < 3; i++) {
2064 ATF_CHECK(prog_validate(insns[i], insn_count));
2065 ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
2069 ATF_TC(bpfjit_ld_ind_x_overflow1);
2070 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2072 atf_tc_set_md_var(tc, "descr",
2073 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2076 ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2078 static struct bpf_insn insns[] = {
2079 BPF_STMT(BPF_LD+BPF_LEN, 0),
2080 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2081 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2082 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2083 BPF_STMT(BPF_RET+BPF_A, 0)
2088 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2090 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2094 ATF_CHECK(prog_validate(insns, insn_count));
2097 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2099 ATF_REQUIRE(code != NULL);
2101 for (i = 1; i <= sizeof(pkt); i++) {
2102 //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2103 ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2107 rumpns_bpfjit_free_code(code);
2111 ATF_TC(bpfjit_ld_ind_x_overflow2);
2112 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2114 atf_tc_set_md_var(tc, "descr",
2115 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2118 ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2120 static struct bpf_insn insns[] = {
2121 BPF_STMT(BPF_LD+BPF_LEN, 0),
2122 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2123 BPF_STMT(BPF_ST, 3),
2124 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2125 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2126 BPF_STMT(BPF_RET+BPF_A, 0)
2131 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2133 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2137 ATF_CHECK(prog_validate(insns, insn_count));
2140 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2142 ATF_REQUIRE(code != NULL);
2144 for (i = 1; i <= sizeof(pkt); i++) {
2145 //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2146 ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2150 rumpns_bpfjit_free_code(code);
2154 ATF_TC(bpfjit_ld_len);
2155 ATF_TC_HEAD(bpfjit_ld_len, tc)
2157 atf_tc_set_md_var(tc, "descr",
2158 "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2161 ATF_TC_BODY(bpfjit_ld_len, tc)
2163 static struct bpf_insn insns[] = {
2164 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2165 BPF_STMT(BPF_RET+BPF_A, 0)
2170 uint8_t pkt[32]; /* the program doesn't read any data */
2172 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2176 ATF_CHECK(prog_validate(insns, insn_count));
2179 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2181 ATF_REQUIRE(code != NULL);
2183 for (i = 0; i < sizeof(pkt); i++)
2184 ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2187 rumpns_bpfjit_free_code(code);
2191 ATF_TC(bpfjit_ld_imm);
2192 ATF_TC_HEAD(bpfjit_ld_imm, tc)
2194 atf_tc_set_md_var(tc, "descr",
2195 "Test JIT compilation of BPF_LD+BPF_IMM");
2198 ATF_TC_BODY(bpfjit_ld_imm, tc)
2200 static struct bpf_insn insns[] = {
2201 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2202 BPF_STMT(BPF_RET+BPF_A, 0)
2205 uint8_t pkt[1]; /* the program doesn't read any data */
2207 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2211 ATF_CHECK(prog_validate(insns, insn_count));
2212 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2215 ATF_TC(bpfjit_ldx_imm1);
2216 ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2218 atf_tc_set_md_var(tc, "descr",
2219 "Test JIT compilation of BPF_LDX+BPF_IMM");
2222 ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2224 static struct bpf_insn insns[] = {
2225 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2226 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2227 BPF_STMT(BPF_RET+BPF_A, 0)
2230 uint8_t pkt[1]; /* the program doesn't read any data */
2232 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2236 ATF_CHECK(prog_validate(insns, insn_count));
2237 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX - 5);
2240 ATF_TC(bpfjit_ldx_imm2);
2241 ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2243 atf_tc_set_md_var(tc, "descr",
2244 "Test JIT compilation of BPF_LDX+BPF_IMM");
2247 ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2249 static struct bpf_insn insns[] = {
2250 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2251 BPF_STMT(BPF_LD+BPF_IMM, 5),
2252 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2253 BPF_STMT(BPF_RET+BPF_K, 7),
2254 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2257 uint8_t pkt[1]; /* the program doesn't read any data */
2259 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2263 ATF_CHECK(prog_validate(insns, insn_count));
2264 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2267 ATF_TC(bpfjit_ldx_len1);
2268 ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2270 atf_tc_set_md_var(tc, "descr",
2271 "Test JIT compilation of BPF_LDX+BPF_LEN");
2274 ATF_TC_BODY(bpfjit_ldx_len1, tc)
2276 static struct bpf_insn insns[] = {
2277 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2278 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2279 BPF_STMT(BPF_RET+BPF_A, 0)
2284 uint8_t pkt[5]; /* the program doesn't read any data */
2286 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2290 ATF_CHECK(prog_validate(insns, insn_count));
2293 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2295 ATF_REQUIRE(code != NULL);
2297 for (i = 1; i < sizeof(pkt); i++) {
2298 ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2299 ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2303 rumpns_bpfjit_free_code(code);
2307 ATF_TC(bpfjit_ldx_len2);
2308 ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2310 atf_tc_set_md_var(tc, "descr",
2311 "Test JIT compilation of BPF_LDX+BPF_LEN");
2314 ATF_TC_BODY(bpfjit_ldx_len2, tc)
2316 static struct bpf_insn insns[] = {
2317 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2318 BPF_STMT(BPF_LD+BPF_IMM, 5),
2319 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2320 BPF_STMT(BPF_RET+BPF_K, 7),
2321 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2325 uint8_t pkt[5]; /* the program doesn't read any data */
2327 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2331 ATF_CHECK(prog_validate(insns, insn_count));
2334 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2336 ATF_REQUIRE(code != NULL);
2338 ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
2339 ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
2342 rumpns_bpfjit_free_code(code);
2346 ATF_TC(bpfjit_ldx_msh);
2347 ATF_TC_HEAD(bpfjit_ldx_msh, tc)
2349 atf_tc_set_md_var(tc, "descr",
2350 "Test JIT compilation of BPF_LDX+BPF_MSH");
2353 ATF_TC_BODY(bpfjit_ldx_msh, tc)
2355 static struct bpf_insn insns[] = {
2356 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2357 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2358 BPF_STMT(BPF_RET+BPF_A, 0)
2361 uint8_t pkt[2] = { 0, 0x7a };
2363 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2367 ATF_CHECK(prog_validate(insns, insn_count));
2368 ATF_CHECK(exec_prog(insns, insn_count, pkt, 2) == 40);
2371 ATF_TC(bpfjit_misc_tax);
2372 ATF_TC_HEAD(bpfjit_misc_tax, tc)
2374 atf_tc_set_md_var(tc, "descr",
2375 "Test JIT compilation of BPF_MISC+BPF_TAX");
2378 ATF_TC_BODY(bpfjit_misc_tax, tc)
2380 static struct bpf_insn insns[] = {
2381 BPF_STMT(BPF_LD+BPF_IMM, 3),
2382 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2383 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2384 BPF_STMT(BPF_RET+BPF_A, 0)
2387 uint8_t pkt[6] = { 0, 11, 22, 33, 44, 55 };
2389 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2393 ATF_CHECK(prog_validate(insns, insn_count));
2394 ATF_CHECK(exec_prog(insns, insn_count, pkt, 6) == 55);
2397 ATF_TC(bpfjit_misc_txa);
2398 ATF_TC_HEAD(bpfjit_misc_txa, tc)
2400 atf_tc_set_md_var(tc, "descr",
2401 "Test JIT compilation of BPF_MISC+BPF_TXA");
2404 ATF_TC_BODY(bpfjit_misc_txa, tc)
2406 static struct bpf_insn insns[] = {
2407 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2408 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2409 BPF_STMT(BPF_RET+BPF_A, 0)
2412 uint8_t pkt[1]; /* the program doesn't read any data */
2414 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2418 ATF_CHECK(prog_validate(insns, insn_count));
2419 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 391);
2423 ATF_TC_HEAD(bpfjit_st1, tc)
2425 atf_tc_set_md_var(tc, "descr",
2426 "Test JIT compilation of BPF_ST");
2429 ATF_TC_BODY(bpfjit_st1, tc)
2431 static struct bpf_insn insns[] = {
2432 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2433 BPF_STMT(BPF_ST, 0),
2434 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
2435 BPF_STMT(BPF_LD+BPF_MEM, 0),
2436 BPF_STMT(BPF_RET+BPF_A, 0)
2441 uint8_t pkt[16]; /* the program doesn't read any data */
2443 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2447 ATF_CHECK(prog_validate(insns, insn_count));
2450 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2452 ATF_REQUIRE(code != NULL);
2454 for (i = 1; i <= sizeof(pkt); i++)
2455 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2458 rumpns_bpfjit_free_code(code);
2463 ATF_TC_HEAD(bpfjit_st2, tc)
2465 atf_tc_set_md_var(tc, "descr",
2466 "Test JIT compilation of BPF_ST");
2469 ATF_TC_BODY(bpfjit_st2, tc)
2471 static struct bpf_insn insns[] = {
2472 BPF_STMT(BPF_ST, 0),
2473 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2474 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2475 BPF_STMT(BPF_LD+BPF_MEM, 0),
2476 BPF_STMT(BPF_RET+BPF_A, 0)
2479 uint8_t pkt[1]; /* the program doesn't read any data */
2481 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2485 ATF_CHECK(prog_validate(insns, insn_count));
2486 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
2490 ATF_TC_HEAD(bpfjit_st3, tc)
2492 atf_tc_set_md_var(tc, "descr",
2493 "Test JIT compilation of BPF_ST");
2496 ATF_TC_BODY(bpfjit_st3, tc)
2498 static struct bpf_insn insns[] = {
2499 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2500 BPF_STMT(BPF_ST, 0),
2501 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2502 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2503 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2504 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2505 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2506 BPF_STMT(BPF_RET+BPF_A, 0),
2507 BPF_STMT(BPF_LD+BPF_MEM, 0),
2508 BPF_STMT(BPF_RET+BPF_A, 0)
2512 uint8_t pkt[2]; /* the program doesn't read any data */
2514 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2516 ATF_REQUIRE(BPF_MEMWORDS > 1);
2520 ATF_CHECK(prog_validate(insns, insn_count));
2523 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2525 ATF_REQUIRE(code != NULL);
2527 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2528 ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2531 rumpns_bpfjit_free_code(code);
2536 ATF_TC_HEAD(bpfjit_st4, tc)
2538 atf_tc_set_md_var(tc, "descr",
2539 "Test JIT compilation of BPF_ST");
2542 ATF_TC_BODY(bpfjit_st4, tc)
2544 static struct bpf_insn insns[] = {
2545 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2546 BPF_STMT(BPF_ST, 5),
2547 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2548 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2549 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2550 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2551 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2552 BPF_STMT(BPF_RET+BPF_A, 0),
2553 BPF_STMT(BPF_LD+BPF_MEM, 5),
2554 BPF_STMT(BPF_RET+BPF_A, 0)
2558 uint8_t pkt[2]; /* the program doesn't read any data */
2560 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2562 ATF_REQUIRE(BPF_MEMWORDS > 6);
2566 ATF_CHECK(prog_validate(insns, insn_count));
2569 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2571 ATF_REQUIRE(code != NULL);
2573 ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2574 ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
2577 rumpns_bpfjit_free_code(code);
2582 ATF_TC_HEAD(bpfjit_st5, tc)
2584 atf_tc_set_md_var(tc, "descr",
2585 "Test JIT compilation of BPF_ST");
2588 ATF_TC_BODY(bpfjit_st5, tc)
2590 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2591 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2595 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2597 memset(insns, 0, sizeof(insns));
2599 /* for each k do M[k] = k */
2600 for (k = 0; k < BPF_MEMWORDS; k++) {
2601 insns[2*k].code = BPF_LD+BPF_IMM;
2603 insns[2*k+1].code = BPF_ST;
2607 /* load wirelen into A */
2608 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2610 /* for each k, if (A == k + 1) return M[k] */
2611 for (k = 0; k < BPF_MEMWORDS; k++) {
2612 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2613 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2614 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2615 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2616 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2617 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2618 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2619 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2622 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2623 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2627 ATF_CHECK(prog_validate(insns, insn_count));
2630 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2632 ATF_REQUIRE(code != NULL);
2634 for (k = 1; k <= sizeof(pkt); k++)
2635 ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2638 rumpns_bpfjit_free_code(code);
2642 ATF_TC(bpfjit_stx1);
2643 ATF_TC_HEAD(bpfjit_stx1, tc)
2645 atf_tc_set_md_var(tc, "descr",
2646 "Test JIT compilation of BPF_STX");
2649 ATF_TC_BODY(bpfjit_stx1, tc)
2651 static struct bpf_insn insns[] = {
2652 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2653 BPF_STMT(BPF_STX, 0),
2654 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2655 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2656 BPF_STMT(BPF_RET+BPF_A, 0)
2661 uint8_t pkt[16]; /* the program doesn't read any data */
2663 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2667 ATF_CHECK(prog_validate(insns, insn_count));
2670 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2672 ATF_REQUIRE(code != NULL);
2674 for (i = 1; i <= sizeof(pkt); i++)
2675 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
2678 rumpns_bpfjit_free_code(code);
2682 ATF_TC(bpfjit_stx2);
2683 ATF_TC_HEAD(bpfjit_stx2, tc)
2685 atf_tc_set_md_var(tc, "descr",
2686 "Test JIT compilation of BPF_STX");
2689 ATF_TC_BODY(bpfjit_stx2, tc)
2691 static struct bpf_insn insns[] = {
2692 BPF_STMT(BPF_ST, 0),
2693 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2694 BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2695 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2696 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2697 BPF_STMT(BPF_RET+BPF_A, 0)
2700 uint8_t pkt[1]; /* the program doesn't read any data */
2702 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2706 ATF_CHECK(prog_validate(insns, insn_count));
2707 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
2710 ATF_TC(bpfjit_stx3);
2711 ATF_TC_HEAD(bpfjit_stx3, tc)
2713 atf_tc_set_md_var(tc, "descr",
2714 "Test JIT compilation of BPF_STX");
2717 ATF_TC_BODY(bpfjit_stx3, tc)
2719 static struct bpf_insn insns[] = {
2720 BPF_STMT(BPF_STX, 6),
2721 BPF_STMT(BPF_ST, 1),
2722 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2723 BPF_STMT(BPF_STX, 5),
2724 BPF_STMT(BPF_STX, 2),
2725 BPF_STMT(BPF_STX, 3),
2726 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2727 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2728 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2729 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2730 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2731 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2732 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2733 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2734 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2735 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2736 BPF_STMT(BPF_RET+BPF_A, 0)
2741 uint8_t pkt[16]; /* the program doesn't read any data */
2743 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2747 ATF_CHECK(prog_validate(insns, insn_count));
2750 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2752 ATF_REQUIRE(code != NULL);
2754 for (i = 1; i <= sizeof(pkt); i++)
2755 ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
2758 rumpns_bpfjit_free_code(code);
2762 ATF_TC(bpfjit_stx4);
2763 ATF_TC_HEAD(bpfjit_stx4, tc)
2765 atf_tc_set_md_var(tc, "descr",
2766 "Test JIT compilation of BPF_STX");
2769 ATF_TC_BODY(bpfjit_stx4, tc)
2771 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2772 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2776 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2778 memset(insns, 0, sizeof(insns));
2780 /* for each k do M[k] = k */
2781 for (k = 0; k < BPF_MEMWORDS; k++) {
2782 insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
2784 insns[2*k+1].code = BPF_STX;
2788 /* load wirelen into A */
2789 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2791 /* for each k, if (A == k + 1) return M[k] */
2792 for (k = 0; k < BPF_MEMWORDS; k++) {
2793 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2794 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2795 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2796 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2797 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2798 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2799 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2800 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2803 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2804 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2808 ATF_CHECK(prog_validate(insns, insn_count));
2811 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2813 ATF_REQUIRE(code != NULL);
2815 for (k = 1; k <= sizeof(pkt); k++)
2816 ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
2819 rumpns_bpfjit_free_code(code);
2823 ATF_TC(bpfjit_opt_ld_abs_1);
2824 ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
2826 atf_tc_set_md_var(tc, "descr",
2827 "Test JIT compilation with length optimization "
2828 "applied to BPF_LD+BPF_ABS");
2831 ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
2833 static struct bpf_insn insns[] = {
2834 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2835 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2836 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2837 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2838 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2839 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2840 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2841 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2842 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2843 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2844 BPF_STMT(BPF_RET+BPF_K, 0),
2849 uint8_t pkt[2][34] = {
2851 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2852 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2853 0x80, 0x03, 0x70, 0x0f,
2854 0x80, 0x03, 0x70, 0x23
2857 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2858 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2859 0x80, 0x03, 0x70, 0x23,
2860 0x80, 0x03, 0x70, 0x0f
2864 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2868 ATF_CHECK(prog_validate(insns, insn_count));
2871 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2873 ATF_REQUIRE(code != NULL);
2875 for (i = 0; i < 2; i++) {
2876 for (j = 1; j < sizeof(pkt[i]); j++)
2877 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
2878 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
2882 rumpns_bpfjit_free_code(code);
2886 ATF_TC(bpfjit_opt_ld_abs_2);
2887 ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
2889 atf_tc_set_md_var(tc, "descr",
2890 "Test JIT compilation with length optimization "
2891 "applied to BPF_LD+BPF_ABS");
2894 ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
2896 static struct bpf_insn insns[] = {
2897 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2898 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2899 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2900 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2901 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2902 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2903 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2904 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2905 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2906 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2907 BPF_STMT(BPF_RET+BPF_K, 0),
2912 uint8_t pkt[2][34] = {
2914 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2915 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2916 0x80, 0x03, 0x70, 0x0f,
2917 0x80, 0x03, 0x70, 0x23
2920 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2921 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2922 0x80, 0x03, 0x70, 0x23,
2923 0x80, 0x03, 0x70, 0x0f
2927 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2931 ATF_CHECK(prog_validate(insns, insn_count));
2934 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2936 ATF_REQUIRE(code != NULL);
2938 for (i = 0; i < 2; i++) {
2939 for (j = 1; j < sizeof(pkt[i]); j++)
2940 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
2941 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
2945 rumpns_bpfjit_free_code(code);
2949 ATF_TC(bpfjit_opt_ld_abs_3);
2950 ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
2952 atf_tc_set_md_var(tc, "descr",
2953 "Test JIT compilation with length optimization "
2954 "applied to BPF_LD+BPF_ABS");
2957 ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
2959 static struct bpf_insn insns[] = {
2960 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2961 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
2962 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2963 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
2964 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
2965 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2966 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2967 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2968 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2969 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2970 BPF_STMT(BPF_RET+BPF_K, 0),
2975 uint8_t pkt[2][34] = {
2977 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2978 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2979 0x80, 0x03, 0x70, 0x0f,
2980 0x80, 0x03, 0x70, 0x23
2983 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2984 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2985 0x80, 0x03, 0x70, 0x23,
2986 0x80, 0x03, 0x70, 0x0f
2990 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2994 ATF_CHECK(prog_validate(insns, insn_count));
2997 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2999 ATF_REQUIRE(code != NULL);
3001 for (i = 0; i < 2; i++) {
3002 for (j = 1; j < sizeof(pkt[i]); j++)
3003 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3004 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3008 rumpns_bpfjit_free_code(code);
3012 ATF_TC(bpfjit_opt_ld_ind_1);
3013 ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3015 atf_tc_set_md_var(tc, "descr",
3016 "Test JIT compilation with length optimization "
3017 "applied to BPF_LD+BPF_IND");
3020 ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3022 static struct bpf_insn insns[] = {
3023 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3024 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3025 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3026 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3027 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3028 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3029 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3030 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3031 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3032 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3033 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3034 BPF_STMT(BPF_RET+BPF_K, 0),
3039 uint8_t pkt[2][34] = {
3041 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3042 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3043 0x80, 0x03, 0x70, 0x0f,
3044 0x80, 0x03, 0x70, 0x23
3047 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3048 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3049 0x80, 0x03, 0x70, 0x23,
3050 0x80, 0x03, 0x70, 0x0f
3054 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3058 ATF_CHECK(prog_validate(insns, insn_count));
3061 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3063 ATF_REQUIRE(code != NULL);
3065 for (i = 0; i < 2; i++) {
3066 for (j = 1; j < sizeof(pkt[i]); j++)
3067 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3068 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3072 rumpns_bpfjit_free_code(code);
3076 ATF_TC(bpfjit_opt_ld_ind_2);
3077 ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3079 atf_tc_set_md_var(tc, "descr",
3080 "Test JIT compilation with length optimization "
3081 "applied to BPF_LD+BPF_IND");
3084 ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3086 static struct bpf_insn insns[] = {
3087 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3088 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3089 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3090 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3091 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3092 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3093 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3094 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3095 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3096 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3097 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3098 BPF_STMT(BPF_RET+BPF_K, 0),
3103 uint8_t pkt[2][34] = {
3105 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3106 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3107 0x80, 0x03, 0x70, 0x0f,
3108 0x80, 0x03, 0x70, 0x23
3111 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3112 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3113 0x80, 0x03, 0x70, 0x23,
3114 0x80, 0x03, 0x70, 0x0f
3118 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3122 ATF_CHECK(prog_validate(insns, insn_count));
3125 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3127 ATF_REQUIRE(code != NULL);
3129 for (i = 0; i < 2; i++) {
3130 for (j = 1; j < sizeof(pkt[i]); j++)
3131 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3132 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3136 rumpns_bpfjit_free_code(code);
3140 ATF_TC(bpfjit_opt_ld_ind_3);
3141 ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3143 atf_tc_set_md_var(tc, "descr",
3144 "Test JIT compilation with length optimization "
3145 "applied to BPF_LD+BPF_IND");
3148 ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3150 static struct bpf_insn insns[] = {
3151 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3152 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3153 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3154 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3155 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3156 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3157 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3158 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3159 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3160 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3161 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3162 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3163 BPF_STMT(BPF_RET+BPF_K, 0),
3168 uint8_t pkt[2][34] = {
3170 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3171 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3172 0x80, 0x03, 0x70, 0x0f,
3173 0x80, 0x03, 0x70, 0x23
3176 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3177 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3178 0x80, 0x03, 0x70, 0x23,
3179 0x80, 0x03, 0x70, 0x0f
3183 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3187 ATF_CHECK(prog_validate(insns, insn_count));
3190 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3192 ATF_REQUIRE(code != NULL);
3194 for (i = 0; i < 2; i++) {
3195 for (j = 1; j < sizeof(pkt[i]); j++)
3196 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3197 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3201 rumpns_bpfjit_free_code(code);
3205 ATF_TC(bpfjit_opt_ld_ind_4);
3206 ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3208 atf_tc_set_md_var(tc, "descr",
3209 "Test JIT compilation with length optimization "
3210 "applied to BPF_LD+BPF_IND");
3213 ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3215 static struct bpf_insn insns[] = {
3216 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3217 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3218 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3219 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3220 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3221 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3222 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3223 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3224 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3225 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3226 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3227 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3228 BPF_STMT(BPF_RET+BPF_K, 0),
3233 uint8_t pkt[2][34] = {
3235 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3236 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3237 0x80, 0x03, 0x70, 0x0f,
3238 0x80, 0x03, 0x70, 0x23
3241 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3242 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3243 0x80, 0x03, 0x70, 0x23,
3244 0x80, 0x03, 0x70, 0x0f
3248 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3252 ATF_CHECK(prog_validate(insns, insn_count));
3255 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3257 ATF_REQUIRE(code != NULL);
3259 for (i = 0; i < 2; i++) {
3260 for (j = 1; j < sizeof(pkt[i]); j++)
3261 ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3262 ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3266 rumpns_bpfjit_free_code(code);
3270 ATF_TC(bpfjit_abc_ja);
3271 ATF_TC_HEAD(bpfjit_abc_ja, tc)
3273 atf_tc_set_md_var(tc, "descr",
3274 "Test ABC optimization with a single BPF_JMP+BPF_JA");
3277 ATF_TC_BODY(bpfjit_abc_ja, tc)
3279 static struct bpf_insn insns[] = {
3280 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3281 BPF_STMT(BPF_JMP+BPF_JA, 2),
3282 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3283 BPF_STMT(BPF_RET+BPF_K, 0),
3284 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3285 BPF_STMT(BPF_RET+BPF_A, 0),
3286 BPF_STMT(BPF_RET+BPF_K, 1),
3287 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3288 BPF_STMT(BPF_RET+BPF_K, 2),
3289 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3290 BPF_STMT(BPF_RET+BPF_K, 3),
3294 uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3296 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3300 ATF_CHECK(prog_validate(insns, insn_count));
3303 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3305 ATF_REQUIRE(code != NULL);
3307 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3308 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3309 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3310 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3311 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3312 ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3315 rumpns_bpfjit_free_code(code);
3319 ATF_TC(bpfjit_abc_ja_over);
3320 ATF_TC_HEAD(bpfjit_abc_ja_over, tc)
3322 atf_tc_set_md_var(tc, "descr",
3323 "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
3326 ATF_TC_BODY(bpfjit_abc_ja_over, tc)
3328 static struct bpf_insn insns[] = {
3329 BPF_STMT(BPF_JMP+BPF_JA, 2),
3330 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
3331 BPF_STMT(BPF_RET+BPF_K, 0),
3332 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3333 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
3334 BPF_STMT(BPF_RET+BPF_K, 1),
3335 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
3336 BPF_STMT(BPF_RET+BPF_K, 2),
3337 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3338 BPF_STMT(BPF_RET+BPF_K, 3),
3341 uint8_t pkt[1]; /* the program doesn't read any data */
3343 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3347 ATF_CHECK(prog_validate(insns, insn_count));
3348 ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
3351 ATF_TC(bpfjit_abc_ld_chain);
3352 ATF_TC_HEAD(bpfjit_abc_ld_chain, tc)
3354 atf_tc_set_md_var(tc, "descr",
3355 "Test ABC optimization of a chain of BPF_LD instructions "
3356 "with exits leading to a single BPF_RET");
3359 ATF_TC_BODY(bpfjit_abc_ld_chain, tc)
3361 static struct bpf_insn insns[] = {
3362 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3363 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
3364 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
3365 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
3366 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
3367 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
3368 BPF_STMT(BPF_RET+BPF_K, 123456789),
3369 BPF_STMT(BPF_RET+BPF_K, 987654321),
3373 uint8_t pkt[10] = {};
3375 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3379 ATF_CHECK(prog_validate(insns, insn_count));
3382 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3384 ATF_REQUIRE(code != NULL);
3386 /* Packet is too short. */
3387 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3388 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3389 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3391 /* !(pkt[3] == 8) => return 123456789 */
3392 ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
3393 ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
3394 ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3395 ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
3396 ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
3397 ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3399 /* !(pkt[4:2] >= 7) => too short or return 123456789 */
3401 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3402 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3403 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3404 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3405 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3406 ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3407 ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3409 /* !(pkt[6:4] > 6) => too short or return 987654321 */
3410 pkt[4] = pkt[5] = 1;
3411 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3412 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3413 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3414 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3415 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3416 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3417 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3418 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3419 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3420 ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
3422 /* (pkt[6:4] > 6) => too short or return 123456789 */
3423 pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
3424 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3425 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3426 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3427 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3428 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3429 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3430 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3431 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3432 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3433 ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
3436 rumpns_bpfjit_free_code(code);
3440 ATF_TC(bpfjit_examples_1);
3441 ATF_TC_HEAD(bpfjit_examples_1, tc)
3443 atf_tc_set_md_var(tc, "descr",
3444 "Test the first example from bpf(4) - "
3445 "accept Reverse ARP requests");
3448 ATF_TC_BODY(bpfjit_examples_1, tc)
3451 * The following filter is taken from the Reverse ARP
3452 * Daemon. It accepts only Reverse ARP requests.
3454 struct bpf_insn insns[] = {
3455 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3456 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
3457 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3458 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
3459 BPF_STMT(BPF_RET+BPF_K, 42),
3460 BPF_STMT(BPF_RET+BPF_K, 0),
3464 uint8_t pkt[22] = {};
3466 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3470 ATF_CHECK(prog_validate(insns, insn_count));
3473 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3475 ATF_REQUIRE(code != NULL);
3477 /* Packet is too short. */
3478 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3479 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3480 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3481 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3482 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3483 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3484 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3485 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3486 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3487 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3488 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3489 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3490 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3491 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3492 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3493 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3494 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3495 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3496 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3497 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3498 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3500 /* The packet doesn't match. */
3501 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3503 /* Still no match after setting the protocol field. */
3504 pkt[12] = 0x80; pkt[13] = 0x35;
3505 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3507 /* Set RARP message type. */
3509 ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
3511 /* Packet is too short. */
3512 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3513 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3514 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3515 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3516 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3517 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3518 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3519 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3520 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3521 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3522 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3523 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3524 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3525 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3526 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3527 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3528 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3529 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3530 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3531 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3532 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3534 /* Change RARP message type. */
3536 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3539 rumpns_bpfjit_free_code(code);
3543 ATF_TC(bpfjit_examples_2);
3544 ATF_TC_HEAD(bpfjit_examples_2, tc)
3546 atf_tc_set_md_var(tc, "descr",
3547 "Test the second example from bpf(4) - "
3548 "accept IP packets between two specified hosts");
3551 ATF_TC_BODY(bpfjit_examples_2, tc)
3554 * This filter accepts only IP packets between host 128.3.112.15
3557 static struct bpf_insn insns[] = {
3558 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3559 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
3560 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3561 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3562 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3563 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3564 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3565 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3566 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3567 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3568 BPF_STMT(BPF_RET+BPF_K, 0),
3572 uint8_t pkt[34] = {};
3574 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3578 ATF_CHECK(prog_validate(insns, insn_count));
3581 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3583 ATF_REQUIRE(code != NULL);
3585 /* Packet is too short. */
3586 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3587 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3588 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3589 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3590 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3591 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3592 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3593 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3594 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3595 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3596 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3597 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3598 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3599 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3600 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3601 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3602 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3603 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3604 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3605 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3606 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3607 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3608 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3609 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3610 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3611 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3612 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3613 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3614 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3615 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3616 ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3617 ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3618 ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3620 /* The packet doesn't match. */
3621 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3623 /* Still no match after setting the protocol field. */
3625 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3627 pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
3628 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3630 pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
3631 ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3633 /* Swap the ip addresses. */
3634 pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
3635 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3637 pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
3638 ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
3640 /* Packet is too short. */
3641 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3642 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3643 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3644 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3645 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3646 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3647 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3648 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3649 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3650 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3651 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3652 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3653 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3654 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3655 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3656 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3657 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3658 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3659 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3660 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3661 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3662 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3663 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3664 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3665 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3666 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3667 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3668 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3669 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3670 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3671 ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
3672 ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
3673 ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
3675 /* Change the protocol field. */
3677 ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
3680 rumpns_bpfjit_free_code(code);
3684 ATF_TC(bpfjit_examples_3);
3685 ATF_TC_HEAD(bpfjit_examples_3, tc)
3687 atf_tc_set_md_var(tc, "descr",
3688 "Test the third example from bpf(4) - "
3689 "accept TCP finger packets");
3692 ATF_TC_BODY(bpfjit_examples_3, tc)
3695 * This filter returns only TCP finger packets.
3697 struct bpf_insn insns[] = {
3698 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3699 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
3700 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
3701 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
3702 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
3703 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
3704 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
3705 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
3706 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
3707 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
3708 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
3709 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3710 BPF_STMT(BPF_RET+BPF_K, 0),
3714 uint8_t pkt[30] = {};
3716 /* Set IP fragment offset to non-zero. */
3717 pkt[20] = 1; pkt[21] = 1;
3719 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3723 ATF_CHECK(prog_validate(insns, insn_count));
3726 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3728 ATF_REQUIRE(code != NULL);
3730 /* Packet is too short. */
3731 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3732 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3733 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3734 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3735 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3736 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3737 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3738 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3739 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3740 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3741 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3742 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3743 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3744 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3745 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3746 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3747 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3748 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3749 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3750 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3751 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3752 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3753 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3754 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3755 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3756 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3757 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3758 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3759 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3761 /* The packet doesn't match. */
3762 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3764 /* Still no match after setting the protocol field. */
3766 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3768 /* Get one step closer to the match. */
3770 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3772 /* Set IP fragment offset to zero. */
3773 pkt[20] = 0x20; pkt[21] = 0;
3774 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3776 /* Set IP header length to 12. */
3778 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3780 /* Match one branch of the program. */
3782 ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3784 /* Match the other branch of the program. */
3785 pkt[29] = 79; pkt[27] = 0;
3786 ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
3788 /* Packet is too short. */
3789 ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3790 ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3791 ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3792 ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3793 ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3794 ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3795 ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3796 ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3797 ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3798 ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
3799 ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
3800 ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
3801 ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
3802 ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
3803 ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
3804 ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
3805 ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
3806 ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
3807 ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
3808 ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
3809 ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
3810 ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
3811 ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
3812 ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
3813 ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
3814 ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
3815 ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
3816 ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
3817 ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
3819 /* Set IP header length to 16. Packet is too short. */
3821 ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
3824 rumpns_bpfjit_free_code(code);
3828 ATF_TC(bpfjit_cop_no_ctx);
3829 ATF_TC_HEAD(bpfjit_cop_no_ctx, tc)
3831 atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
3832 "instruction can't be accepted without a context");
3835 ATF_TC_BODY(bpfjit_cop_no_ctx, tc)
3837 static struct bpf_insn insns[] = {
3838 BPF_STMT(BPF_MISC+BPF_COP, 0),
3839 BPF_STMT(BPF_RET+BPF_K, 7)
3843 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3847 ATF_CHECK(!prog_validate(insns, insn_count));
3850 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3852 ATF_CHECK(code == NULL);
3855 ATF_TC(bpfjit_copx_no_ctx);
3856 ATF_TC_HEAD(bpfjit_copx_no_ctx, tc)
3858 atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
3859 "instruction can't be accepted without a context");
3862 ATF_TC_BODY(bpfjit_copx_no_ctx, tc)
3864 static struct bpf_insn insns[] = {
3865 BPF_STMT(BPF_MISC+BPF_COPX, 0),
3866 BPF_STMT(BPF_RET+BPF_K, 7)
3870 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3874 ATF_CHECK(!prog_validate(insns, insn_count));
3877 code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3879 ATF_CHECK(code == NULL);
3886 * For every new test please also add a similar test
3887 * to ../../lib/libbpfjit/t_bpfjit.c
3889 ATF_TP_ADD_TC(tp, bpfjit_empty);
3890 ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
3891 ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
3892 ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
3893 ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
3894 ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
3895 ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
3896 ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
3897 ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
3898 ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
3899 ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
3900 ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
3901 ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
3902 ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
3903 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
3904 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
3905 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
3906 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
3907 ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
3908 ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
3909 ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
3910 ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
3911 ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
3912 ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
3913 ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
3914 ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
3915 ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
3916 ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
3917 ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
3918 ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
3919 ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
3920 ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
3921 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
3922 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
3923 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
3924 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
3925 ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
3926 ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
3927 ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
3928 ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
3929 ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
3930 ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
3931 ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
3932 ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
3933 ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
3934 ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
3935 ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
3936 ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
3937 ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
3938 ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
3939 ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
3940 ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
3941 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
3942 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
3943 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
3944 ATF_TP_ADD_TC(tp, bpfjit_ld_len);
3945 ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
3946 ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
3947 ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
3948 ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
3949 ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
3950 ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
3951 ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
3952 ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
3953 ATF_TP_ADD_TC(tp, bpfjit_st1);
3954 ATF_TP_ADD_TC(tp, bpfjit_st2);
3955 ATF_TP_ADD_TC(tp, bpfjit_st3);
3956 ATF_TP_ADD_TC(tp, bpfjit_st4);
3957 ATF_TP_ADD_TC(tp, bpfjit_st5);
3958 ATF_TP_ADD_TC(tp, bpfjit_stx1);
3959 ATF_TP_ADD_TC(tp, bpfjit_stx2);
3960 ATF_TP_ADD_TC(tp, bpfjit_stx3);
3961 ATF_TP_ADD_TC(tp, bpfjit_stx4);
3962 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
3963 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
3964 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
3965 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
3966 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
3967 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
3968 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
3969 ATF_TP_ADD_TC(tp, bpfjit_abc_ja);
3970 ATF_TP_ADD_TC(tp, bpfjit_abc_ja_over);
3971 ATF_TP_ADD_TC(tp, bpfjit_abc_ld_chain);
3972 ATF_TP_ADD_TC(tp, bpfjit_examples_1);
3973 ATF_TP_ADD_TC(tp, bpfjit_examples_2);
3974 ATF_TP_ADD_TC(tp, bpfjit_examples_3);
3975 ATF_TP_ADD_TC(tp, bpfjit_cop_no_ctx);
3976 ATF_TP_ADD_TC(tp, bpfjit_copx_no_ctx);
3978 return atf_no_error();