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