t_bpfjit.c revision 1.1 1 /* $NetBSD: t_bpfjit.c,v 1.1 2012/11/11 17:37:34 alnsn Exp $ */
2
3 /*-
4 * Copyright (c) 2011-2012 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.1 2012/11/11 17:37:34 alnsn Exp $");
34
35 #include <net/bpfjit.h>
36
37 #include <atf-c.h>
38 #include <stdint.h>
39 #include <string.h>
40
41 static uint8_t deadbeef_at_5[16] = {
42 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
43 };
44
45 ATF_TC(bpfjit_empty);
46 ATF_TC_HEAD(bpfjit_empty, tc)
47 {
48 atf_tc_set_md_var(tc, "descr",
49 "Test that JIT compilation for an empty bpf program fails");
50 }
51
52 ATF_TC_BODY(bpfjit_empty, tc)
53 {
54 struct bpf_insn dummy;
55
56 ATF_CHECK(bpfjit_generate_code(&dummy, 0) == NULL);
57 }
58
59 ATF_TC(bpfjit_alu_add_k);
60 ATF_TC_HEAD(bpfjit_alu_add_k, tc)
61 {
62 atf_tc_set_md_var(tc, "descr",
63 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
64 }
65
66 ATF_TC_BODY(bpfjit_alu_add_k, tc)
67 {
68 static struct bpf_insn insns[] = {
69 BPF_STMT(BPF_LD+BPF_IMM, 3),
70 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
71 BPF_STMT(BPF_RET+BPF_A, 0)
72 };
73
74 bpfjit_function_t code;
75 uint8_t pkt[1]; /* the program doesn't read any data */
76
77 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
78
79 ATF_CHECK(bpf_validate(insns, insn_count));
80
81 code = bpfjit_generate_code(insns, insn_count);
82 ATF_REQUIRE(code != NULL);
83
84 ATF_CHECK(code(pkt, 1, 1) == 5);
85
86 bpfjit_free_code(code);
87 }
88
89 ATF_TC(bpfjit_alu_sub_k);
90 ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
91 {
92 atf_tc_set_md_var(tc, "descr",
93 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
94 }
95
96 ATF_TC_BODY(bpfjit_alu_sub_k, tc)
97 {
98 static struct bpf_insn insns[] = {
99 BPF_STMT(BPF_LD+BPF_IMM, 1),
100 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
101 BPF_STMT(BPF_RET+BPF_A, 0)
102 };
103
104 bpfjit_function_t code;
105 uint8_t pkt[1]; /* the program doesn't read any data */
106
107 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
108
109 ATF_CHECK(bpf_validate(insns, insn_count));
110
111 code = bpfjit_generate_code(insns, insn_count);
112 ATF_REQUIRE(code != NULL);
113
114 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
115
116 bpfjit_free_code(code);
117 }
118
119 ATF_TC(bpfjit_alu_mul_k);
120 ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
121 {
122 atf_tc_set_md_var(tc, "descr",
123 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
124 }
125
126 ATF_TC_BODY(bpfjit_alu_mul_k, tc)
127 {
128 static struct bpf_insn insns[] = {
129 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
130 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
131 BPF_STMT(BPF_RET+BPF_A, 0)
132 };
133
134 bpfjit_function_t code;
135 uint8_t pkt[1]; /* the program doesn't read any data */
136
137 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
138
139 ATF_CHECK(bpf_validate(insns, insn_count));
140
141 code = bpfjit_generate_code(insns, insn_count);
142 ATF_REQUIRE(code != NULL);
143
144 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
145
146 bpfjit_free_code(code);
147 }
148
149 ATF_TC(bpfjit_alu_div0_k);
150 ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
151 {
152 atf_tc_set_md_var(tc, "descr",
153 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
154 }
155
156 ATF_TC_BODY(bpfjit_alu_div0_k, tc)
157 {
158 static struct bpf_insn insns[] = {
159 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
160 BPF_STMT(BPF_RET+BPF_A, 0)
161 };
162
163 bpfjit_function_t code;
164 uint8_t pkt[1]; /* the program doesn't read any data */
165
166 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
167
168 //ATF_CHECK(bpf_validate(insns, insn_count));
169
170 code = bpfjit_generate_code(insns, insn_count);
171 ATF_REQUIRE(code != NULL);
172
173 ATF_CHECK(code(pkt, 1, 1) == 0);
174
175 bpfjit_free_code(code);
176 }
177
178 ATF_TC(bpfjit_alu_div1_k);
179 ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
180 {
181 atf_tc_set_md_var(tc, "descr",
182 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
183 }
184
185 ATF_TC_BODY(bpfjit_alu_div1_k, tc)
186 {
187 static struct bpf_insn insns[] = {
188 BPF_STMT(BPF_LD+BPF_IMM, 7),
189 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
190 BPF_STMT(BPF_RET+BPF_A, 0)
191 };
192
193 bpfjit_function_t code;
194 uint8_t pkt[1]; /* the program doesn't read any data */
195
196 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
197
198 ATF_CHECK(bpf_validate(insns, insn_count));
199
200 code = bpfjit_generate_code(insns, insn_count);
201 ATF_REQUIRE(code != NULL);
202
203 ATF_CHECK(code(pkt, 1, 1) == 7);
204
205 bpfjit_free_code(code);
206 }
207
208 ATF_TC(bpfjit_alu_div2_k);
209 ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
210 {
211 atf_tc_set_md_var(tc, "descr",
212 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
213 }
214
215 ATF_TC_BODY(bpfjit_alu_div2_k, tc)
216 {
217 static struct bpf_insn insns[] = {
218 BPF_STMT(BPF_LD+BPF_IMM, 7),
219 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
220 BPF_STMT(BPF_RET+BPF_A, 0)
221 };
222
223 bpfjit_function_t code;
224 uint8_t pkt[1]; /* the program doesn't read any data */
225
226 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
227
228 ATF_CHECK(bpf_validate(insns, insn_count));
229
230 code = bpfjit_generate_code(insns, insn_count);
231 ATF_REQUIRE(code != NULL);
232
233 ATF_CHECK(code(pkt, 1, 1) == 3);
234
235 bpfjit_free_code(code);
236 }
237
238 ATF_TC(bpfjit_alu_div4_k);
239 ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
240 {
241 atf_tc_set_md_var(tc, "descr",
242 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
243 }
244
245 ATF_TC_BODY(bpfjit_alu_div4_k, tc)
246 {
247 static struct bpf_insn insns[] = {
248 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
249 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
250 BPF_STMT(BPF_RET+BPF_A, 0)
251 };
252
253 bpfjit_function_t code;
254 uint8_t pkt[1]; /* the program doesn't read any data */
255
256 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
257
258 ATF_CHECK(bpf_validate(insns, insn_count));
259
260 code = bpfjit_generate_code(insns, insn_count);
261 ATF_REQUIRE(code != NULL);
262
263 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
264
265 bpfjit_free_code(code);
266 }
267
268 ATF_TC(bpfjit_alu_div10_k);
269 ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
270 {
271 atf_tc_set_md_var(tc, "descr",
272 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
273 }
274
275 ATF_TC_BODY(bpfjit_alu_div10_k, tc)
276 {
277 static struct bpf_insn insns[] = {
278 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
279 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
280 BPF_STMT(BPF_RET+BPF_A, 0)
281 };
282
283 bpfjit_function_t code;
284 uint8_t pkt[1]; /* the program doesn't read any data */
285
286 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
287
288 ATF_CHECK(bpf_validate(insns, insn_count));
289
290 code = bpfjit_generate_code(insns, insn_count);
291 ATF_REQUIRE(code != NULL);
292
293 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
294
295 bpfjit_free_code(code);
296 }
297
298 ATF_TC(bpfjit_alu_div10000_k);
299 ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
300 {
301 atf_tc_set_md_var(tc, "descr",
302 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
303 }
304
305 ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
306 {
307 static struct bpf_insn insns[] = {
308 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
309 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
310 BPF_STMT(BPF_RET+BPF_A, 0)
311 };
312
313 bpfjit_function_t code;
314 uint8_t pkt[1]; /* the program doesn't read any data */
315
316 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
317
318 ATF_CHECK(bpf_validate(insns, insn_count));
319
320 code = bpfjit_generate_code(insns, insn_count);
321 ATF_REQUIRE(code != NULL);
322
323 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
324
325 bpfjit_free_code(code);
326 }
327
328 ATF_TC(bpfjit_alu_div7609801_k);
329 ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
330 {
331 atf_tc_set_md_var(tc, "descr",
332 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
333 }
334
335 ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
336 {
337 static struct bpf_insn insns[] = {
338 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
339 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
340 BPF_STMT(BPF_RET+BPF_A, 0)
341 };
342
343 bpfjit_function_t code;
344 uint8_t pkt[1]; /* the program doesn't read any data */
345
346 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
347
348 ATF_CHECK(bpf_validate(insns, insn_count));
349
350 code = bpfjit_generate_code(insns, insn_count);
351 ATF_REQUIRE(code != NULL);
352
353 ATF_CHECK(code(pkt, 1, 1) == 564);
354
355 bpfjit_free_code(code);
356 }
357
358 ATF_TC(bpfjit_alu_div80000000_k);
359 ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
360 {
361 atf_tc_set_md_var(tc, "descr",
362 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
363 }
364
365 ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
366 {
367 static struct bpf_insn insns[] = {
368 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
369 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
370 BPF_STMT(BPF_RET+BPF_A, 0)
371 };
372
373 bpfjit_function_t code;
374 uint8_t pkt[1]; /* the program doesn't read any data */
375
376 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
377
378 ATF_CHECK(bpf_validate(insns, insn_count));
379
380 code = bpfjit_generate_code(insns, insn_count);
381 ATF_REQUIRE(code != NULL);
382
383 ATF_CHECK(code(pkt, 1, 1) == 1);
384
385 bpfjit_free_code(code);
386 }
387
388 ATF_TC(bpfjit_alu_and_k);
389 ATF_TC_HEAD(bpfjit_alu_and_k, tc)
390 {
391 atf_tc_set_md_var(tc, "descr",
392 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
393 }
394
395 ATF_TC_BODY(bpfjit_alu_and_k, tc)
396 {
397 static struct bpf_insn insns[] = {
398 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
399 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
400 BPF_STMT(BPF_RET+BPF_A, 0)
401 };
402
403 bpfjit_function_t code;
404 uint8_t pkt[1]; /* the program doesn't read any data */
405
406 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
407
408 ATF_CHECK(bpf_validate(insns, insn_count));
409
410 code = bpfjit_generate_code(insns, insn_count);
411 ATF_REQUIRE(code != NULL);
412
413 ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
414
415 bpfjit_free_code(code);
416 }
417
418 ATF_TC(bpfjit_alu_or_k);
419 ATF_TC_HEAD(bpfjit_alu_or_k, tc)
420 {
421 atf_tc_set_md_var(tc, "descr",
422 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
423 }
424
425 ATF_TC_BODY(bpfjit_alu_or_k, tc)
426 {
427 static struct bpf_insn insns[] = {
428 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
429 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
430 BPF_STMT(BPF_RET+BPF_A, 0)
431 };
432
433 bpfjit_function_t code;
434 uint8_t pkt[1]; /* the program doesn't read any data */
435
436 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
437
438 ATF_CHECK(bpf_validate(insns, insn_count));
439
440 code = bpfjit_generate_code(insns, insn_count);
441 ATF_REQUIRE(code != NULL);
442
443 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
444
445 bpfjit_free_code(code);
446 }
447
448 ATF_TC(bpfjit_alu_lsh_k);
449 ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
450 {
451 atf_tc_set_md_var(tc, "descr",
452 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
453 }
454
455 ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
456 {
457 static struct bpf_insn insns[] = {
458 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
459 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
460 BPF_STMT(BPF_RET+BPF_A, 0)
461 };
462
463 bpfjit_function_t code;
464 uint8_t pkt[1]; /* the program doesn't read any data */
465
466 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
467
468 ATF_CHECK(bpf_validate(insns, insn_count));
469
470 code = bpfjit_generate_code(insns, insn_count);
471 ATF_REQUIRE(code != NULL);
472
473 ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
474
475 bpfjit_free_code(code);
476 }
477
478 ATF_TC(bpfjit_alu_lsh0_k);
479 ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
480 {
481 atf_tc_set_md_var(tc, "descr",
482 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
483 }
484
485 ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
486 {
487 static struct bpf_insn insns[] = {
488 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
489 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
490 BPF_STMT(BPF_RET+BPF_A, 0)
491 };
492
493 bpfjit_function_t code;
494 uint8_t pkt[1]; /* the program doesn't read any data */
495
496 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
497
498 ATF_CHECK(bpf_validate(insns, insn_count));
499
500 code = bpfjit_generate_code(insns, insn_count);
501 ATF_REQUIRE(code != NULL);
502
503 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
504
505 bpfjit_free_code(code);
506 }
507
508 ATF_TC(bpfjit_alu_rsh_k);
509 ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
510 {
511 atf_tc_set_md_var(tc, "descr",
512 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
513 }
514
515 ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
516 {
517 static struct bpf_insn insns[] = {
518 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
519 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
520 BPF_STMT(BPF_RET+BPF_A, 0)
521 };
522
523 bpfjit_function_t code;
524 uint8_t pkt[1]; /* the program doesn't read any data */
525
526 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
527
528 ATF_CHECK(bpf_validate(insns, insn_count));
529
530 code = bpfjit_generate_code(insns, insn_count);
531 ATF_REQUIRE(code != NULL);
532
533 ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
534
535 bpfjit_free_code(code);
536 }
537
538 ATF_TC(bpfjit_alu_rsh0_k);
539 ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
540 {
541 atf_tc_set_md_var(tc, "descr",
542 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
543 }
544
545 ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
546 {
547 static struct bpf_insn insns[] = {
548 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
549 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
550 BPF_STMT(BPF_RET+BPF_A, 0)
551 };
552
553 bpfjit_function_t code;
554 uint8_t pkt[1]; /* the program doesn't read any data */
555
556 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
557
558 ATF_CHECK(bpf_validate(insns, insn_count));
559
560 code = bpfjit_generate_code(insns, insn_count);
561 ATF_REQUIRE(code != NULL);
562
563 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
564
565 bpfjit_free_code(code);
566 }
567
568 ATF_TC(bpfjit_alu_modulo_k);
569 ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
570 {
571 atf_tc_set_md_var(tc, "descr",
572 "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
573 }
574
575 ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
576 {
577 static struct bpf_insn insns[] = {
578 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
579
580 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
581 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
582
583 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
584 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
585
586 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
587 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
588
589 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
590 BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
591
592 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
593 BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
594
595 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
596 BPF_STMT(BPF_ALU+BPF_NEG, 0),
597
598 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
599 BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
600
601 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
602 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
603 BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
604
605 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
606 BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
607
608 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
609 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
610 BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
611
612 BPF_STMT(BPF_RET+BPF_A, 0)
613 };
614
615 bpfjit_function_t code;
616 uint8_t pkt[1]; /* the program doesn't read any data */
617
618 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
619
620 ATF_CHECK(bpf_validate(insns, insn_count));
621
622 code = bpfjit_generate_code(insns, insn_count);
623 ATF_REQUIRE(code != NULL);
624
625 ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
626 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
627
628
629 bpfjit_free_code(code);
630 }
631
632 ATF_TC(bpfjit_alu_add_x);
633 ATF_TC_HEAD(bpfjit_alu_add_x, tc)
634 {
635 atf_tc_set_md_var(tc, "descr",
636 "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
637 }
638
639 ATF_TC_BODY(bpfjit_alu_add_x, tc)
640 {
641 static struct bpf_insn insns[] = {
642 BPF_STMT(BPF_LD+BPF_IMM, 3),
643 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
644 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
645 BPF_STMT(BPF_RET+BPF_A, 0)
646 };
647
648 bpfjit_function_t code;
649 uint8_t pkt[1]; /* the program doesn't read any data */
650
651 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
652
653 ATF_CHECK(bpf_validate(insns, insn_count));
654
655 code = bpfjit_generate_code(insns, insn_count);
656 ATF_REQUIRE(code != NULL);
657
658 ATF_CHECK(code(pkt, 1, 1) == 5);
659
660 bpfjit_free_code(code);
661 }
662
663 ATF_TC(bpfjit_alu_sub_x);
664 ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
665 {
666 atf_tc_set_md_var(tc, "descr",
667 "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
668 }
669
670 ATF_TC_BODY(bpfjit_alu_sub_x, tc)
671 {
672 static struct bpf_insn insns[] = {
673 BPF_STMT(BPF_LD+BPF_IMM, 1),
674 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
675 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
676 BPF_STMT(BPF_RET+BPF_A, 0)
677 };
678
679 bpfjit_function_t code;
680 uint8_t pkt[1]; /* the program doesn't read any data */
681
682 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
683
684 ATF_CHECK(bpf_validate(insns, insn_count));
685
686 code = bpfjit_generate_code(insns, insn_count);
687 ATF_REQUIRE(code != NULL);
688
689 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
690
691 bpfjit_free_code(code);
692 }
693
694 ATF_TC(bpfjit_alu_mul_x);
695 ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
696 {
697 atf_tc_set_md_var(tc, "descr",
698 "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
699 }
700
701 ATF_TC_BODY(bpfjit_alu_mul_x, tc)
702 {
703 static struct bpf_insn insns[] = {
704 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
705 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
706 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
707 BPF_STMT(BPF_RET+BPF_A, 0)
708 };
709
710 bpfjit_function_t code;
711 uint8_t pkt[1]; /* the program doesn't read any data */
712
713 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
714
715 ATF_CHECK(bpf_validate(insns, insn_count));
716
717 code = bpfjit_generate_code(insns, insn_count);
718 ATF_REQUIRE(code != NULL);
719
720 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
721
722 bpfjit_free_code(code);
723 }
724
725 ATF_TC(bpfjit_alu_div0_x);
726 ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
727 {
728 atf_tc_set_md_var(tc, "descr",
729 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
730 }
731
732 ATF_TC_BODY(bpfjit_alu_div0_x, tc)
733 {
734 static struct bpf_insn insns[] = {
735 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
736 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
737 BPF_STMT(BPF_RET+BPF_A, 0)
738 };
739
740 bpfjit_function_t code;
741 uint8_t pkt[1]; /* the program doesn't read any data */
742
743 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
744
745 ATF_CHECK(bpf_validate(insns, insn_count));
746
747 code = bpfjit_generate_code(insns, insn_count);
748 ATF_REQUIRE(code != NULL);
749
750 ATF_CHECK(code(pkt, 1, 1) == 0);
751
752 bpfjit_free_code(code);
753 }
754
755 ATF_TC(bpfjit_alu_div1_x);
756 ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
757 {
758 atf_tc_set_md_var(tc, "descr",
759 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
760 }
761
762 ATF_TC_BODY(bpfjit_alu_div1_x, tc)
763 {
764 static struct bpf_insn insns[] = {
765 BPF_STMT(BPF_LD+BPF_IMM, 7),
766 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
767 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
768 BPF_STMT(BPF_RET+BPF_A, 0)
769 };
770
771 bpfjit_function_t code;
772 uint8_t pkt[1]; /* the program doesn't read any data */
773
774 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
775
776 ATF_CHECK(bpf_validate(insns, insn_count));
777
778 code = bpfjit_generate_code(insns, insn_count);
779 ATF_REQUIRE(code != NULL);
780
781 ATF_CHECK(code(pkt, 1, 1) == 7);
782
783 bpfjit_free_code(code);
784 }
785
786 ATF_TC(bpfjit_alu_div2_x);
787 ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
788 {
789 atf_tc_set_md_var(tc, "descr",
790 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
791 }
792
793 ATF_TC_BODY(bpfjit_alu_div2_x, tc)
794 {
795 static struct bpf_insn insns[] = {
796 BPF_STMT(BPF_LD+BPF_IMM, 7),
797 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
798 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
799 BPF_STMT(BPF_RET+BPF_A, 0)
800 };
801
802 bpfjit_function_t code;
803 uint8_t pkt[1]; /* the program doesn't read any data */
804
805 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
806
807 ATF_CHECK(bpf_validate(insns, insn_count));
808
809 code = bpfjit_generate_code(insns, insn_count);
810 ATF_REQUIRE(code != NULL);
811
812 ATF_CHECK(code(pkt, 1, 1) == 3);
813
814 bpfjit_free_code(code);
815 }
816
817 ATF_TC(bpfjit_alu_div4_x);
818 ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
819 {
820 atf_tc_set_md_var(tc, "descr",
821 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
822 }
823
824 ATF_TC_BODY(bpfjit_alu_div4_x, tc)
825 {
826 static struct bpf_insn insns[] = {
827 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
828 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
829 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
830 BPF_STMT(BPF_RET+BPF_A, 0)
831 };
832
833 bpfjit_function_t code;
834 uint8_t pkt[1]; /* the program doesn't read any data */
835
836 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
837
838 ATF_CHECK(bpf_validate(insns, insn_count));
839
840 code = bpfjit_generate_code(insns, insn_count);
841 ATF_REQUIRE(code != NULL);
842
843 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
844
845 bpfjit_free_code(code);
846 }
847
848 ATF_TC(bpfjit_alu_div10_x);
849 ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
850 {
851 atf_tc_set_md_var(tc, "descr",
852 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
853 }
854
855 ATF_TC_BODY(bpfjit_alu_div10_x, tc)
856 {
857 static struct bpf_insn insns[] = {
858 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
859 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
860 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
861 BPF_STMT(BPF_RET+BPF_A, 0)
862 };
863
864 bpfjit_function_t code;
865 uint8_t pkt[1]; /* the program doesn't read any data */
866
867 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
868
869 ATF_CHECK(bpf_validate(insns, insn_count));
870
871 code = bpfjit_generate_code(insns, insn_count);
872 ATF_REQUIRE(code != NULL);
873
874 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
875
876 bpfjit_free_code(code);
877 }
878
879 ATF_TC(bpfjit_alu_div10000_x);
880 ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
881 {
882 atf_tc_set_md_var(tc, "descr",
883 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
884 }
885
886 ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
887 {
888 static struct bpf_insn insns[] = {
889 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
890 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
891 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
892 BPF_STMT(BPF_RET+BPF_A, 0)
893 };
894
895 bpfjit_function_t code;
896 uint8_t pkt[1]; /* the program doesn't read any data */
897
898 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
899
900 ATF_CHECK(bpf_validate(insns, insn_count));
901
902 code = bpfjit_generate_code(insns, insn_count);
903 ATF_REQUIRE(code != NULL);
904
905 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
906
907 bpfjit_free_code(code);
908 }
909
910 ATF_TC(bpfjit_alu_div7609801_x);
911 ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
912 {
913 atf_tc_set_md_var(tc, "descr",
914 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
915 }
916
917 ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
918 {
919 static struct bpf_insn insns[] = {
920 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
921 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
922 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
923 BPF_STMT(BPF_RET+BPF_A, 0)
924 };
925
926 bpfjit_function_t code;
927 uint8_t pkt[1]; /* the program doesn't read any data */
928
929 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
930
931 ATF_CHECK(bpf_validate(insns, insn_count));
932
933 code = bpfjit_generate_code(insns, insn_count);
934 ATF_REQUIRE(code != NULL);
935
936 ATF_CHECK(code(pkt, 1, 1) == 564);
937
938 bpfjit_free_code(code);
939 }
940
941 ATF_TC(bpfjit_alu_div80000000_x);
942 ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
943 {
944 atf_tc_set_md_var(tc, "descr",
945 "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
946 }
947
948 ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
949 {
950 static struct bpf_insn insns[] = {
951 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
952 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
953 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
954 BPF_STMT(BPF_RET+BPF_A, 0)
955 };
956
957 bpfjit_function_t code;
958 uint8_t pkt[1]; /* the program doesn't read any data */
959
960 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
961
962 ATF_CHECK(bpf_validate(insns, insn_count));
963
964 code = bpfjit_generate_code(insns, insn_count);
965 ATF_REQUIRE(code != NULL);
966
967 ATF_CHECK(code(pkt, 1, 1) == 1);
968
969 bpfjit_free_code(code);
970 }
971
972 ATF_TC(bpfjit_alu_and_x);
973 ATF_TC_HEAD(bpfjit_alu_and_x, tc)
974 {
975 atf_tc_set_md_var(tc, "descr",
976 "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
977 }
978
979 ATF_TC_BODY(bpfjit_alu_and_x, tc)
980 {
981 static struct bpf_insn insns[] = {
982 BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
983 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
984 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
985 BPF_STMT(BPF_RET+BPF_A, 0)
986 };
987
988 bpfjit_function_t code;
989 uint8_t pkt[1]; /* the program doesn't read any data */
990
991 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
992
993 ATF_CHECK(bpf_validate(insns, insn_count));
994
995 code = bpfjit_generate_code(insns, insn_count);
996 ATF_REQUIRE(code != NULL);
997
998 ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
999
1000 bpfjit_free_code(code);
1001 }
1002
1003 ATF_TC(bpfjit_alu_or_x);
1004 ATF_TC_HEAD(bpfjit_alu_or_x, tc)
1005 {
1006 atf_tc_set_md_var(tc, "descr",
1007 "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1008 }
1009
1010 ATF_TC_BODY(bpfjit_alu_or_x, tc)
1011 {
1012 static struct bpf_insn insns[] = {
1013 BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1014 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1015 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1016 BPF_STMT(BPF_RET+BPF_A, 0)
1017 };
1018
1019 bpfjit_function_t code;
1020 uint8_t pkt[1]; /* the program doesn't read any data */
1021
1022 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1023
1024 ATF_CHECK(bpf_validate(insns, insn_count));
1025
1026 code = bpfjit_generate_code(insns, insn_count);
1027 ATF_REQUIRE(code != NULL);
1028
1029 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1030
1031 bpfjit_free_code(code);
1032 }
1033
1034 ATF_TC(bpfjit_alu_lsh_x);
1035 ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
1036 {
1037 atf_tc_set_md_var(tc, "descr",
1038 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1039 }
1040
1041 ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
1042 {
1043 static struct bpf_insn insns[] = {
1044 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1045 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1046 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1047 BPF_STMT(BPF_RET+BPF_A, 0)
1048 };
1049
1050 bpfjit_function_t code;
1051 uint8_t pkt[1]; /* the program doesn't read any data */
1052
1053 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1054
1055 ATF_CHECK(bpf_validate(insns, insn_count));
1056
1057 code = bpfjit_generate_code(insns, insn_count);
1058 ATF_REQUIRE(code != NULL);
1059
1060 ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
1061
1062 bpfjit_free_code(code);
1063 }
1064
1065 ATF_TC(bpfjit_alu_lsh0_x);
1066 ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
1067 {
1068 atf_tc_set_md_var(tc, "descr",
1069 "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1070 }
1071
1072 ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
1073 {
1074 static struct bpf_insn insns[] = {
1075 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1076 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1077 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1078 BPF_STMT(BPF_RET+BPF_A, 0)
1079 };
1080
1081 bpfjit_function_t code;
1082 uint8_t pkt[1]; /* the program doesn't read any data */
1083
1084 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1085
1086 ATF_CHECK(bpf_validate(insns, insn_count));
1087
1088 code = bpfjit_generate_code(insns, insn_count);
1089 ATF_REQUIRE(code != NULL);
1090
1091 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1092
1093 bpfjit_free_code(code);
1094 }
1095
1096 ATF_TC(bpfjit_alu_rsh_x);
1097 ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
1098 {
1099 atf_tc_set_md_var(tc, "descr",
1100 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1101 }
1102
1103 ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
1104 {
1105 static struct bpf_insn insns[] = {
1106 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1107 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1108 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1109 BPF_STMT(BPF_RET+BPF_A, 0)
1110 };
1111
1112 bpfjit_function_t code;
1113 uint8_t pkt[1]; /* the program doesn't read any data */
1114
1115 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1116
1117 ATF_CHECK(bpf_validate(insns, insn_count));
1118
1119 code = bpfjit_generate_code(insns, insn_count);
1120 ATF_REQUIRE(code != NULL);
1121
1122 ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
1123
1124 bpfjit_free_code(code);
1125 }
1126
1127 ATF_TC(bpfjit_alu_rsh0_x);
1128 ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
1129 {
1130 atf_tc_set_md_var(tc, "descr",
1131 "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1132 }
1133
1134 ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
1135 {
1136 static struct bpf_insn insns[] = {
1137 BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1138 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1139 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1140 BPF_STMT(BPF_RET+BPF_A, 0)
1141 };
1142
1143 bpfjit_function_t code;
1144 uint8_t pkt[1]; /* the program doesn't read any data */
1145
1146 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1147
1148 ATF_CHECK(bpf_validate(insns, insn_count));
1149
1150 code = bpfjit_generate_code(insns, insn_count);
1151 ATF_REQUIRE(code != NULL);
1152
1153 ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1154
1155 bpfjit_free_code(code);
1156 }
1157
1158 ATF_TC(bpfjit_alu_modulo_x);
1159 ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
1160 {
1161 atf_tc_set_md_var(tc, "descr",
1162 "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1163 }
1164
1165 ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
1166 {
1167 static struct bpf_insn insns[] = {
1168 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1169
1170 /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1171 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1172 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1173
1174 /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1175 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1176 BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1177
1178 /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1179 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1180 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1181
1182 /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1183 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1184 BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1185
1186 /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1187 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1188 BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1189
1190 /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1191 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1192
1193 /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1194 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1195 BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1196
1197 /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1198 /* 00000000,42218C74 >> 3 = 00000000,08443180 */
1199 BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1200 BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1201
1202 /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1203 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1204 BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1205
1206 /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1207 /* 00000000,93818280 / DEAD = 00000000,0000A994 */
1208 BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1209 BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1210
1211 BPF_STMT(BPF_RET+BPF_A, 0)
1212 };
1213
1214 bpfjit_function_t code;
1215 uint8_t pkt[1]; /* the program doesn't read any data */
1216
1217 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1218
1219 ATF_CHECK(bpf_validate(insns, insn_count));
1220
1221 code = bpfjit_generate_code(insns, insn_count);
1222 ATF_REQUIRE(code != NULL);
1223
1224 ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1225 ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
1226
1227
1228 bpfjit_free_code(code);
1229 }
1230
1231 ATF_TC(bpfjit_alu_neg);
1232 ATF_TC_HEAD(bpfjit_alu_neg, tc)
1233 {
1234 atf_tc_set_md_var(tc, "descr",
1235 "Test JIT compilation of BPF_ALU+BPF_NEG");
1236 }
1237
1238 ATF_TC_BODY(bpfjit_alu_neg, tc)
1239 {
1240 static struct bpf_insn insns[] = {
1241 BPF_STMT(BPF_LD+BPF_IMM, 777),
1242 BPF_STMT(BPF_ALU+BPF_NEG, 0),
1243 BPF_STMT(BPF_RET+BPF_A, 0)
1244 };
1245
1246 bpfjit_function_t code;
1247 uint8_t pkt[1]; /* the program doesn't read any data */
1248
1249 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1250
1251 ATF_CHECK(bpf_validate(insns, insn_count));
1252
1253 code = bpfjit_generate_code(insns, insn_count);
1254 ATF_REQUIRE(code != NULL);
1255
1256 ATF_CHECK(code(pkt, 1, 1) == 0u-777u);
1257
1258 bpfjit_free_code(code);
1259 }
1260
1261 ATF_TC(bpfjit_jmp_ja);
1262 ATF_TC_HEAD(bpfjit_jmp_ja, tc)
1263 {
1264 atf_tc_set_md_var(tc, "descr",
1265 "Test JIT compilation of BPF_JMP+BPF_JA");
1266 }
1267
1268 ATF_TC_BODY(bpfjit_jmp_ja, tc)
1269 {
1270 static struct bpf_insn insns[] = {
1271 BPF_STMT(BPF_JMP+BPF_JA, 1),
1272 BPF_STMT(BPF_RET+BPF_K, 0),
1273 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1274 BPF_STMT(BPF_RET+BPF_K, 1),
1275 BPF_STMT(BPF_RET+BPF_K, 2),
1276 BPF_STMT(BPF_RET+BPF_K, 3),
1277 };
1278
1279 bpfjit_function_t code;
1280 uint8_t pkt[1]; /* the program doesn't read any data */
1281
1282 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1283
1284 ATF_CHECK(bpf_validate(insns, insn_count));
1285
1286 code = bpfjit_generate_code(insns, insn_count);
1287 ATF_REQUIRE(code != NULL);
1288
1289 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1290
1291 bpfjit_free_code(code);
1292 }
1293
1294 ATF_TC(bpfjit_jmp_jgt_k);
1295 ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
1296 {
1297 atf_tc_set_md_var(tc, "descr",
1298 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1299 }
1300
1301 ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
1302 {
1303 static struct bpf_insn insns[] = {
1304 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1305 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1306 BPF_STMT(BPF_RET+BPF_K, 0),
1307 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1308 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1309 BPF_STMT(BPF_RET+BPF_K, 1),
1310 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1311 BPF_STMT(BPF_RET+BPF_K, 2),
1312 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1313 BPF_STMT(BPF_RET+BPF_K, 3),
1314 BPF_STMT(BPF_RET+BPF_K, 4),
1315 BPF_STMT(BPF_RET+BPF_K, 5),
1316 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1317 BPF_STMT(BPF_RET+BPF_K, 6),
1318 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1319 BPF_STMT(BPF_RET+BPF_K, 7),
1320 BPF_STMT(BPF_RET+BPF_K, 8)
1321 };
1322
1323 bpfjit_function_t code;
1324 uint8_t pkt[8]; /* the program doesn't read any data */
1325
1326 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1327
1328 ATF_CHECK(bpf_validate(insns, insn_count));
1329
1330 code = bpfjit_generate_code(insns, insn_count);
1331 ATF_REQUIRE(code != NULL);
1332
1333 ATF_CHECK(code(pkt, 1, 1) == 1);
1334 ATF_CHECK(code(pkt, 2, 2) == 1);
1335 ATF_CHECK(code(pkt, 3, 3) == 7);
1336 ATF_CHECK(code(pkt, 4, 4) == 7);
1337 ATF_CHECK(code(pkt, 5, 5) == 7);
1338 ATF_CHECK(code(pkt, 6, 6) == 8);
1339 ATF_CHECK(code(pkt, 7, 7) == 5);
1340 ATF_CHECK(code(pkt, 8, 8) == 0);
1341
1342 bpfjit_free_code(code);
1343 }
1344
1345 ATF_TC(bpfjit_jmp_jge_k);
1346 ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
1347 {
1348 atf_tc_set_md_var(tc, "descr",
1349 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1350 }
1351
1352 ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
1353 {
1354 static struct bpf_insn insns[] = {
1355 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1356 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1357 BPF_STMT(BPF_RET+BPF_K, 0),
1358 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1359 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1360 BPF_STMT(BPF_RET+BPF_K, 1),
1361 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1362 BPF_STMT(BPF_RET+BPF_K, 2),
1363 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1364 BPF_STMT(BPF_RET+BPF_K, 3),
1365 BPF_STMT(BPF_RET+BPF_K, 4),
1366 BPF_STMT(BPF_RET+BPF_K, 5),
1367 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1368 BPF_STMT(BPF_RET+BPF_K, 6),
1369 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1370 BPF_STMT(BPF_RET+BPF_K, 7),
1371 BPF_STMT(BPF_RET+BPF_K, 8)
1372 };
1373
1374 bpfjit_function_t code;
1375 uint8_t pkt[8]; /* the program doesn't read any data */
1376
1377 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1378
1379 ATF_CHECK(bpf_validate(insns, insn_count));
1380
1381 code = bpfjit_generate_code(insns, insn_count);
1382 ATF_REQUIRE(code != NULL);
1383
1384 ATF_CHECK(code(pkt, 1, 1) == 1);
1385 ATF_CHECK(code(pkt, 2, 2) == 1);
1386 ATF_CHECK(code(pkt, 3, 3) == 7);
1387 ATF_CHECK(code(pkt, 4, 4) == 7);
1388 ATF_CHECK(code(pkt, 5, 5) == 7);
1389 ATF_CHECK(code(pkt, 6, 6) == 8);
1390 ATF_CHECK(code(pkt, 7, 7) == 5);
1391 ATF_CHECK(code(pkt, 8, 8) == 0);
1392
1393 bpfjit_free_code(code);
1394 }
1395
1396 ATF_TC(bpfjit_jmp_jeq_k);
1397 ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
1398 {
1399 atf_tc_set_md_var(tc, "descr",
1400 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1401 }
1402
1403 ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
1404 {
1405 static struct bpf_insn insns[] = {
1406 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1407 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1408 BPF_STMT(BPF_RET+BPF_K, 0),
1409 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1410 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1411 BPF_STMT(BPF_RET+BPF_K, 1),
1412 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1413 BPF_STMT(BPF_RET+BPF_K, 2),
1414 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1415 BPF_STMT(BPF_RET+BPF_K, 3),
1416 BPF_STMT(BPF_RET+BPF_K, 4),
1417 BPF_STMT(BPF_RET+BPF_K, 5),
1418 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1419 BPF_STMT(BPF_RET+BPF_K, 6),
1420 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1421 BPF_STMT(BPF_RET+BPF_K, 7),
1422 BPF_STMT(BPF_RET+BPF_K, 8)
1423 };
1424
1425 bpfjit_function_t code;
1426 uint8_t pkt[8]; /* the program doesn't read any data */
1427
1428 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1429
1430 ATF_CHECK(bpf_validate(insns, insn_count));
1431
1432 code = bpfjit_generate_code(insns, insn_count);
1433 ATF_REQUIRE(code != NULL);
1434
1435 ATF_CHECK(code(pkt, 1, 1) == 7);
1436 ATF_CHECK(code(pkt, 2, 2) == 7);
1437 ATF_CHECK(code(pkt, 3, 3) == 1);
1438 ATF_CHECK(code(pkt, 4, 4) == 7);
1439 ATF_CHECK(code(pkt, 5, 5) == 7);
1440 ATF_CHECK(code(pkt, 6, 6) == 8);
1441 ATF_CHECK(code(pkt, 7, 7) == 5);
1442 ATF_CHECK(code(pkt, 8, 8) == 0);
1443
1444 bpfjit_free_code(code);
1445 }
1446
1447 ATF_TC(bpfjit_jmp_jset_k);
1448 ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
1449 {
1450 atf_tc_set_md_var(tc, "descr",
1451 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1452 }
1453
1454 ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
1455 {
1456 static struct bpf_insn insns[] = {
1457 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1458 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1459 BPF_STMT(BPF_RET+BPF_K, 0),
1460 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1461 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1462 BPF_STMT(BPF_RET+BPF_K, 1),
1463 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1464 BPF_STMT(BPF_RET+BPF_K, 2),
1465 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1466 BPF_STMT(BPF_RET+BPF_K, 3),
1467 BPF_STMT(BPF_RET+BPF_K, 4),
1468 BPF_STMT(BPF_RET+BPF_K, 5),
1469 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1470 BPF_STMT(BPF_RET+BPF_K, 6),
1471 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1472 BPF_STMT(BPF_RET+BPF_K, 7),
1473 BPF_STMT(BPF_RET+BPF_K, 8)
1474 };
1475
1476 bpfjit_function_t code;
1477 uint8_t pkt[8]; /* the program doesn't read any data */
1478
1479 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1480
1481 ATF_CHECK(bpf_validate(insns, insn_count));
1482
1483 code = bpfjit_generate_code(insns, insn_count);
1484 ATF_REQUIRE(code != NULL);
1485
1486 ATF_CHECK(code(pkt, 1, 1) == 1);
1487 ATF_CHECK(code(pkt, 2, 2) == 1);
1488 ATF_CHECK(code(pkt, 3, 3) == 1);
1489 ATF_CHECK(code(pkt, 4, 4) == 7);
1490 ATF_CHECK(code(pkt, 5, 5) == 5);
1491 ATF_CHECK(code(pkt, 6, 6) == 8);
1492 ATF_CHECK(code(pkt, 7, 7) == 5);
1493 ATF_CHECK(code(pkt, 8, 8) == 0);
1494
1495 bpfjit_free_code(code);
1496 }
1497
1498 ATF_TC(bpfjit_jmp_modulo_k);
1499 ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
1500 {
1501 atf_tc_set_md_var(tc, "descr",
1502 "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1503 }
1504
1505 ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
1506 {
1507 static struct bpf_insn insns[] = {
1508 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1509 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1510 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1511 BPF_STMT(BPF_RET+BPF_K, 0),
1512 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1513 BPF_STMT(BPF_RET+BPF_K, 1),
1514 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1515 BPF_STMT(BPF_RET+BPF_K, 2),
1516 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1517 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1518 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1519 BPF_STMT(BPF_JMP+BPF_JA, 1),
1520 BPF_STMT(BPF_RET+BPF_K, 3),
1521
1522 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1523 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1524
1525 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1526 BPF_STMT(BPF_RET+BPF_K, 4),
1527 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1528 BPF_STMT(BPF_RET+BPF_K, 5),
1529 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1530 BPF_STMT(BPF_RET+BPF_K, 6),
1531 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1532 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1533 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1534 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1535 BPF_STMT(BPF_RET+BPF_K, 7)
1536 };
1537
1538 bpfjit_function_t code;
1539 uint8_t pkt[1]; /* the program doesn't read any data */
1540
1541 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1542
1543 ATF_CHECK(bpf_validate(insns, insn_count));
1544
1545 code = bpfjit_generate_code(insns, insn_count);
1546 ATF_REQUIRE(code != NULL);
1547
1548 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1549
1550 bpfjit_free_code(code);
1551 }
1552
1553 ATF_TC(bpfjit_jmp_jgt_x);
1554 ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
1555 {
1556 atf_tc_set_md_var(tc, "descr",
1557 "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1558 }
1559
1560 ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
1561 {
1562 static struct bpf_insn insns[] = {
1563 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1564 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1565 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1566 BPF_STMT(BPF_RET+BPF_K, 0),
1567 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1568 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1569 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1570 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1571 BPF_STMT(BPF_RET+BPF_K, 1),
1572 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1573 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1574 BPF_STMT(BPF_RET+BPF_K, 2),
1575 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1576 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1577 BPF_STMT(BPF_RET+BPF_K, 3),
1578 BPF_STMT(BPF_RET+BPF_K, 4),
1579 BPF_STMT(BPF_RET+BPF_K, 5),
1580 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1581 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1582 BPF_STMT(BPF_RET+BPF_K, 6),
1583 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1584 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1585 BPF_STMT(BPF_RET+BPF_K, 7),
1586 BPF_STMT(BPF_RET+BPF_K, 8)
1587 };
1588
1589 bpfjit_function_t code;
1590 uint8_t pkt[8]; /* the program doesn't read any data */
1591
1592 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1593
1594 ATF_CHECK(bpf_validate(insns, insn_count));
1595
1596 code = bpfjit_generate_code(insns, insn_count);
1597 ATF_REQUIRE(code != NULL);
1598
1599 ATF_CHECK(code(pkt, 1, 1) == 1);
1600 ATF_CHECK(code(pkt, 2, 2) == 1);
1601 ATF_CHECK(code(pkt, 3, 3) == 7);
1602 ATF_CHECK(code(pkt, 4, 4) == 7);
1603 ATF_CHECK(code(pkt, 5, 5) == 7);
1604 ATF_CHECK(code(pkt, 6, 6) == 8);
1605 ATF_CHECK(code(pkt, 7, 7) == 5);
1606 ATF_CHECK(code(pkt, 8, 8) == 0);
1607
1608 bpfjit_free_code(code);
1609 }
1610
1611 ATF_TC(bpfjit_jmp_jge_x);
1612 ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
1613 {
1614 atf_tc_set_md_var(tc, "descr",
1615 "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1616 }
1617
1618 ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
1619 {
1620 static struct bpf_insn insns[] = {
1621 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1622 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1623 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1624 BPF_STMT(BPF_RET+BPF_K, 0),
1625 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1626 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1627 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1628 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1629 BPF_STMT(BPF_RET+BPF_K, 1),
1630 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1631 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1632 BPF_STMT(BPF_RET+BPF_K, 2),
1633 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1634 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1635 BPF_STMT(BPF_RET+BPF_K, 3),
1636 BPF_STMT(BPF_RET+BPF_K, 4),
1637 BPF_STMT(BPF_RET+BPF_K, 5),
1638 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1639 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1640 BPF_STMT(BPF_RET+BPF_K, 6),
1641 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1642 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1643 BPF_STMT(BPF_RET+BPF_K, 7),
1644 BPF_STMT(BPF_RET+BPF_K, 8)
1645 };
1646
1647 bpfjit_function_t code;
1648 uint8_t pkt[8]; /* the program doesn't read any data */
1649
1650 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1651
1652 ATF_CHECK(bpf_validate(insns, insn_count));
1653
1654 code = bpfjit_generate_code(insns, insn_count);
1655 ATF_REQUIRE(code != NULL);
1656
1657 ATF_CHECK(code(pkt, 1, 1) == 1);
1658 ATF_CHECK(code(pkt, 2, 2) == 1);
1659 ATF_CHECK(code(pkt, 3, 3) == 7);
1660 ATF_CHECK(code(pkt, 4, 4) == 7);
1661 ATF_CHECK(code(pkt, 5, 5) == 7);
1662 ATF_CHECK(code(pkt, 6, 6) == 8);
1663 ATF_CHECK(code(pkt, 7, 7) == 5);
1664 ATF_CHECK(code(pkt, 8, 8) == 0);
1665
1666 bpfjit_free_code(code);
1667 }
1668
1669 ATF_TC(bpfjit_jmp_jeq_x);
1670 ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
1671 {
1672 atf_tc_set_md_var(tc, "descr",
1673 "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1674 }
1675
1676 ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
1677 {
1678 static struct bpf_insn insns[] = {
1679 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1680 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1681 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1682 BPF_STMT(BPF_RET+BPF_K, 0),
1683 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1684 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1685 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1686 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1687 BPF_STMT(BPF_RET+BPF_K, 1),
1688 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1689 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1690 BPF_STMT(BPF_RET+BPF_K, 2),
1691 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1692 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1693 BPF_STMT(BPF_RET+BPF_K, 3),
1694 BPF_STMT(BPF_RET+BPF_K, 4),
1695 BPF_STMT(BPF_RET+BPF_K, 5),
1696 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1697 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1698 BPF_STMT(BPF_RET+BPF_K, 6),
1699 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1700 BPF_STMT(BPF_RET+BPF_K, 7),
1701 BPF_STMT(BPF_RET+BPF_K, 8)
1702 };
1703
1704 bpfjit_function_t code;
1705 uint8_t pkt[8]; /* the program doesn't read any data */
1706
1707 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1708
1709 ATF_CHECK(bpf_validate(insns, insn_count));
1710
1711 code = bpfjit_generate_code(insns, insn_count);
1712 ATF_REQUIRE(code != NULL);
1713
1714 ATF_CHECK(code(pkt, 1, 1) == 7);
1715 ATF_CHECK(code(pkt, 2, 2) == 7);
1716 ATF_CHECK(code(pkt, 3, 3) == 1);
1717 ATF_CHECK(code(pkt, 4, 4) == 7);
1718 ATF_CHECK(code(pkt, 5, 5) == 7);
1719 ATF_CHECK(code(pkt, 6, 6) == 8);
1720 ATF_CHECK(code(pkt, 7, 7) == 5);
1721 ATF_CHECK(code(pkt, 8, 8) == 0);
1722
1723 bpfjit_free_code(code);
1724 }
1725
1726 ATF_TC(bpfjit_jmp_jset_x);
1727 ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
1728 {
1729 atf_tc_set_md_var(tc, "descr",
1730 "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1731 }
1732
1733 ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
1734 {
1735 static struct bpf_insn insns[] = {
1736 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1737 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1738 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1739 BPF_STMT(BPF_RET+BPF_K, 0),
1740 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1741 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1742 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1743 BPF_STMT(BPF_RET+BPF_K, 1),
1744 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1745 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1746 BPF_STMT(BPF_RET+BPF_K, 2),
1747 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1748 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1749 BPF_STMT(BPF_RET+BPF_K, 3),
1750 BPF_STMT(BPF_RET+BPF_K, 4),
1751 BPF_STMT(BPF_RET+BPF_K, 5),
1752 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1753 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1754 BPF_STMT(BPF_RET+BPF_K, 6),
1755 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1756 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1757 BPF_STMT(BPF_RET+BPF_K, 7),
1758 BPF_STMT(BPF_RET+BPF_K, 8)
1759 };
1760
1761 bpfjit_function_t code;
1762 uint8_t pkt[8]; /* the program doesn't read any data */
1763
1764 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1765
1766 ATF_CHECK(bpf_validate(insns, insn_count));
1767
1768 code = bpfjit_generate_code(insns, insn_count);
1769 ATF_REQUIRE(code != NULL);
1770
1771 ATF_CHECK(code(pkt, 1, 1) == 1);
1772 ATF_CHECK(code(pkt, 2, 2) == 1);
1773 ATF_CHECK(code(pkt, 3, 3) == 1);
1774 ATF_CHECK(code(pkt, 4, 4) == 7);
1775 ATF_CHECK(code(pkt, 5, 5) == 5);
1776 ATF_CHECK(code(pkt, 6, 6) == 8);
1777 ATF_CHECK(code(pkt, 7, 7) == 5);
1778 ATF_CHECK(code(pkt, 8, 8) == 0);
1779
1780 bpfjit_free_code(code);
1781 }
1782
1783 ATF_TC(bpfjit_jmp_modulo_x);
1784 ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
1785 {
1786 atf_tc_set_md_var(tc, "descr",
1787 "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1788 }
1789
1790 ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
1791 {
1792 static struct bpf_insn insns[] = {
1793 BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1794 /* FFFFF770 << 4 = FFFFF770 */
1795 BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1796
1797 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1798 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1799 BPF_STMT(BPF_RET+BPF_K, 0),
1800 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1801 BPF_STMT(BPF_RET+BPF_K, 1),
1802 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1803 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1804 BPF_STMT(BPF_RET+BPF_K, 2),
1805 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1806 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1807 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1808 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1809 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1810 BPF_STMT(BPF_JMP+BPF_JA, 1),
1811 BPF_STMT(BPF_RET+BPF_K, 3),
1812
1813 /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1814 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1815
1816 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1817 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1818 BPF_STMT(BPF_RET+BPF_K, 4),
1819 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1820 BPF_STMT(BPF_RET+BPF_K, 5),
1821 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1822 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1823 BPF_STMT(BPF_RET+BPF_K, 6),
1824 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1825 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1826 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1827 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1828 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1829 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1830 BPF_STMT(BPF_RET+BPF_K, 7)
1831 };
1832
1833 bpfjit_function_t code;
1834 uint8_t pkt[1]; /* the program doesn't read any data */
1835
1836 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1837
1838 ATF_CHECK(bpf_validate(insns, insn_count));
1839
1840 code = bpfjit_generate_code(insns, insn_count);
1841 ATF_REQUIRE(code != NULL);
1842
1843 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1844
1845 bpfjit_free_code(code);
1846 }
1847
1848 ATF_TC(bpfjit_ld_abs);
1849 ATF_TC_HEAD(bpfjit_ld_abs, tc)
1850 {
1851 atf_tc_set_md_var(tc, "descr",
1852 "Test JIT compilation of BPF_LD+BPF_ABS");
1853 }
1854
1855 ATF_TC_BODY(bpfjit_ld_abs, tc)
1856 {
1857 static struct bpf_insn insns[3][2] = {
1858 {
1859 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1860 BPF_STMT(BPF_RET+BPF_A, 0)
1861 },
1862 {
1863 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1864 BPF_STMT(BPF_RET+BPF_A, 0)
1865 },
1866 {
1867 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1868 BPF_STMT(BPF_RET+BPF_A, 0)
1869 }
1870 };
1871
1872 static size_t lengths[3] = { 1, 2, 4 };
1873 static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1874
1875 size_t i, l;
1876 uint8_t *pkt = deadbeef_at_5;
1877 size_t pktsize = sizeof(deadbeef_at_5);
1878
1879 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1880
1881 for (i = 0; i < 3; i++) {
1882 bpfjit_function_t code;
1883
1884 ATF_CHECK(bpf_validate(insns[i], insn_count));
1885
1886 code = bpfjit_generate_code(insns[i], insn_count);
1887 ATF_REQUIRE(code != NULL);
1888
1889 for (l = 0; l < 5 + lengths[i]; l++) {
1890 ATF_CHECK(code(pkt, l, l) == 0);
1891 ATF_CHECK(code(pkt, pktsize, l) == 0);
1892 }
1893
1894 l = 5 + lengths[i];
1895 ATF_CHECK(code(pkt, l, l) == expected[i]);
1896 ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
1897
1898 l = pktsize;
1899 ATF_CHECK(code(pkt, l, l) == expected[i]);
1900
1901 bpfjit_free_code(code);
1902 }
1903 }
1904
1905 ATF_TC(bpfjit_ld_abs_k_overflow);
1906 ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
1907 {
1908 atf_tc_set_md_var(tc, "descr",
1909 "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1910 }
1911
1912 ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
1913 {
1914 static struct bpf_insn insns[12][3] = {
1915 {
1916 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1917 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1918 BPF_STMT(BPF_RET+BPF_K, 1)
1919 },
1920 {
1921 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1922 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1923 BPF_STMT(BPF_RET+BPF_K, 1)
1924 },
1925 {
1926 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1927 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1928 BPF_STMT(BPF_RET+BPF_K, 1)
1929 },
1930 {
1931 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1932 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1933 BPF_STMT(BPF_RET+BPF_K, 1)
1934 },
1935 {
1936 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1937 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1938 BPF_STMT(BPF_RET+BPF_K, 1)
1939 },
1940 {
1941 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1942 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1943 BPF_STMT(BPF_RET+BPF_K, 1)
1944 },
1945 {
1946 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1947 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1948 BPF_STMT(BPF_RET+BPF_K, 1)
1949 },
1950 {
1951 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1952 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1953 BPF_STMT(BPF_RET+BPF_K, 1)
1954 },
1955 {
1956 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1957 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1958 BPF_STMT(BPF_RET+BPF_K, 1)
1959 },
1960 {
1961 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1962 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1963 BPF_STMT(BPF_RET+BPF_K, 1)
1964 },
1965 {
1966 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1967 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1968 BPF_STMT(BPF_RET+BPF_K, 1)
1969 },
1970 {
1971 BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1972 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1973 BPF_STMT(BPF_RET+BPF_K, 1)
1974 }
1975 };
1976
1977 int i;
1978 uint8_t pkt[8] = { 0 };
1979
1980 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1981
1982 for (i = 0; i < 3; i++) {
1983 bpfjit_function_t code;
1984
1985 ATF_CHECK(bpf_validate(insns[i], insn_count));
1986
1987 code = bpfjit_generate_code(insns[i], insn_count);
1988 ATF_REQUIRE(code != NULL);
1989
1990 ATF_CHECK(code(pkt, 8, 8) == 0);
1991
1992 bpfjit_free_code(code);
1993 }
1994 }
1995
1996 ATF_TC(bpfjit_ld_ind);
1997 ATF_TC_HEAD(bpfjit_ld_ind, tc)
1998 {
1999 atf_tc_set_md_var(tc, "descr",
2000 "Test JIT compilation of BPF_LD+BPF_IND");
2001 }
2002
2003 ATF_TC_BODY(bpfjit_ld_ind, tc)
2004 {
2005 static struct bpf_insn insns[6][3] = {
2006 {
2007 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2008 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2009 BPF_STMT(BPF_RET+BPF_A, 0)
2010 },
2011 {
2012 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2013 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2014 BPF_STMT(BPF_RET+BPF_A, 0)
2015 },
2016 {
2017 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2018 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2019 BPF_STMT(BPF_RET+BPF_A, 0)
2020 },
2021 {
2022 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2023 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2024 BPF_STMT(BPF_RET+BPF_A, 0)
2025 },
2026 {
2027 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2028 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2029 BPF_STMT(BPF_RET+BPF_A, 0)
2030 },
2031 {
2032 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2033 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2034 BPF_STMT(BPF_RET+BPF_A, 0)
2035 }
2036 };
2037
2038 static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2039
2040 static unsigned int expected[6] = {
2041 0xde, 0xdead, 0xdeadbeef,
2042 0xde, 0xdead, 0xdeadbeef
2043 };
2044
2045 size_t i, l;
2046 uint8_t *pkt = deadbeef_at_5;
2047 size_t pktsize = sizeof(deadbeef_at_5);
2048
2049 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2050
2051 for (i = 0; i < 3; i++) {
2052 bpfjit_function_t code;
2053
2054 ATF_CHECK(bpf_validate(insns[i], insn_count));
2055
2056 code = bpfjit_generate_code(insns[i], insn_count);
2057 ATF_REQUIRE(code != NULL);
2058
2059 for (l = 0; l < 5 + lengths[i]; l++) {
2060 ATF_CHECK(code(pkt, l, l) == 0);
2061 ATF_CHECK(code(pkt, pktsize, l) == 0);
2062 }
2063
2064 l = 5 + lengths[i];
2065 ATF_CHECK(code(pkt, l, l) == expected[i]);
2066 ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
2067
2068 l = pktsize;
2069 ATF_CHECK(code(pkt, l, l) == expected[i]);
2070
2071 bpfjit_free_code(code);
2072 }
2073 }
2074
2075 ATF_TC(bpfjit_ld_ind_k_overflow);
2076 ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
2077 {
2078 atf_tc_set_md_var(tc, "descr",
2079 "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2080 }
2081
2082 ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
2083 {
2084 static struct bpf_insn insns[12][3] = {
2085 {
2086 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2087 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2088 BPF_STMT(BPF_RET+BPF_K, 1)
2089 },
2090 {
2091 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2092 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2093 BPF_STMT(BPF_RET+BPF_K, 1)
2094 },
2095 {
2096 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2097 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2098 BPF_STMT(BPF_RET+BPF_K, 1)
2099 },
2100 {
2101 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2102 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2103 BPF_STMT(BPF_RET+BPF_K, 1)
2104 },
2105 {
2106 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2107 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2108 BPF_STMT(BPF_RET+BPF_K, 1)
2109 },
2110 {
2111 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2112 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2113 BPF_STMT(BPF_RET+BPF_K, 1)
2114 },
2115 {
2116 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2117 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2118 BPF_STMT(BPF_RET+BPF_K, 1)
2119 },
2120 {
2121 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2122 BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2123 BPF_STMT(BPF_RET+BPF_K, 1)
2124 },
2125 {
2126 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2127 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2128 BPF_STMT(BPF_RET+BPF_K, 1)
2129 },
2130 {
2131 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2132 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2133 BPF_STMT(BPF_RET+BPF_K, 1)
2134 },
2135 {
2136 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2137 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2138 BPF_STMT(BPF_RET+BPF_K, 1)
2139 },
2140 {
2141 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2142 BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2143 BPF_STMT(BPF_RET+BPF_K, 1)
2144 }
2145 };
2146
2147 int i;
2148 uint8_t pkt[8] = { 0 };
2149
2150 size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2151
2152 for (i = 0; i < 3; i++) {
2153 bpfjit_function_t code;
2154
2155 ATF_CHECK(bpf_validate(insns[i], insn_count));
2156
2157 code = bpfjit_generate_code(insns[i], insn_count);
2158 ATF_REQUIRE(code != NULL);
2159
2160 ATF_CHECK(code(pkt, 8, 8) == 0);
2161
2162 bpfjit_free_code(code);
2163 }
2164 }
2165
2166 ATF_TC(bpfjit_ld_ind_x_overflow1);
2167 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2168 {
2169 atf_tc_set_md_var(tc, "descr",
2170 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2171 }
2172
2173 ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2174 {
2175 static struct bpf_insn insns[] = {
2176 BPF_STMT(BPF_LD+BPF_LEN, 0),
2177 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2178 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2179 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2180 BPF_STMT(BPF_RET+BPF_A, 0)
2181 };
2182
2183 size_t i;
2184 bpfjit_function_t code;
2185 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2186
2187 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2188
2189 ATF_CHECK(bpf_validate(insns, insn_count));
2190
2191 code = bpfjit_generate_code(insns, insn_count);
2192 ATF_REQUIRE(code != NULL);
2193
2194 for (i = 1; i <= sizeof(pkt); i++) {
2195 ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2196 ATF_CHECK(code(pkt, i, i) == 10 * i);
2197 }
2198
2199 bpfjit_free_code(code);
2200 }
2201
2202 ATF_TC(bpfjit_ld_ind_x_overflow2);
2203 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2204 {
2205 atf_tc_set_md_var(tc, "descr",
2206 "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2207 }
2208
2209 ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2210 {
2211 static struct bpf_insn insns[] = {
2212 BPF_STMT(BPF_LD+BPF_LEN, 0),
2213 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2214 BPF_STMT(BPF_ST, 3),
2215 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2216 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2217 BPF_STMT(BPF_RET+BPF_A, 0)
2218 };
2219
2220 size_t i;
2221 bpfjit_function_t code;
2222 uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2223
2224 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2225
2226 ATF_CHECK(bpf_validate(insns, insn_count));
2227
2228 code = bpfjit_generate_code(insns, insn_count);
2229 ATF_REQUIRE(code != NULL);
2230
2231 for (i = 1; i <= sizeof(pkt); i++) {
2232 ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2233 ATF_CHECK(code(pkt, i, i) == 10 * i);
2234 }
2235
2236 bpfjit_free_code(code);
2237 }
2238
2239 ATF_TC(bpfjit_ld_len);
2240 ATF_TC_HEAD(bpfjit_ld_len, tc)
2241 {
2242 atf_tc_set_md_var(tc, "descr",
2243 "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2244 }
2245
2246 ATF_TC_BODY(bpfjit_ld_len, tc)
2247 {
2248 static struct bpf_insn insns[] = {
2249 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2250 BPF_STMT(BPF_RET+BPF_A, 0)
2251 };
2252
2253 size_t i;
2254 bpfjit_function_t code;
2255 uint8_t pkt[32]; /* the program doesn't read any data */
2256
2257 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2258
2259 ATF_CHECK(bpf_validate(insns, insn_count));
2260
2261 code = bpfjit_generate_code(insns, insn_count);
2262 ATF_REQUIRE(code != NULL);
2263
2264 for (i = 0; i < sizeof(pkt); i++)
2265 ATF_CHECK(code(pkt, i, 1) == i);
2266
2267 bpfjit_free_code(code);
2268 }
2269
2270 ATF_TC(bpfjit_ld_imm);
2271 ATF_TC_HEAD(bpfjit_ld_imm, tc)
2272 {
2273 atf_tc_set_md_var(tc, "descr",
2274 "Test JIT compilation of BPF_LD+BPF_IMM");
2275 }
2276
2277 ATF_TC_BODY(bpfjit_ld_imm, tc)
2278 {
2279 static struct bpf_insn insns[] = {
2280 BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2281 BPF_STMT(BPF_RET+BPF_A, 0)
2282 };
2283
2284 bpfjit_function_t code;
2285 uint8_t pkt[1]; /* the program doesn't read any data */
2286
2287 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2288
2289 ATF_CHECK(bpf_validate(insns, insn_count));
2290
2291 code = bpfjit_generate_code(insns, insn_count);
2292 ATF_REQUIRE(code != NULL);
2293
2294 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2295
2296 bpfjit_free_code(code);
2297 }
2298
2299 ATF_TC(bpfjit_ldx_imm1);
2300 ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2301 {
2302 atf_tc_set_md_var(tc, "descr",
2303 "Test JIT compilation of BPF_LDX+BPF_IMM");
2304 }
2305
2306 ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2307 {
2308 static struct bpf_insn insns[] = {
2309 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2310 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2311 BPF_STMT(BPF_RET+BPF_A, 0)
2312 };
2313
2314 bpfjit_function_t code;
2315 uint8_t pkt[1]; /* the program doesn't read any data */
2316
2317 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2318
2319 ATF_CHECK(bpf_validate(insns, insn_count));
2320
2321 code = bpfjit_generate_code(insns, insn_count);
2322 ATF_REQUIRE(code != NULL);
2323
2324 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX - 5);
2325
2326 bpfjit_free_code(code);
2327 }
2328
2329 ATF_TC(bpfjit_ldx_imm2);
2330 ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2331 {
2332 atf_tc_set_md_var(tc, "descr",
2333 "Test JIT compilation of BPF_LDX+BPF_IMM");
2334 }
2335
2336 ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2337 {
2338 static struct bpf_insn insns[] = {
2339 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2340 BPF_STMT(BPF_LD+BPF_IMM, 5),
2341 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2342 BPF_STMT(BPF_RET+BPF_K, 7),
2343 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2344 };
2345
2346 bpfjit_function_t code;
2347 uint8_t pkt[1]; /* the program doesn't read any data */
2348
2349 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2350
2351 ATF_CHECK(bpf_validate(insns, insn_count));
2352
2353 code = bpfjit_generate_code(insns, insn_count);
2354 ATF_REQUIRE(code != NULL);
2355
2356 ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2357
2358 bpfjit_free_code(code);
2359 }
2360
2361 ATF_TC(bpfjit_ldx_len1);
2362 ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2363 {
2364 atf_tc_set_md_var(tc, "descr",
2365 "Test JIT compilation of BPF_LDX+BPF_LEN");
2366 }
2367
2368 ATF_TC_BODY(bpfjit_ldx_len1, tc)
2369 {
2370 static struct bpf_insn insns[] = {
2371 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2372 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2373 BPF_STMT(BPF_RET+BPF_A, 0)
2374 };
2375
2376 size_t i;
2377 bpfjit_function_t code;
2378 uint8_t pkt[5]; /* the program doesn't read any data */
2379
2380 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2381
2382 ATF_CHECK(bpf_validate(insns, insn_count));
2383
2384 code = bpfjit_generate_code(insns, insn_count);
2385 ATF_REQUIRE(code != NULL);
2386
2387 for (i = 1; i < sizeof(pkt); i++) {
2388 ATF_CHECK(code(pkt, i, 1) == i);
2389 ATF_CHECK(code(pkt, i + 1, i) == i + 1);
2390 }
2391
2392 bpfjit_free_code(code);
2393 }
2394
2395 ATF_TC(bpfjit_ldx_len2);
2396 ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2397 {
2398 atf_tc_set_md_var(tc, "descr",
2399 "Test JIT compilation of BPF_LDX+BPF_LEN");
2400 }
2401
2402 ATF_TC_BODY(bpfjit_ldx_len2, tc)
2403 {
2404 static struct bpf_insn insns[] = {
2405 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2406 BPF_STMT(BPF_LD+BPF_IMM, 5),
2407 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2408 BPF_STMT(BPF_RET+BPF_K, 7),
2409 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2410 };
2411
2412 bpfjit_function_t code;
2413 uint8_t pkt[5]; /* the program doesn't read any data */
2414
2415 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2416
2417 ATF_CHECK(bpf_validate(insns, insn_count));
2418
2419 code = bpfjit_generate_code(insns, insn_count);
2420 ATF_REQUIRE(code != NULL);
2421
2422 ATF_CHECK(code(pkt, 5, 1) == UINT32_MAX);
2423 ATF_CHECK(code(pkt, 6, 5) == 7);
2424
2425 bpfjit_free_code(code);
2426 }
2427
2428 ATF_TC(bpfjit_ldx_msh);
2429 ATF_TC_HEAD(bpfjit_ldx_msh, tc)
2430 {
2431 atf_tc_set_md_var(tc, "descr",
2432 "Test JIT compilation of BPF_LDX+BPF_MSH");
2433 }
2434
2435 ATF_TC_BODY(bpfjit_ldx_msh, tc)
2436 {
2437 static struct bpf_insn insns[] = {
2438 BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2439 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2440 BPF_STMT(BPF_RET+BPF_A, 0)
2441 };
2442
2443 bpfjit_function_t code;
2444 uint8_t pkt[2] = { 0, 0x7a };
2445
2446 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2447
2448 ATF_CHECK(bpf_validate(insns, insn_count));
2449
2450 code = bpfjit_generate_code(insns, insn_count);
2451 ATF_REQUIRE(code != NULL);
2452
2453 ATF_CHECK(code(pkt, 2, 2) == 40);
2454
2455 bpfjit_free_code(code);
2456 }
2457
2458 ATF_TC(bpfjit_misc_tax);
2459 ATF_TC_HEAD(bpfjit_misc_tax, tc)
2460 {
2461 atf_tc_set_md_var(tc, "descr",
2462 "Test JIT compilation of BPF_MISC+BPF_TAX");
2463 }
2464
2465 ATF_TC_BODY(bpfjit_misc_tax, tc)
2466 {
2467 static struct bpf_insn insns[] = {
2468 BPF_STMT(BPF_LD+BPF_IMM, 3),
2469 BPF_STMT(BPF_MISC+BPF_TAX, 0),
2470 BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2471 BPF_STMT(BPF_RET+BPF_A, 0)
2472 };
2473
2474 bpfjit_function_t code;
2475 uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
2476
2477 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2478
2479 ATF_CHECK(bpf_validate(insns, insn_count));
2480
2481 code = bpfjit_generate_code(insns, insn_count);
2482 ATF_REQUIRE(code != NULL);
2483
2484 ATF_CHECK(code(pkt, sizeof(pkt), sizeof(pkt)) == 55);
2485
2486 bpfjit_free_code(code);
2487 }
2488
2489 ATF_TC(bpfjit_misc_txa);
2490 ATF_TC_HEAD(bpfjit_misc_txa, tc)
2491 {
2492 atf_tc_set_md_var(tc, "descr",
2493 "Test JIT compilation of BPF_MISC+BPF_TXA");
2494 }
2495
2496 ATF_TC_BODY(bpfjit_misc_txa, tc)
2497 {
2498 static struct bpf_insn insns[] = {
2499 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2500 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2501 BPF_STMT(BPF_RET+BPF_A, 0)
2502 };
2503
2504 bpfjit_function_t code;
2505 uint8_t pkt[1]; /* the program doesn't read any data */
2506
2507 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2508
2509 ATF_CHECK(bpf_validate(insns, insn_count));
2510
2511 code = bpfjit_generate_code(insns, insn_count);
2512 ATF_REQUIRE(code != NULL);
2513
2514 ATF_CHECK(code(pkt, 1, 1) == 391);
2515
2516 bpfjit_free_code(code);
2517 }
2518
2519 ATF_TC(bpfjit_st1);
2520 ATF_TC_HEAD(bpfjit_st1, tc)
2521 {
2522 atf_tc_set_md_var(tc, "descr",
2523 "Test JIT compilation of BPF_ST");
2524 }
2525
2526 ATF_TC_BODY(bpfjit_st1, tc)
2527 {
2528 static struct bpf_insn insns[] = {
2529 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2530 BPF_STMT(BPF_ST, 0),
2531 BPF_STMT(BPF_LD+BPF_MEM, 0),
2532 BPF_STMT(BPF_RET+BPF_A, 0)
2533 };
2534
2535 size_t i;
2536 bpfjit_function_t code;
2537 uint8_t pkt[16]; /* the program doesn't read any data */
2538
2539 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2540
2541 ATF_CHECK(bpf_validate(insns, insn_count));
2542
2543 code = bpfjit_generate_code(insns, insn_count);
2544 ATF_REQUIRE(code != NULL);
2545
2546 for (i = 1; i <= sizeof(pkt); i++)
2547 ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2548
2549 bpfjit_free_code(code);
2550 }
2551
2552 ATF_TC(bpfjit_st2);
2553 ATF_TC_HEAD(bpfjit_st2, tc)
2554 {
2555 atf_tc_set_md_var(tc, "descr",
2556 "Test JIT compilation of BPF_ST");
2557 }
2558
2559 ATF_TC_BODY(bpfjit_st2, tc)
2560 {
2561 static struct bpf_insn insns[] = {
2562 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2563 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2564 BPF_STMT(BPF_LD+BPF_MEM, 0),
2565 BPF_STMT(BPF_RET+BPF_A, 0)
2566 };
2567
2568 bpfjit_function_t code;
2569 uint8_t pkt[1]; /* the program doesn't read any data */
2570
2571 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2572
2573 ATF_CHECK(bpf_validate(insns, insn_count));
2574
2575 code = bpfjit_generate_code(insns, insn_count);
2576 ATF_REQUIRE(code != NULL);
2577
2578 ATF_CHECK(code(pkt, 1, 1) == 0);
2579
2580 bpfjit_free_code(code);
2581 }
2582
2583 ATF_TC(bpfjit_st3);
2584 ATF_TC_HEAD(bpfjit_st3, tc)
2585 {
2586 atf_tc_set_md_var(tc, "descr",
2587 "Test JIT compilation of BPF_ST");
2588 }
2589
2590 ATF_TC_BODY(bpfjit_st3, tc)
2591 {
2592 static struct bpf_insn insns[] = {
2593 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2594 BPF_STMT(BPF_ST, 0),
2595 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2596 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2597 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2598 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2599 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2600 BPF_STMT(BPF_RET+BPF_A, 0),
2601 BPF_STMT(BPF_LD+BPF_MEM, 0),
2602 BPF_STMT(BPF_RET+BPF_A, 0)
2603 };
2604
2605 bpfjit_function_t code;
2606 uint8_t pkt[2]; /* the program doesn't read any data */
2607
2608 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2609
2610 ATF_REQUIRE(BPF_MEMWORDS > 1);
2611
2612 ATF_CHECK(bpf_validate(insns, insn_count));
2613
2614 code = bpfjit_generate_code(insns, insn_count);
2615 ATF_REQUIRE(code != NULL);
2616
2617 ATF_CHECK(code(pkt, 1, 1) == 1);
2618 ATF_CHECK(code(pkt, 2, 2) == 102);
2619
2620 bpfjit_free_code(code);
2621 }
2622
2623 ATF_TC(bpfjit_st4);
2624 ATF_TC_HEAD(bpfjit_st4, tc)
2625 {
2626 atf_tc_set_md_var(tc, "descr",
2627 "Test JIT compilation of BPF_ST");
2628 }
2629
2630 ATF_TC_BODY(bpfjit_st4, tc)
2631 {
2632 static struct bpf_insn insns[] = {
2633 BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2634 BPF_STMT(BPF_ST, 5),
2635 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2636 BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2637 BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2638 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2639 BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2640 BPF_STMT(BPF_RET+BPF_A, 0),
2641 BPF_STMT(BPF_LD+BPF_MEM, 5),
2642 BPF_STMT(BPF_RET+BPF_A, 0)
2643 };
2644
2645 bpfjit_function_t code;
2646 uint8_t pkt[2]; /* the program doesn't read any data */
2647
2648 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2649
2650 ATF_REQUIRE(BPF_MEMWORDS > 6);
2651
2652 ATF_CHECK(bpf_validate(insns, insn_count));
2653
2654 code = bpfjit_generate_code(insns, insn_count);
2655 ATF_REQUIRE(code != NULL);
2656
2657 ATF_CHECK(code(pkt, 1, 1) == 1);
2658 ATF_CHECK(code(pkt, 2, 2) == 102);
2659
2660 bpfjit_free_code(code);
2661 }
2662
2663 ATF_TC(bpfjit_st5);
2664 ATF_TC_HEAD(bpfjit_st5, tc)
2665 {
2666 atf_tc_set_md_var(tc, "descr",
2667 "Test JIT compilation of BPF_ST");
2668 }
2669
2670 ATF_TC_BODY(bpfjit_st5, tc)
2671 {
2672 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2673 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2674
2675 size_t k;
2676 bpfjit_function_t code;
2677 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2678
2679 memset(insns, 0, sizeof(insns));
2680
2681 /* for each k do M[k] = k */
2682 for (k = 0; k < BPF_MEMWORDS; k++) {
2683 insns[2*k].code = BPF_LD+BPF_IMM;
2684 insns[2*k].k = 3*k;
2685 insns[2*k+1].code = BPF_ST;
2686 insns[2*k+1].k = k;
2687 }
2688
2689 /* load wirelen into A */
2690 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2691
2692 /* for each k, if (A == k + 1) return M[k] */
2693 for (k = 0; k < BPF_MEMWORDS; k++) {
2694 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2695 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2696 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2697 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2698 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2699 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2700 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2701 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2702 }
2703
2704 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2705 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2706
2707 ATF_CHECK(bpf_validate(insns, insn_count));
2708
2709 code = bpfjit_generate_code(insns, insn_count);
2710 ATF_REQUIRE(code != NULL);
2711
2712 for (k = 1; k <= sizeof(pkt); k++)
2713 ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2714
2715 bpfjit_free_code(code);
2716 }
2717
2718 ATF_TC(bpfjit_stx1);
2719 ATF_TC_HEAD(bpfjit_stx1, tc)
2720 {
2721 atf_tc_set_md_var(tc, "descr",
2722 "Test JIT compilation of BPF_STX");
2723 }
2724
2725 ATF_TC_BODY(bpfjit_stx1, tc)
2726 {
2727 static struct bpf_insn insns[] = {
2728 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2729 BPF_STMT(BPF_STX, 0),
2730 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2731 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2732 BPF_STMT(BPF_RET+BPF_A, 0)
2733 };
2734
2735 size_t i;
2736 bpfjit_function_t code;
2737 uint8_t pkt[16]; /* the program doesn't read any data */
2738
2739 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2740
2741 ATF_CHECK(bpf_validate(insns, insn_count));
2742
2743 code = bpfjit_generate_code(insns, insn_count);
2744 ATF_REQUIRE(code != NULL);
2745
2746 for (i = 1; i <= sizeof(pkt); i++)
2747 ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2748
2749 bpfjit_free_code(code);
2750 }
2751
2752 ATF_TC(bpfjit_stx2);
2753 ATF_TC_HEAD(bpfjit_stx2, tc)
2754 {
2755 atf_tc_set_md_var(tc, "descr",
2756 "Test JIT compilation of BPF_STX");
2757 }
2758
2759 ATF_TC_BODY(bpfjit_stx2, tc)
2760 {
2761 static struct bpf_insn insns[] = {
2762 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2763 BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2764 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2765 BPF_STMT(BPF_MISC+BPF_TXA, 0),
2766 BPF_STMT(BPF_RET+BPF_A, 0)
2767 };
2768
2769 bpfjit_function_t code;
2770 uint8_t pkt[1]; /* the program doesn't read any data */
2771
2772 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2773
2774 ATF_CHECK(bpf_validate(insns, insn_count));
2775
2776 code = bpfjit_generate_code(insns, insn_count);
2777 ATF_REQUIRE(code != NULL);
2778
2779 ATF_CHECK(code(pkt, 1, 1) == 0);
2780
2781 bpfjit_free_code(code);
2782 }
2783
2784 ATF_TC(bpfjit_stx3);
2785 ATF_TC_HEAD(bpfjit_stx3, tc)
2786 {
2787 atf_tc_set_md_var(tc, "descr",
2788 "Test JIT compilation of BPF_STX");
2789 }
2790
2791 ATF_TC_BODY(bpfjit_stx3, tc)
2792 {
2793 static struct bpf_insn insns[] = {
2794 BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2795 BPF_STMT(BPF_STX, 5),
2796 BPF_STMT(BPF_STX, 2),
2797 BPF_STMT(BPF_STX, 3),
2798 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2799 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2800 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2801 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2802 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2803 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2804 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2805 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2806 BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2807 BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2808 BPF_STMT(BPF_RET+BPF_A, 0)
2809 };
2810
2811 size_t i;
2812 bpfjit_function_t code;
2813 uint8_t pkt[16]; /* the program doesn't read any data */
2814
2815 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2816
2817 ATF_CHECK(bpf_validate(insns, insn_count));
2818
2819 code = bpfjit_generate_code(insns, insn_count);
2820 ATF_REQUIRE(code != NULL);
2821
2822 for (i = 1; i <= sizeof(pkt); i++)
2823 ATF_CHECK(code(pkt, i, sizeof(pkt)) == 3 * i);
2824
2825 bpfjit_free_code(code);
2826 }
2827
2828 ATF_TC(bpfjit_stx4);
2829 ATF_TC_HEAD(bpfjit_stx4, tc)
2830 {
2831 atf_tc_set_md_var(tc, "descr",
2832 "Test JIT compilation of BPF_STX");
2833 }
2834
2835 ATF_TC_BODY(bpfjit_stx4, tc)
2836 {
2837 struct bpf_insn insns[5*BPF_MEMWORDS+2];
2838 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2839
2840 size_t k;
2841 bpfjit_function_t code;
2842 uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2843
2844 memset(insns, 0, sizeof(insns));
2845
2846 /* for each k do M[k] = k */
2847 for (k = 0; k < BPF_MEMWORDS; k++) {
2848 insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
2849 insns[2*k].k = 3*k;
2850 insns[2*k+1].code = BPF_STX;
2851 insns[2*k+1].k = k;
2852 }
2853
2854 /* load wirelen into A */
2855 insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2856
2857 /* for each k, if (A == k + 1) return M[k] */
2858 for (k = 0; k < BPF_MEMWORDS; k++) {
2859 insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2860 insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2861 insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2862 insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2863 insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2864 insns[2*BPF_MEMWORDS+3*k+2].k = k;
2865 insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2866 insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2867 }
2868
2869 insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2870 insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2871
2872 ATF_CHECK(bpf_validate(insns, insn_count));
2873
2874 code = bpfjit_generate_code(insns, insn_count);
2875 ATF_REQUIRE(code != NULL);
2876
2877 for (k = 1; k <= sizeof(pkt); k++)
2878 ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2879
2880 bpfjit_free_code(code);
2881 }
2882
2883 ATF_TC(bpfjit_opt_ld_abs_1);
2884 ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
2885 {
2886 atf_tc_set_md_var(tc, "descr",
2887 "Test JIT compilation with length optimization "
2888 "applied to BPF_LD+BPF_ABS");
2889 }
2890
2891 ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
2892 {
2893 static struct bpf_insn insns[] = {
2894 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2895 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2896 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2897 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2898 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2899 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2900 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2901 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2902 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2903 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2904 BPF_STMT(BPF_RET+BPF_K, 0),
2905 };
2906
2907 size_t i, j;
2908 bpfjit_function_t code;
2909 uint8_t pkt[2][34] = {
2910 {
2911 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2912 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2913 0x80, 0x03, 0x70, 0x0f,
2914 0x80, 0x03, 0x70, 0x23
2915 },
2916 {
2917 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2918 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2919 0x80, 0x03, 0x70, 0x23,
2920 0x80, 0x03, 0x70, 0x0f
2921 }
2922 };
2923
2924 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2925
2926 ATF_CHECK(bpf_validate(insns, insn_count));
2927
2928 code = bpfjit_generate_code(insns, insn_count);
2929 ATF_REQUIRE(code != NULL);
2930
2931 for (i = 0; i < 2; i++) {
2932 for (j = 1; j < sizeof(pkt[i]); j++)
2933 ATF_CHECK(code(pkt[i], j, j) == 0);
2934 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2935 }
2936
2937 bpfjit_free_code(code);
2938 }
2939
2940 ATF_TC(bpfjit_opt_ld_abs_2);
2941 ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
2942 {
2943 atf_tc_set_md_var(tc, "descr",
2944 "Test JIT compilation with length optimization "
2945 "applied to BPF_LD+BPF_ABS");
2946 }
2947
2948 ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
2949 {
2950 static struct bpf_insn insns[] = {
2951 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2952 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2953 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2954 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2955 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2956 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2957 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2958 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2959 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2960 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2961 BPF_STMT(BPF_RET+BPF_K, 0),
2962 };
2963
2964 size_t i, j;
2965 bpfjit_function_t code;
2966 uint8_t pkt[2][34] = {
2967 {
2968 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2969 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2970 0x80, 0x03, 0x70, 0x0f,
2971 0x80, 0x03, 0x70, 0x23
2972 },
2973 {
2974 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2975 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2976 0x80, 0x03, 0x70, 0x23,
2977 0x80, 0x03, 0x70, 0x0f
2978 }
2979 };
2980
2981 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2982
2983 ATF_CHECK(bpf_validate(insns, insn_count));
2984
2985 code = bpfjit_generate_code(insns, insn_count);
2986 ATF_REQUIRE(code != NULL);
2987
2988 for (i = 0; i < 2; i++) {
2989 for (j = 1; j < sizeof(pkt[i]); j++)
2990 ATF_CHECK(code(pkt[i], j, j) == 0);
2991 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2992 }
2993
2994 bpfjit_free_code(code);
2995 }
2996
2997 ATF_TC(bpfjit_opt_ld_abs_3);
2998 ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
2999 {
3000 atf_tc_set_md_var(tc, "descr",
3001 "Test JIT compilation with length optimization "
3002 "applied to BPF_LD+BPF_ABS");
3003 }
3004
3005 ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
3006 {
3007 static struct bpf_insn insns[] = {
3008 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3009 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3010 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3011 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3012 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3013 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3014 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3015 BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3016 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3017 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3018 BPF_STMT(BPF_RET+BPF_K, 0),
3019 };
3020
3021 size_t i, j;
3022 bpfjit_function_t code;
3023 uint8_t pkt[2][34] = {
3024 {
3025 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3026 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3027 0x80, 0x03, 0x70, 0x0f,
3028 0x80, 0x03, 0x70, 0x23
3029 },
3030 {
3031 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3032 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3033 0x80, 0x03, 0x70, 0x23,
3034 0x80, 0x03, 0x70, 0x0f
3035 }
3036 };
3037
3038 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3039
3040 ATF_CHECK(bpf_validate(insns, insn_count));
3041
3042 code = bpfjit_generate_code(insns, insn_count);
3043 ATF_REQUIRE(code != NULL);
3044
3045 for (i = 0; i < 2; i++) {
3046 for (j = 1; j < sizeof(pkt[i]); j++)
3047 ATF_CHECK(code(pkt[i], j, j) == 0);
3048 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3049 }
3050
3051 bpfjit_free_code(code);
3052 }
3053
3054 ATF_TC(bpfjit_opt_ld_ind_1);
3055 ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3056 {
3057 atf_tc_set_md_var(tc, "descr",
3058 "Test JIT compilation with length optimization "
3059 "applied to BPF_LD+BPF_IND");
3060 }
3061
3062 ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3063 {
3064 static struct bpf_insn insns[] = {
3065 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3066 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3067 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3068 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3069 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3070 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3071 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3072 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3073 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3074 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3075 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3076 BPF_STMT(BPF_RET+BPF_K, 0),
3077 };
3078
3079 size_t i, j;
3080 bpfjit_function_t code;
3081 uint8_t pkt[2][34] = {
3082 {
3083 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3084 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3085 0x80, 0x03, 0x70, 0x0f,
3086 0x80, 0x03, 0x70, 0x23
3087 },
3088 {
3089 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3090 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3091 0x80, 0x03, 0x70, 0x23,
3092 0x80, 0x03, 0x70, 0x0f
3093 }
3094 };
3095
3096 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3097
3098 ATF_CHECK(bpf_validate(insns, insn_count));
3099
3100 code = bpfjit_generate_code(insns, insn_count);
3101 ATF_REQUIRE(code != NULL);
3102
3103 for (i = 0; i < 2; i++) {
3104 for (j = 1; j < sizeof(pkt[i]); j++)
3105 ATF_CHECK(code(pkt[i], j, j) == 0);
3106 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3107 }
3108
3109 bpfjit_free_code(code);
3110 }
3111
3112 ATF_TC(bpfjit_opt_ld_ind_2);
3113 ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3114 {
3115 atf_tc_set_md_var(tc, "descr",
3116 "Test JIT compilation with length optimization "
3117 "applied to BPF_LD+BPF_IND");
3118 }
3119
3120 ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3121 {
3122 static struct bpf_insn insns[] = {
3123 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3124 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3125 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3126 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3127 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3128 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3129 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3130 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3131 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3132 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3133 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3134 BPF_STMT(BPF_RET+BPF_K, 0),
3135 };
3136
3137 size_t i, j;
3138 bpfjit_function_t code;
3139 uint8_t pkt[2][34] = {
3140 {
3141 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3142 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3143 0x80, 0x03, 0x70, 0x0f,
3144 0x80, 0x03, 0x70, 0x23
3145 },
3146 {
3147 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3148 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3149 0x80, 0x03, 0x70, 0x23,
3150 0x80, 0x03, 0x70, 0x0f
3151 }
3152 };
3153
3154 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3155
3156 ATF_CHECK(bpf_validate(insns, insn_count));
3157
3158 code = bpfjit_generate_code(insns, insn_count);
3159 ATF_REQUIRE(code != NULL);
3160
3161 for (i = 0; i < 2; i++) {
3162 for (j = 1; j < sizeof(pkt[i]); j++)
3163 ATF_CHECK(code(pkt[i], j, j) == 0);
3164 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3165 }
3166
3167 bpfjit_free_code(code);
3168 }
3169
3170 ATF_TC(bpfjit_opt_ld_ind_3);
3171 ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3172 {
3173 atf_tc_set_md_var(tc, "descr",
3174 "Test JIT compilation with length optimization "
3175 "applied to BPF_LD+BPF_IND");
3176 }
3177
3178 ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3179 {
3180 static struct bpf_insn insns[] = {
3181 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3182 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3183 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3184 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3185 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3186 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3187 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3188 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3189 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3190 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3191 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3192 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3193 BPF_STMT(BPF_RET+BPF_K, 0),
3194 };
3195
3196 size_t i, j;
3197 bpfjit_function_t code;
3198 uint8_t pkt[2][34] = {
3199 {
3200 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3201 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3202 0x80, 0x03, 0x70, 0x0f,
3203 0x80, 0x03, 0x70, 0x23
3204 },
3205 {
3206 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3207 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3208 0x80, 0x03, 0x70, 0x23,
3209 0x80, 0x03, 0x70, 0x0f
3210 }
3211 };
3212
3213 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3214
3215 ATF_CHECK(bpf_validate(insns, insn_count));
3216
3217 code = bpfjit_generate_code(insns, insn_count);
3218 ATF_REQUIRE(code != NULL);
3219
3220 for (i = 0; i < 2; i++) {
3221 for (j = 1; j < sizeof(pkt[i]); j++)
3222 ATF_CHECK(code(pkt[i], j, j) == 0);
3223 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3224 }
3225
3226 bpfjit_free_code(code);
3227 }
3228
3229 ATF_TC(bpfjit_opt_ld_ind_4);
3230 ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3231 {
3232 atf_tc_set_md_var(tc, "descr",
3233 "Test JIT compilation with length optimization "
3234 "applied to BPF_LD+BPF_IND");
3235 }
3236
3237 ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3238 {
3239 static struct bpf_insn insns[] = {
3240 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3241 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3242 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3243 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3244 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3245 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3246 BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3247 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3248 BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3249 BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3250 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3251 BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3252 BPF_STMT(BPF_RET+BPF_K, 0),
3253 };
3254
3255 size_t i, j;
3256 bpfjit_function_t code;
3257 uint8_t pkt[2][34] = {
3258 {
3259 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3260 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3261 0x80, 0x03, 0x70, 0x0f,
3262 0x80, 0x03, 0x70, 0x23
3263 },
3264 {
3265 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3266 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3267 0x80, 0x03, 0x70, 0x23,
3268 0x80, 0x03, 0x70, 0x0f
3269 }
3270 };
3271
3272 size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3273
3274 ATF_CHECK(bpf_validate(insns, insn_count));
3275
3276 code = bpfjit_generate_code(insns, insn_count);
3277 ATF_REQUIRE(code != NULL);
3278
3279 for (i = 0; i < 2; i++) {
3280 for (j = 1; j < sizeof(pkt[i]); j++)
3281 ATF_CHECK(code(pkt[i], j, j) == 0);
3282 ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3283 }
3284
3285 bpfjit_free_code(code);
3286 }
3287
3288 ATF_TP_ADD_TCS(tp)
3289 {
3290
3291 ATF_TP_ADD_TC(tp, bpfjit_empty);
3292 ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
3293 ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
3294 ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
3295 ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
3296 ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
3297 ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
3298 ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
3299 ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
3300 ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
3301 ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
3302 ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
3303 ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
3304 ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
3305 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
3306 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
3307 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
3308 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
3309 ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
3310 ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
3311 ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
3312 ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
3313 ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
3314 ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
3315 ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
3316 ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
3317 ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
3318 ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
3319 ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
3320 ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
3321 ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
3322 ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
3323 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
3324 ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
3325 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
3326 ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
3327 ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
3328 ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
3329 ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
3330 ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
3331 ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
3332 ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
3333 ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
3334 ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
3335 ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
3336 ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
3337 ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
3338 ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
3339 ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
3340 ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
3341 ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
3342 ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
3343 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
3344 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
3345 ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
3346 ATF_TP_ADD_TC(tp, bpfjit_ld_len);
3347 ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
3348 ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
3349 ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
3350 ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
3351 ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
3352 ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
3353 ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
3354 ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
3355 ATF_TP_ADD_TC(tp, bpfjit_st1);
3356 ATF_TP_ADD_TC(tp, bpfjit_st2);
3357 ATF_TP_ADD_TC(tp, bpfjit_st3);
3358 ATF_TP_ADD_TC(tp, bpfjit_st4);
3359 ATF_TP_ADD_TC(tp, bpfjit_st5);
3360 ATF_TP_ADD_TC(tp, bpfjit_stx1);
3361 ATF_TP_ADD_TC(tp, bpfjit_stx2);
3362 ATF_TP_ADD_TC(tp, bpfjit_stx3);
3363 ATF_TP_ADD_TC(tp, bpfjit_stx4);
3364 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
3365 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
3366 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
3367 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
3368 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
3369 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
3370 ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
3371 /* XXX: bpfjit_opt_ldx_msh */
3372
3373 return atf_no_error();
3374 }
3375