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