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