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