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