1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Testsuite for BPF interpreter and BPF JIT compiler 4 * 5 * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com 6 */ 7 8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 9 10 #include <linux/init.h> 11 #include <linux/module.h> 12 #include <linux/filter.h> 13 #include <linux/bpf.h> 14 #include <linux/skbuff.h> 15 #include <linux/netdevice.h> 16 #include <linux/if_vlan.h> 17 #include <linux/random.h> 18 #include <linux/highmem.h> 19 #include <linux/sched.h> 20 21 /* General test specific settings */ 22 #define MAX_SUBTESTS 3 23 #define MAX_TESTRUNS 1000 24 #define MAX_DATA 128 25 #define MAX_INSNS 512 26 #define MAX_K 0xffffFFFF 27 28 /* Few constants used to init test 'skb' */ 29 #define SKB_TYPE 3 30 #define SKB_MARK 0x1234aaaa 31 #define SKB_HASH 0x1234aaab 32 #define SKB_QUEUE_MAP 123 33 #define SKB_VLAN_TCI 0xffff 34 #define SKB_VLAN_PRESENT 1 35 #define SKB_DEV_IFINDEX 577 36 #define SKB_DEV_TYPE 588 37 38 /* Redefine REGs to make tests less verbose */ 39 #define R0 BPF_REG_0 40 #define R1 BPF_REG_1 41 #define R2 BPF_REG_2 42 #define R3 BPF_REG_3 43 #define R4 BPF_REG_4 44 #define R5 BPF_REG_5 45 #define R6 BPF_REG_6 46 #define R7 BPF_REG_7 47 #define R8 BPF_REG_8 48 #define R9 BPF_REG_9 49 #define R10 BPF_REG_10 50 51 /* Flags that can be passed to test cases */ 52 #define FLAG_NO_DATA BIT(0) 53 #define FLAG_EXPECTED_FAIL BIT(1) 54 #define FLAG_SKB_FRAG BIT(2) 55 #define FLAG_VERIFIER_ZEXT BIT(3) 56 57 enum { 58 CLASSIC = BIT(6), /* Old BPF instructions only. */ 59 INTERNAL = BIT(7), /* Extended instruction set. */ 60 }; 61 62 #define TEST_TYPE_MASK (CLASSIC | INTERNAL) 63 64 struct bpf_test { 65 const char *descr; 66 union { 67 struct sock_filter insns[MAX_INSNS]; 68 struct bpf_insn insns_int[MAX_INSNS]; 69 struct { 70 void *insns; 71 unsigned int len; 72 } ptr; 73 } u; 74 __u8 aux; 75 __u8 data[MAX_DATA]; 76 struct { 77 int data_size; 78 __u32 result; 79 } test[MAX_SUBTESTS]; 80 int (*fill_helper)(struct bpf_test *self); 81 int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */ 82 __u8 frag_data[MAX_DATA]; 83 int stack_depth; /* for eBPF only, since tests don't call verifier */ 84 int nr_testruns; /* Custom run count, defaults to MAX_TESTRUNS if 0 */ 85 }; 86 87 /* Large test cases need separate allocation and fill handler. */ 88 89 static int bpf_fill_maxinsns1(struct bpf_test *self) 90 { 91 unsigned int len = BPF_MAXINSNS; 92 struct sock_filter *insn; 93 __u32 k = ~0; 94 int i; 95 96 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 97 if (!insn) 98 return -ENOMEM; 99 100 for (i = 0; i < len; i++, k--) 101 insn[i] = __BPF_STMT(BPF_RET | BPF_K, k); 102 103 self->u.ptr.insns = insn; 104 self->u.ptr.len = len; 105 106 return 0; 107 } 108 109 static int bpf_fill_maxinsns2(struct bpf_test *self) 110 { 111 unsigned int len = BPF_MAXINSNS; 112 struct sock_filter *insn; 113 int i; 114 115 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 116 if (!insn) 117 return -ENOMEM; 118 119 for (i = 0; i < len; i++) 120 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe); 121 122 self->u.ptr.insns = insn; 123 self->u.ptr.len = len; 124 125 return 0; 126 } 127 128 static int bpf_fill_maxinsns3(struct bpf_test *self) 129 { 130 unsigned int len = BPF_MAXINSNS; 131 struct sock_filter *insn; 132 struct rnd_state rnd; 133 int i; 134 135 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 136 if (!insn) 137 return -ENOMEM; 138 139 prandom_seed_state(&rnd, 3141592653589793238ULL); 140 141 for (i = 0; i < len - 1; i++) { 142 __u32 k = prandom_u32_state(&rnd); 143 144 insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k); 145 } 146 147 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0); 148 149 self->u.ptr.insns = insn; 150 self->u.ptr.len = len; 151 152 return 0; 153 } 154 155 static int bpf_fill_maxinsns4(struct bpf_test *self) 156 { 157 unsigned int len = BPF_MAXINSNS + 1; 158 struct sock_filter *insn; 159 int i; 160 161 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 162 if (!insn) 163 return -ENOMEM; 164 165 for (i = 0; i < len; i++) 166 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe); 167 168 self->u.ptr.insns = insn; 169 self->u.ptr.len = len; 170 171 return 0; 172 } 173 174 static int bpf_fill_maxinsns5(struct bpf_test *self) 175 { 176 unsigned int len = BPF_MAXINSNS; 177 struct sock_filter *insn; 178 int i; 179 180 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 181 if (!insn) 182 return -ENOMEM; 183 184 insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0); 185 186 for (i = 1; i < len - 1; i++) 187 insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe); 188 189 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab); 190 191 self->u.ptr.insns = insn; 192 self->u.ptr.len = len; 193 194 return 0; 195 } 196 197 static int bpf_fill_maxinsns6(struct bpf_test *self) 198 { 199 unsigned int len = BPF_MAXINSNS; 200 struct sock_filter *insn; 201 int i; 202 203 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 204 if (!insn) 205 return -ENOMEM; 206 207 for (i = 0; i < len - 1; i++) 208 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF + 209 SKF_AD_VLAN_TAG_PRESENT); 210 211 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0); 212 213 self->u.ptr.insns = insn; 214 self->u.ptr.len = len; 215 216 return 0; 217 } 218 219 static int bpf_fill_maxinsns7(struct bpf_test *self) 220 { 221 unsigned int len = BPF_MAXINSNS; 222 struct sock_filter *insn; 223 int i; 224 225 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 226 if (!insn) 227 return -ENOMEM; 228 229 for (i = 0; i < len - 4; i++) 230 insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF + 231 SKF_AD_CPU); 232 233 insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0); 234 insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF + 235 SKF_AD_CPU); 236 insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0); 237 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0); 238 239 self->u.ptr.insns = insn; 240 self->u.ptr.len = len; 241 242 return 0; 243 } 244 245 static int bpf_fill_maxinsns8(struct bpf_test *self) 246 { 247 unsigned int len = BPF_MAXINSNS; 248 struct sock_filter *insn; 249 int i, jmp_off = len - 3; 250 251 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 252 if (!insn) 253 return -ENOMEM; 254 255 insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff); 256 257 for (i = 1; i < len - 1; i++) 258 insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0); 259 260 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0); 261 262 self->u.ptr.insns = insn; 263 self->u.ptr.len = len; 264 265 return 0; 266 } 267 268 static int bpf_fill_maxinsns9(struct bpf_test *self) 269 { 270 unsigned int len = BPF_MAXINSNS; 271 struct bpf_insn *insn; 272 int i; 273 274 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 275 if (!insn) 276 return -ENOMEM; 277 278 insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2); 279 insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab); 280 insn[2] = BPF_EXIT_INSN(); 281 282 for (i = 3; i < len - 2; i++) 283 insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe); 284 285 insn[len - 2] = BPF_EXIT_INSN(); 286 insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1)); 287 288 self->u.ptr.insns = insn; 289 self->u.ptr.len = len; 290 291 return 0; 292 } 293 294 static int bpf_fill_maxinsns10(struct bpf_test *self) 295 { 296 unsigned int len = BPF_MAXINSNS, hlen = len - 2; 297 struct bpf_insn *insn; 298 int i; 299 300 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 301 if (!insn) 302 return -ENOMEM; 303 304 for (i = 0; i < hlen / 2; i++) 305 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i); 306 for (i = hlen - 1; i > hlen / 2; i--) 307 insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i); 308 309 insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1); 310 insn[hlen] = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac); 311 insn[hlen + 1] = BPF_EXIT_INSN(); 312 313 self->u.ptr.insns = insn; 314 self->u.ptr.len = len; 315 316 return 0; 317 } 318 319 static int __bpf_fill_ja(struct bpf_test *self, unsigned int len, 320 unsigned int plen) 321 { 322 struct sock_filter *insn; 323 unsigned int rlen; 324 int i, j; 325 326 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 327 if (!insn) 328 return -ENOMEM; 329 330 rlen = (len % plen) - 1; 331 332 for (i = 0; i + plen < len; i += plen) 333 for (j = 0; j < plen; j++) 334 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, 335 plen - 1 - j, 0, 0); 336 for (j = 0; j < rlen; j++) 337 insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j, 338 0, 0); 339 340 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac); 341 342 self->u.ptr.insns = insn; 343 self->u.ptr.len = len; 344 345 return 0; 346 } 347 348 static int bpf_fill_maxinsns11(struct bpf_test *self) 349 { 350 /* Hits 70 passes on x86_64 and triggers NOPs padding. */ 351 return __bpf_fill_ja(self, BPF_MAXINSNS, 68); 352 } 353 354 static int bpf_fill_maxinsns12(struct bpf_test *self) 355 { 356 unsigned int len = BPF_MAXINSNS; 357 struct sock_filter *insn; 358 int i = 0; 359 360 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 361 if (!insn) 362 return -ENOMEM; 363 364 insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0); 365 366 for (i = 1; i < len - 1; i++) 367 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0); 368 369 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab); 370 371 self->u.ptr.insns = insn; 372 self->u.ptr.len = len; 373 374 return 0; 375 } 376 377 static int bpf_fill_maxinsns13(struct bpf_test *self) 378 { 379 unsigned int len = BPF_MAXINSNS; 380 struct sock_filter *insn; 381 int i = 0; 382 383 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 384 if (!insn) 385 return -ENOMEM; 386 387 for (i = 0; i < len - 3; i++) 388 insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0); 389 390 insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab); 391 insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0); 392 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0); 393 394 self->u.ptr.insns = insn; 395 self->u.ptr.len = len; 396 397 return 0; 398 } 399 400 static int bpf_fill_ja(struct bpf_test *self) 401 { 402 /* Hits exactly 11 passes on x86_64 JIT. */ 403 return __bpf_fill_ja(self, 12, 9); 404 } 405 406 static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self) 407 { 408 unsigned int len = BPF_MAXINSNS; 409 struct sock_filter *insn; 410 int i; 411 412 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 413 if (!insn) 414 return -ENOMEM; 415 416 for (i = 0; i < len - 1; i += 2) { 417 insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0); 418 insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 419 SKF_AD_OFF + SKF_AD_CPU); 420 } 421 422 insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee); 423 424 self->u.ptr.insns = insn; 425 self->u.ptr.len = len; 426 427 return 0; 428 } 429 430 static int __bpf_fill_stxdw(struct bpf_test *self, int size) 431 { 432 unsigned int len = BPF_MAXINSNS; 433 struct bpf_insn *insn; 434 int i; 435 436 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 437 if (!insn) 438 return -ENOMEM; 439 440 insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1); 441 insn[1] = BPF_ST_MEM(size, R10, -40, 42); 442 443 for (i = 2; i < len - 2; i++) 444 insn[i] = BPF_STX_XADD(size, R10, R0, -40); 445 446 insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40); 447 insn[len - 1] = BPF_EXIT_INSN(); 448 449 self->u.ptr.insns = insn; 450 self->u.ptr.len = len; 451 self->stack_depth = 40; 452 453 return 0; 454 } 455 456 static int bpf_fill_stxw(struct bpf_test *self) 457 { 458 return __bpf_fill_stxdw(self, BPF_W); 459 } 460 461 static int bpf_fill_stxdw(struct bpf_test *self) 462 { 463 return __bpf_fill_stxdw(self, BPF_DW); 464 } 465 466 static int __bpf_ld_imm64(struct bpf_insn insns[2], u8 reg, s64 imm64) 467 { 468 struct bpf_insn tmp[] = {BPF_LD_IMM64(reg, imm64)}; 469 470 memcpy(insns, tmp, sizeof(tmp)); 471 return 2; 472 } 473 474 /* 475 * Branch conversion tests. Complex operations can expand to a lot 476 * of instructions when JITed. This in turn may cause jump offsets 477 * to overflow the field size of the native instruction, triggering 478 * a branch conversion mechanism in some JITs. 479 */ 480 static int __bpf_fill_max_jmp(struct bpf_test *self, int jmp, int imm) 481 { 482 struct bpf_insn *insns; 483 int len = S16_MAX + 5; 484 int i; 485 486 insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL); 487 if (!insns) 488 return -ENOMEM; 489 490 i = __bpf_ld_imm64(insns, R1, 0x0123456789abcdefULL); 491 insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1); 492 insns[i++] = BPF_JMP_IMM(jmp, R0, imm, S16_MAX); 493 insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 2); 494 insns[i++] = BPF_EXIT_INSN(); 495 496 while (i < len - 1) { 497 static const int ops[] = { 498 BPF_LSH, BPF_RSH, BPF_ARSH, BPF_ADD, 499 BPF_SUB, BPF_MUL, BPF_DIV, BPF_MOD, 500 }; 501 int op = ops[(i >> 1) % ARRAY_SIZE(ops)]; 502 503 if (i & 1) 504 insns[i++] = BPF_ALU32_REG(op, R0, R1); 505 else 506 insns[i++] = BPF_ALU64_REG(op, R0, R1); 507 } 508 509 insns[i++] = BPF_EXIT_INSN(); 510 self->u.ptr.insns = insns; 511 self->u.ptr.len = len; 512 BUG_ON(i != len); 513 514 return 0; 515 } 516 517 /* Branch taken by runtime decision */ 518 static int bpf_fill_max_jmp_taken(struct bpf_test *self) 519 { 520 return __bpf_fill_max_jmp(self, BPF_JEQ, 1); 521 } 522 523 /* Branch not taken by runtime decision */ 524 static int bpf_fill_max_jmp_not_taken(struct bpf_test *self) 525 { 526 return __bpf_fill_max_jmp(self, BPF_JEQ, 0); 527 } 528 529 /* Branch always taken, known at JIT time */ 530 static int bpf_fill_max_jmp_always_taken(struct bpf_test *self) 531 { 532 return __bpf_fill_max_jmp(self, BPF_JGE, 0); 533 } 534 535 /* Branch never taken, known at JIT time */ 536 static int bpf_fill_max_jmp_never_taken(struct bpf_test *self) 537 { 538 return __bpf_fill_max_jmp(self, BPF_JLT, 0); 539 } 540 541 /* ALU result computation used in tests */ 542 static bool __bpf_alu_result(u64 *res, u64 v1, u64 v2, u8 op) 543 { 544 *res = 0; 545 switch (op) { 546 case BPF_MOV: 547 *res = v2; 548 break; 549 case BPF_AND: 550 *res = v1 & v2; 551 break; 552 case BPF_OR: 553 *res = v1 | v2; 554 break; 555 case BPF_XOR: 556 *res = v1 ^ v2; 557 break; 558 case BPF_LSH: 559 *res = v1 << v2; 560 break; 561 case BPF_RSH: 562 *res = v1 >> v2; 563 break; 564 case BPF_ARSH: 565 *res = v1 >> v2; 566 if (v2 > 0 && v1 > S64_MAX) 567 *res |= ~0ULL << (64 - v2); 568 break; 569 case BPF_ADD: 570 *res = v1 + v2; 571 break; 572 case BPF_SUB: 573 *res = v1 - v2; 574 break; 575 case BPF_MUL: 576 *res = v1 * v2; 577 break; 578 case BPF_DIV: 579 if (v2 == 0) 580 return false; 581 *res = div64_u64(v1, v2); 582 break; 583 case BPF_MOD: 584 if (v2 == 0) 585 return false; 586 div64_u64_rem(v1, v2, res); 587 break; 588 } 589 return true; 590 } 591 592 /* Test an ALU shift operation for all valid shift values */ 593 static int __bpf_fill_alu_shift(struct bpf_test *self, u8 op, 594 u8 mode, bool alu32) 595 { 596 static const s64 regs[] = { 597 0x0123456789abcdefLL, /* dword > 0, word < 0 */ 598 0xfedcba9876543210LL, /* dowrd < 0, word > 0 */ 599 0xfedcba0198765432LL, /* dowrd < 0, word < 0 */ 600 0x0123458967abcdefLL, /* dword > 0, word > 0 */ 601 }; 602 int bits = alu32 ? 32 : 64; 603 int len = (2 + 7 * bits) * ARRAY_SIZE(regs) + 3; 604 struct bpf_insn *insn; 605 int imm, k; 606 int i = 0; 607 608 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 609 if (!insn) 610 return -ENOMEM; 611 612 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0); 613 614 for (k = 0; k < ARRAY_SIZE(regs); k++) { 615 s64 reg = regs[k]; 616 617 i += __bpf_ld_imm64(&insn[i], R3, reg); 618 619 for (imm = 0; imm < bits; imm++) { 620 u64 val; 621 622 /* Perform operation */ 623 insn[i++] = BPF_ALU64_REG(BPF_MOV, R1, R3); 624 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R2, imm); 625 if (alu32) { 626 if (mode == BPF_K) 627 insn[i++] = BPF_ALU32_IMM(op, R1, imm); 628 else 629 insn[i++] = BPF_ALU32_REG(op, R1, R2); 630 631 if (op == BPF_ARSH) 632 reg = (s32)reg; 633 else 634 reg = (u32)reg; 635 __bpf_alu_result(&val, reg, imm, op); 636 val = (u32)val; 637 } else { 638 if (mode == BPF_K) 639 insn[i++] = BPF_ALU64_IMM(op, R1, imm); 640 else 641 insn[i++] = BPF_ALU64_REG(op, R1, R2); 642 __bpf_alu_result(&val, reg, imm, op); 643 } 644 645 /* 646 * When debugging a JIT that fails this test, one 647 * can write the immediate value to R0 here to find 648 * out which operand values that fail. 649 */ 650 651 /* Load reference and check the result */ 652 i += __bpf_ld_imm64(&insn[i], R4, val); 653 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R4, 1); 654 insn[i++] = BPF_EXIT_INSN(); 655 } 656 } 657 658 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1); 659 insn[i++] = BPF_EXIT_INSN(); 660 661 self->u.ptr.insns = insn; 662 self->u.ptr.len = len; 663 BUG_ON(i != len); 664 665 return 0; 666 } 667 668 static int bpf_fill_alu64_lsh_imm(struct bpf_test *self) 669 { 670 return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, false); 671 } 672 673 static int bpf_fill_alu64_rsh_imm(struct bpf_test *self) 674 { 675 return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, false); 676 } 677 678 static int bpf_fill_alu64_arsh_imm(struct bpf_test *self) 679 { 680 return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, false); 681 } 682 683 static int bpf_fill_alu64_lsh_reg(struct bpf_test *self) 684 { 685 return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, false); 686 } 687 688 static int bpf_fill_alu64_rsh_reg(struct bpf_test *self) 689 { 690 return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, false); 691 } 692 693 static int bpf_fill_alu64_arsh_reg(struct bpf_test *self) 694 { 695 return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, false); 696 } 697 698 static int bpf_fill_alu32_lsh_imm(struct bpf_test *self) 699 { 700 return __bpf_fill_alu_shift(self, BPF_LSH, BPF_K, true); 701 } 702 703 static int bpf_fill_alu32_rsh_imm(struct bpf_test *self) 704 { 705 return __bpf_fill_alu_shift(self, BPF_RSH, BPF_K, true); 706 } 707 708 static int bpf_fill_alu32_arsh_imm(struct bpf_test *self) 709 { 710 return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_K, true); 711 } 712 713 static int bpf_fill_alu32_lsh_reg(struct bpf_test *self) 714 { 715 return __bpf_fill_alu_shift(self, BPF_LSH, BPF_X, true); 716 } 717 718 static int bpf_fill_alu32_rsh_reg(struct bpf_test *self) 719 { 720 return __bpf_fill_alu_shift(self, BPF_RSH, BPF_X, true); 721 } 722 723 static int bpf_fill_alu32_arsh_reg(struct bpf_test *self) 724 { 725 return __bpf_fill_alu_shift(self, BPF_ARSH, BPF_X, true); 726 } 727 728 /* 729 * Test an ALU register shift operation for all valid shift values 730 * for the case when the source and destination are the same. 731 */ 732 static int __bpf_fill_alu_shift_same_reg(struct bpf_test *self, u8 op, 733 bool alu32) 734 { 735 int bits = alu32 ? 32 : 64; 736 int len = 3 + 6 * bits; 737 struct bpf_insn *insn; 738 int i = 0; 739 u64 val; 740 741 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 742 if (!insn) 743 return -ENOMEM; 744 745 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0); 746 747 for (val = 0; val < bits; val++) { 748 u64 res; 749 750 /* Perform operation */ 751 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R1, val); 752 if (alu32) 753 insn[i++] = BPF_ALU32_REG(op, R1, R1); 754 else 755 insn[i++] = BPF_ALU64_REG(op, R1, R1); 756 757 /* Compute the reference result */ 758 __bpf_alu_result(&res, val, val, op); 759 if (alu32) 760 res = (u32)res; 761 i += __bpf_ld_imm64(&insn[i], R2, res); 762 763 /* Check the actual result */ 764 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1); 765 insn[i++] = BPF_EXIT_INSN(); 766 } 767 768 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1); 769 insn[i++] = BPF_EXIT_INSN(); 770 771 self->u.ptr.insns = insn; 772 self->u.ptr.len = len; 773 BUG_ON(i != len); 774 775 return 0; 776 } 777 778 static int bpf_fill_alu64_lsh_same_reg(struct bpf_test *self) 779 { 780 return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, false); 781 } 782 783 static int bpf_fill_alu64_rsh_same_reg(struct bpf_test *self) 784 { 785 return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, false); 786 } 787 788 static int bpf_fill_alu64_arsh_same_reg(struct bpf_test *self) 789 { 790 return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, false); 791 } 792 793 static int bpf_fill_alu32_lsh_same_reg(struct bpf_test *self) 794 { 795 return __bpf_fill_alu_shift_same_reg(self, BPF_LSH, true); 796 } 797 798 static int bpf_fill_alu32_rsh_same_reg(struct bpf_test *self) 799 { 800 return __bpf_fill_alu_shift_same_reg(self, BPF_RSH, true); 801 } 802 803 static int bpf_fill_alu32_arsh_same_reg(struct bpf_test *self) 804 { 805 return __bpf_fill_alu_shift_same_reg(self, BPF_ARSH, true); 806 } 807 808 /* 809 * Common operand pattern generator for exhaustive power-of-two magnitudes 810 * tests. The block size parameters can be adjusted to increase/reduce the 811 * number of combinatons tested and thereby execution speed and memory 812 * footprint. 813 */ 814 815 static inline s64 value(int msb, int delta, int sign) 816 { 817 return sign * (1LL << msb) + delta; 818 } 819 820 static int __bpf_fill_pattern(struct bpf_test *self, void *arg, 821 int dbits, int sbits, int block1, int block2, 822 int (*emit)(struct bpf_test*, void*, 823 struct bpf_insn*, s64, s64)) 824 { 825 static const int sgn[][2] = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}}; 826 struct bpf_insn *insns; 827 int di, si, bt, db, sb; 828 int count, len, k; 829 int extra = 1 + 2; 830 int i = 0; 831 832 /* Total number of iterations for the two pattern */ 833 count = (dbits - 1) * (sbits - 1) * block1 * block1 * ARRAY_SIZE(sgn); 834 count += (max(dbits, sbits) - 1) * block2 * block2 * ARRAY_SIZE(sgn); 835 836 /* Compute the maximum number of insns and allocate the buffer */ 837 len = extra + count * (*emit)(self, arg, NULL, 0, 0); 838 insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL); 839 if (!insns) 840 return -ENOMEM; 841 842 /* Add head instruction(s) */ 843 insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0); 844 845 /* 846 * Pattern 1: all combinations of power-of-two magnitudes and sign, 847 * and with a block of contiguous values around each magnitude. 848 */ 849 for (di = 0; di < dbits - 1; di++) /* Dst magnitudes */ 850 for (si = 0; si < sbits - 1; si++) /* Src magnitudes */ 851 for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */ 852 for (db = -(block1 / 2); 853 db < (block1 + 1) / 2; db++) 854 for (sb = -(block1 / 2); 855 sb < (block1 + 1) / 2; sb++) { 856 s64 dst, src; 857 858 dst = value(di, db, sgn[k][0]); 859 src = value(si, sb, sgn[k][1]); 860 i += (*emit)(self, arg, 861 &insns[i], 862 dst, src); 863 } 864 /* 865 * Pattern 2: all combinations for a larger block of values 866 * for each power-of-two magnitude and sign, where the magnitude is 867 * the same for both operands. 868 */ 869 for (bt = 0; bt < max(dbits, sbits) - 1; bt++) /* Magnitude */ 870 for (k = 0; k < ARRAY_SIZE(sgn); k++) /* Sign combos */ 871 for (db = -(block2 / 2); db < (block2 + 1) / 2; db++) 872 for (sb = -(block2 / 2); 873 sb < (block2 + 1) / 2; sb++) { 874 s64 dst, src; 875 876 dst = value(bt % dbits, db, sgn[k][0]); 877 src = value(bt % sbits, sb, sgn[k][1]); 878 i += (*emit)(self, arg, &insns[i], 879 dst, src); 880 } 881 882 /* Append tail instructions */ 883 insns[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1); 884 insns[i++] = BPF_EXIT_INSN(); 885 BUG_ON(i > len); 886 887 self->u.ptr.insns = insns; 888 self->u.ptr.len = i; 889 890 return 0; 891 } 892 893 /* 894 * Block size parameters used in pattern tests below. une as needed to 895 * increase/reduce the number combinations tested, see following examples. 896 * block values per operand MSB 897 * ---------------------------------------- 898 * 0 none 899 * 1 (1 << MSB) 900 * 2 (1 << MSB) + [-1, 0] 901 * 3 (1 << MSB) + [-1, 0, 1] 902 */ 903 #define PATTERN_BLOCK1 1 904 #define PATTERN_BLOCK2 5 905 906 /* Number of test runs for a pattern test */ 907 #define NR_PATTERN_RUNS 1 908 909 /* 910 * Exhaustive tests of ALU operations for all combinations of power-of-two 911 * magnitudes of the operands, both for positive and negative values. The 912 * test is designed to verify e.g. the ALU and ALU64 operations for JITs that 913 * emit different code depending on the magnitude of the immediate value. 914 */ 915 static int __bpf_emit_alu64_imm(struct bpf_test *self, void *arg, 916 struct bpf_insn *insns, s64 dst, s64 imm) 917 { 918 int op = *(int *)arg; 919 int i = 0; 920 u64 res; 921 922 if (!insns) 923 return 7; 924 925 if (__bpf_alu_result(&res, dst, (s32)imm, op)) { 926 i += __bpf_ld_imm64(&insns[i], R1, dst); 927 i += __bpf_ld_imm64(&insns[i], R3, res); 928 insns[i++] = BPF_ALU64_IMM(op, R1, imm); 929 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 930 insns[i++] = BPF_EXIT_INSN(); 931 } 932 933 return i; 934 } 935 936 static int __bpf_emit_alu32_imm(struct bpf_test *self, void *arg, 937 struct bpf_insn *insns, s64 dst, s64 imm) 938 { 939 int op = *(int *)arg; 940 int i = 0; 941 u64 res; 942 943 if (!insns) 944 return 7; 945 946 if (__bpf_alu_result(&res, (u32)dst, (u32)imm, op)) { 947 i += __bpf_ld_imm64(&insns[i], R1, dst); 948 i += __bpf_ld_imm64(&insns[i], R3, (u32)res); 949 insns[i++] = BPF_ALU32_IMM(op, R1, imm); 950 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 951 insns[i++] = BPF_EXIT_INSN(); 952 } 953 954 return i; 955 } 956 957 static int __bpf_emit_alu64_reg(struct bpf_test *self, void *arg, 958 struct bpf_insn *insns, s64 dst, s64 src) 959 { 960 int op = *(int *)arg; 961 int i = 0; 962 u64 res; 963 964 if (!insns) 965 return 9; 966 967 if (__bpf_alu_result(&res, dst, src, op)) { 968 i += __bpf_ld_imm64(&insns[i], R1, dst); 969 i += __bpf_ld_imm64(&insns[i], R2, src); 970 i += __bpf_ld_imm64(&insns[i], R3, res); 971 insns[i++] = BPF_ALU64_REG(op, R1, R2); 972 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 973 insns[i++] = BPF_EXIT_INSN(); 974 } 975 976 return i; 977 } 978 979 static int __bpf_emit_alu32_reg(struct bpf_test *self, void *arg, 980 struct bpf_insn *insns, s64 dst, s64 src) 981 { 982 int op = *(int *)arg; 983 int i = 0; 984 u64 res; 985 986 if (!insns) 987 return 9; 988 989 if (__bpf_alu_result(&res, (u32)dst, (u32)src, op)) { 990 i += __bpf_ld_imm64(&insns[i], R1, dst); 991 i += __bpf_ld_imm64(&insns[i], R2, src); 992 i += __bpf_ld_imm64(&insns[i], R3, (u32)res); 993 insns[i++] = BPF_ALU32_REG(op, R1, R2); 994 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 995 insns[i++] = BPF_EXIT_INSN(); 996 } 997 998 return i; 999 } 1000 1001 static int __bpf_fill_alu64_imm(struct bpf_test *self, int op) 1002 { 1003 return __bpf_fill_pattern(self, &op, 64, 32, 1004 PATTERN_BLOCK1, PATTERN_BLOCK2, 1005 &__bpf_emit_alu64_imm); 1006 } 1007 1008 static int __bpf_fill_alu32_imm(struct bpf_test *self, int op) 1009 { 1010 return __bpf_fill_pattern(self, &op, 64, 32, 1011 PATTERN_BLOCK1, PATTERN_BLOCK2, 1012 &__bpf_emit_alu32_imm); 1013 } 1014 1015 static int __bpf_fill_alu64_reg(struct bpf_test *self, int op) 1016 { 1017 return __bpf_fill_pattern(self, &op, 64, 64, 1018 PATTERN_BLOCK1, PATTERN_BLOCK2, 1019 &__bpf_emit_alu64_reg); 1020 } 1021 1022 static int __bpf_fill_alu32_reg(struct bpf_test *self, int op) 1023 { 1024 return __bpf_fill_pattern(self, &op, 64, 64, 1025 PATTERN_BLOCK1, PATTERN_BLOCK2, 1026 &__bpf_emit_alu32_reg); 1027 } 1028 1029 /* ALU64 immediate operations */ 1030 static int bpf_fill_alu64_mov_imm(struct bpf_test *self) 1031 { 1032 return __bpf_fill_alu64_imm(self, BPF_MOV); 1033 } 1034 1035 static int bpf_fill_alu64_and_imm(struct bpf_test *self) 1036 { 1037 return __bpf_fill_alu64_imm(self, BPF_AND); 1038 } 1039 1040 static int bpf_fill_alu64_or_imm(struct bpf_test *self) 1041 { 1042 return __bpf_fill_alu64_imm(self, BPF_OR); 1043 } 1044 1045 static int bpf_fill_alu64_xor_imm(struct bpf_test *self) 1046 { 1047 return __bpf_fill_alu64_imm(self, BPF_XOR); 1048 } 1049 1050 static int bpf_fill_alu64_add_imm(struct bpf_test *self) 1051 { 1052 return __bpf_fill_alu64_imm(self, BPF_ADD); 1053 } 1054 1055 static int bpf_fill_alu64_sub_imm(struct bpf_test *self) 1056 { 1057 return __bpf_fill_alu64_imm(self, BPF_SUB); 1058 } 1059 1060 static int bpf_fill_alu64_mul_imm(struct bpf_test *self) 1061 { 1062 return __bpf_fill_alu64_imm(self, BPF_MUL); 1063 } 1064 1065 static int bpf_fill_alu64_div_imm(struct bpf_test *self) 1066 { 1067 return __bpf_fill_alu64_imm(self, BPF_DIV); 1068 } 1069 1070 static int bpf_fill_alu64_mod_imm(struct bpf_test *self) 1071 { 1072 return __bpf_fill_alu64_imm(self, BPF_MOD); 1073 } 1074 1075 /* ALU32 immediate operations */ 1076 static int bpf_fill_alu32_mov_imm(struct bpf_test *self) 1077 { 1078 return __bpf_fill_alu32_imm(self, BPF_MOV); 1079 } 1080 1081 static int bpf_fill_alu32_and_imm(struct bpf_test *self) 1082 { 1083 return __bpf_fill_alu32_imm(self, BPF_AND); 1084 } 1085 1086 static int bpf_fill_alu32_or_imm(struct bpf_test *self) 1087 { 1088 return __bpf_fill_alu32_imm(self, BPF_OR); 1089 } 1090 1091 static int bpf_fill_alu32_xor_imm(struct bpf_test *self) 1092 { 1093 return __bpf_fill_alu32_imm(self, BPF_XOR); 1094 } 1095 1096 static int bpf_fill_alu32_add_imm(struct bpf_test *self) 1097 { 1098 return __bpf_fill_alu32_imm(self, BPF_ADD); 1099 } 1100 1101 static int bpf_fill_alu32_sub_imm(struct bpf_test *self) 1102 { 1103 return __bpf_fill_alu32_imm(self, BPF_SUB); 1104 } 1105 1106 static int bpf_fill_alu32_mul_imm(struct bpf_test *self) 1107 { 1108 return __bpf_fill_alu32_imm(self, BPF_MUL); 1109 } 1110 1111 static int bpf_fill_alu32_div_imm(struct bpf_test *self) 1112 { 1113 return __bpf_fill_alu32_imm(self, BPF_DIV); 1114 } 1115 1116 static int bpf_fill_alu32_mod_imm(struct bpf_test *self) 1117 { 1118 return __bpf_fill_alu32_imm(self, BPF_MOD); 1119 } 1120 1121 /* ALU64 register operations */ 1122 static int bpf_fill_alu64_mov_reg(struct bpf_test *self) 1123 { 1124 return __bpf_fill_alu64_reg(self, BPF_MOV); 1125 } 1126 1127 static int bpf_fill_alu64_and_reg(struct bpf_test *self) 1128 { 1129 return __bpf_fill_alu64_reg(self, BPF_AND); 1130 } 1131 1132 static int bpf_fill_alu64_or_reg(struct bpf_test *self) 1133 { 1134 return __bpf_fill_alu64_reg(self, BPF_OR); 1135 } 1136 1137 static int bpf_fill_alu64_xor_reg(struct bpf_test *self) 1138 { 1139 return __bpf_fill_alu64_reg(self, BPF_XOR); 1140 } 1141 1142 static int bpf_fill_alu64_add_reg(struct bpf_test *self) 1143 { 1144 return __bpf_fill_alu64_reg(self, BPF_ADD); 1145 } 1146 1147 static int bpf_fill_alu64_sub_reg(struct bpf_test *self) 1148 { 1149 return __bpf_fill_alu64_reg(self, BPF_SUB); 1150 } 1151 1152 static int bpf_fill_alu64_mul_reg(struct bpf_test *self) 1153 { 1154 return __bpf_fill_alu64_reg(self, BPF_MUL); 1155 } 1156 1157 static int bpf_fill_alu64_div_reg(struct bpf_test *self) 1158 { 1159 return __bpf_fill_alu64_reg(self, BPF_DIV); 1160 } 1161 1162 static int bpf_fill_alu64_mod_reg(struct bpf_test *self) 1163 { 1164 return __bpf_fill_alu64_reg(self, BPF_MOD); 1165 } 1166 1167 /* ALU32 register operations */ 1168 static int bpf_fill_alu32_mov_reg(struct bpf_test *self) 1169 { 1170 return __bpf_fill_alu32_reg(self, BPF_MOV); 1171 } 1172 1173 static int bpf_fill_alu32_and_reg(struct bpf_test *self) 1174 { 1175 return __bpf_fill_alu32_reg(self, BPF_AND); 1176 } 1177 1178 static int bpf_fill_alu32_or_reg(struct bpf_test *self) 1179 { 1180 return __bpf_fill_alu32_reg(self, BPF_OR); 1181 } 1182 1183 static int bpf_fill_alu32_xor_reg(struct bpf_test *self) 1184 { 1185 return __bpf_fill_alu32_reg(self, BPF_XOR); 1186 } 1187 1188 static int bpf_fill_alu32_add_reg(struct bpf_test *self) 1189 { 1190 return __bpf_fill_alu32_reg(self, BPF_ADD); 1191 } 1192 1193 static int bpf_fill_alu32_sub_reg(struct bpf_test *self) 1194 { 1195 return __bpf_fill_alu32_reg(self, BPF_SUB); 1196 } 1197 1198 static int bpf_fill_alu32_mul_reg(struct bpf_test *self) 1199 { 1200 return __bpf_fill_alu32_reg(self, BPF_MUL); 1201 } 1202 1203 static int bpf_fill_alu32_div_reg(struct bpf_test *self) 1204 { 1205 return __bpf_fill_alu32_reg(self, BPF_DIV); 1206 } 1207 1208 static int bpf_fill_alu32_mod_reg(struct bpf_test *self) 1209 { 1210 return __bpf_fill_alu32_reg(self, BPF_MOD); 1211 } 1212 1213 /* 1214 * Test JITs that implement complex ALU operations as function 1215 * calls, and must re-arrange operands for argument passing. 1216 */ 1217 static int __bpf_fill_alu_imm_regs(struct bpf_test *self, u8 op, bool alu32) 1218 { 1219 int len = 2 + 10 * 10; 1220 struct bpf_insn *insns; 1221 u64 dst, res; 1222 int i = 0; 1223 u32 imm; 1224 int rd; 1225 1226 insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL); 1227 if (!insns) 1228 return -ENOMEM; 1229 1230 /* Operand and result values according to operation */ 1231 if (alu32) 1232 dst = 0x76543210U; 1233 else 1234 dst = 0x7edcba9876543210ULL; 1235 imm = 0x01234567U; 1236 1237 if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH) 1238 imm &= 31; 1239 1240 __bpf_alu_result(&res, dst, imm, op); 1241 1242 if (alu32) 1243 res = (u32)res; 1244 1245 /* Check all operand registers */ 1246 for (rd = R0; rd <= R9; rd++) { 1247 i += __bpf_ld_imm64(&insns[i], rd, dst); 1248 1249 if (alu32) 1250 insns[i++] = BPF_ALU32_IMM(op, rd, imm); 1251 else 1252 insns[i++] = BPF_ALU64_IMM(op, rd, imm); 1253 1254 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res, 2); 1255 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1256 insns[i++] = BPF_EXIT_INSN(); 1257 1258 insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32); 1259 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, res >> 32, 2); 1260 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1261 insns[i++] = BPF_EXIT_INSN(); 1262 } 1263 1264 insns[i++] = BPF_MOV64_IMM(R0, 1); 1265 insns[i++] = BPF_EXIT_INSN(); 1266 1267 self->u.ptr.insns = insns; 1268 self->u.ptr.len = len; 1269 BUG_ON(i != len); 1270 1271 return 0; 1272 } 1273 1274 /* ALU64 K registers */ 1275 static int bpf_fill_alu64_mov_imm_regs(struct bpf_test *self) 1276 { 1277 return __bpf_fill_alu_imm_regs(self, BPF_MOV, false); 1278 } 1279 1280 static int bpf_fill_alu64_and_imm_regs(struct bpf_test *self) 1281 { 1282 return __bpf_fill_alu_imm_regs(self, BPF_AND, false); 1283 } 1284 1285 static int bpf_fill_alu64_or_imm_regs(struct bpf_test *self) 1286 { 1287 return __bpf_fill_alu_imm_regs(self, BPF_OR, false); 1288 } 1289 1290 static int bpf_fill_alu64_xor_imm_regs(struct bpf_test *self) 1291 { 1292 return __bpf_fill_alu_imm_regs(self, BPF_XOR, false); 1293 } 1294 1295 static int bpf_fill_alu64_lsh_imm_regs(struct bpf_test *self) 1296 { 1297 return __bpf_fill_alu_imm_regs(self, BPF_LSH, false); 1298 } 1299 1300 static int bpf_fill_alu64_rsh_imm_regs(struct bpf_test *self) 1301 { 1302 return __bpf_fill_alu_imm_regs(self, BPF_RSH, false); 1303 } 1304 1305 static int bpf_fill_alu64_arsh_imm_regs(struct bpf_test *self) 1306 { 1307 return __bpf_fill_alu_imm_regs(self, BPF_ARSH, false); 1308 } 1309 1310 static int bpf_fill_alu64_add_imm_regs(struct bpf_test *self) 1311 { 1312 return __bpf_fill_alu_imm_regs(self, BPF_ADD, false); 1313 } 1314 1315 static int bpf_fill_alu64_sub_imm_regs(struct bpf_test *self) 1316 { 1317 return __bpf_fill_alu_imm_regs(self, BPF_SUB, false); 1318 } 1319 1320 static int bpf_fill_alu64_mul_imm_regs(struct bpf_test *self) 1321 { 1322 return __bpf_fill_alu_imm_regs(self, BPF_MUL, false); 1323 } 1324 1325 static int bpf_fill_alu64_div_imm_regs(struct bpf_test *self) 1326 { 1327 return __bpf_fill_alu_imm_regs(self, BPF_DIV, false); 1328 } 1329 1330 static int bpf_fill_alu64_mod_imm_regs(struct bpf_test *self) 1331 { 1332 return __bpf_fill_alu_imm_regs(self, BPF_MOD, false); 1333 } 1334 1335 /* ALU32 K registers */ 1336 static int bpf_fill_alu32_mov_imm_regs(struct bpf_test *self) 1337 { 1338 return __bpf_fill_alu_imm_regs(self, BPF_MOV, true); 1339 } 1340 1341 static int bpf_fill_alu32_and_imm_regs(struct bpf_test *self) 1342 { 1343 return __bpf_fill_alu_imm_regs(self, BPF_AND, true); 1344 } 1345 1346 static int bpf_fill_alu32_or_imm_regs(struct bpf_test *self) 1347 { 1348 return __bpf_fill_alu_imm_regs(self, BPF_OR, true); 1349 } 1350 1351 static int bpf_fill_alu32_xor_imm_regs(struct bpf_test *self) 1352 { 1353 return __bpf_fill_alu_imm_regs(self, BPF_XOR, true); 1354 } 1355 1356 static int bpf_fill_alu32_lsh_imm_regs(struct bpf_test *self) 1357 { 1358 return __bpf_fill_alu_imm_regs(self, BPF_LSH, true); 1359 } 1360 1361 static int bpf_fill_alu32_rsh_imm_regs(struct bpf_test *self) 1362 { 1363 return __bpf_fill_alu_imm_regs(self, BPF_RSH, true); 1364 } 1365 1366 static int bpf_fill_alu32_arsh_imm_regs(struct bpf_test *self) 1367 { 1368 return __bpf_fill_alu_imm_regs(self, BPF_ARSH, true); 1369 } 1370 1371 static int bpf_fill_alu32_add_imm_regs(struct bpf_test *self) 1372 { 1373 return __bpf_fill_alu_imm_regs(self, BPF_ADD, true); 1374 } 1375 1376 static int bpf_fill_alu32_sub_imm_regs(struct bpf_test *self) 1377 { 1378 return __bpf_fill_alu_imm_regs(self, BPF_SUB, true); 1379 } 1380 1381 static int bpf_fill_alu32_mul_imm_regs(struct bpf_test *self) 1382 { 1383 return __bpf_fill_alu_imm_regs(self, BPF_MUL, true); 1384 } 1385 1386 static int bpf_fill_alu32_div_imm_regs(struct bpf_test *self) 1387 { 1388 return __bpf_fill_alu_imm_regs(self, BPF_DIV, true); 1389 } 1390 1391 static int bpf_fill_alu32_mod_imm_regs(struct bpf_test *self) 1392 { 1393 return __bpf_fill_alu_imm_regs(self, BPF_MOD, true); 1394 } 1395 1396 /* 1397 * Test JITs that implement complex ALU operations as function 1398 * calls, and must re-arrange operands for argument passing. 1399 */ 1400 static int __bpf_fill_alu_reg_pairs(struct bpf_test *self, u8 op, bool alu32) 1401 { 1402 int len = 2 + 10 * 10 * 12; 1403 u64 dst, src, res, same; 1404 struct bpf_insn *insns; 1405 int rd, rs; 1406 int i = 0; 1407 1408 insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL); 1409 if (!insns) 1410 return -ENOMEM; 1411 1412 /* Operand and result values according to operation */ 1413 if (alu32) { 1414 dst = 0x76543210U; 1415 src = 0x01234567U; 1416 } else { 1417 dst = 0x7edcba9876543210ULL; 1418 src = 0x0123456789abcdefULL; 1419 } 1420 1421 if (op == BPF_LSH || op == BPF_RSH || op == BPF_ARSH) 1422 src &= 31; 1423 1424 __bpf_alu_result(&res, dst, src, op); 1425 __bpf_alu_result(&same, src, src, op); 1426 1427 if (alu32) { 1428 res = (u32)res; 1429 same = (u32)same; 1430 } 1431 1432 /* Check all combinations of operand registers */ 1433 for (rd = R0; rd <= R9; rd++) { 1434 for (rs = R0; rs <= R9; rs++) { 1435 u64 val = rd == rs ? same : res; 1436 1437 i += __bpf_ld_imm64(&insns[i], rd, dst); 1438 i += __bpf_ld_imm64(&insns[i], rs, src); 1439 1440 if (alu32) 1441 insns[i++] = BPF_ALU32_REG(op, rd, rs); 1442 else 1443 insns[i++] = BPF_ALU64_REG(op, rd, rs); 1444 1445 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val, 2); 1446 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1447 insns[i++] = BPF_EXIT_INSN(); 1448 1449 insns[i++] = BPF_ALU64_IMM(BPF_RSH, rd, 32); 1450 insns[i++] = BPF_JMP32_IMM(BPF_JEQ, rd, val >> 32, 2); 1451 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1452 insns[i++] = BPF_EXIT_INSN(); 1453 } 1454 } 1455 1456 insns[i++] = BPF_MOV64_IMM(R0, 1); 1457 insns[i++] = BPF_EXIT_INSN(); 1458 1459 self->u.ptr.insns = insns; 1460 self->u.ptr.len = len; 1461 BUG_ON(i != len); 1462 1463 return 0; 1464 } 1465 1466 /* ALU64 X register combinations */ 1467 static int bpf_fill_alu64_mov_reg_pairs(struct bpf_test *self) 1468 { 1469 return __bpf_fill_alu_reg_pairs(self, BPF_MOV, false); 1470 } 1471 1472 static int bpf_fill_alu64_and_reg_pairs(struct bpf_test *self) 1473 { 1474 return __bpf_fill_alu_reg_pairs(self, BPF_AND, false); 1475 } 1476 1477 static int bpf_fill_alu64_or_reg_pairs(struct bpf_test *self) 1478 { 1479 return __bpf_fill_alu_reg_pairs(self, BPF_OR, false); 1480 } 1481 1482 static int bpf_fill_alu64_xor_reg_pairs(struct bpf_test *self) 1483 { 1484 return __bpf_fill_alu_reg_pairs(self, BPF_XOR, false); 1485 } 1486 1487 static int bpf_fill_alu64_lsh_reg_pairs(struct bpf_test *self) 1488 { 1489 return __bpf_fill_alu_reg_pairs(self, BPF_LSH, false); 1490 } 1491 1492 static int bpf_fill_alu64_rsh_reg_pairs(struct bpf_test *self) 1493 { 1494 return __bpf_fill_alu_reg_pairs(self, BPF_RSH, false); 1495 } 1496 1497 static int bpf_fill_alu64_arsh_reg_pairs(struct bpf_test *self) 1498 { 1499 return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, false); 1500 } 1501 1502 static int bpf_fill_alu64_add_reg_pairs(struct bpf_test *self) 1503 { 1504 return __bpf_fill_alu_reg_pairs(self, BPF_ADD, false); 1505 } 1506 1507 static int bpf_fill_alu64_sub_reg_pairs(struct bpf_test *self) 1508 { 1509 return __bpf_fill_alu_reg_pairs(self, BPF_SUB, false); 1510 } 1511 1512 static int bpf_fill_alu64_mul_reg_pairs(struct bpf_test *self) 1513 { 1514 return __bpf_fill_alu_reg_pairs(self, BPF_MUL, false); 1515 } 1516 1517 static int bpf_fill_alu64_div_reg_pairs(struct bpf_test *self) 1518 { 1519 return __bpf_fill_alu_reg_pairs(self, BPF_DIV, false); 1520 } 1521 1522 static int bpf_fill_alu64_mod_reg_pairs(struct bpf_test *self) 1523 { 1524 return __bpf_fill_alu_reg_pairs(self, BPF_MOD, false); 1525 } 1526 1527 /* ALU32 X register combinations */ 1528 static int bpf_fill_alu32_mov_reg_pairs(struct bpf_test *self) 1529 { 1530 return __bpf_fill_alu_reg_pairs(self, BPF_MOV, true); 1531 } 1532 1533 static int bpf_fill_alu32_and_reg_pairs(struct bpf_test *self) 1534 { 1535 return __bpf_fill_alu_reg_pairs(self, BPF_AND, true); 1536 } 1537 1538 static int bpf_fill_alu32_or_reg_pairs(struct bpf_test *self) 1539 { 1540 return __bpf_fill_alu_reg_pairs(self, BPF_OR, true); 1541 } 1542 1543 static int bpf_fill_alu32_xor_reg_pairs(struct bpf_test *self) 1544 { 1545 return __bpf_fill_alu_reg_pairs(self, BPF_XOR, true); 1546 } 1547 1548 static int bpf_fill_alu32_lsh_reg_pairs(struct bpf_test *self) 1549 { 1550 return __bpf_fill_alu_reg_pairs(self, BPF_LSH, true); 1551 } 1552 1553 static int bpf_fill_alu32_rsh_reg_pairs(struct bpf_test *self) 1554 { 1555 return __bpf_fill_alu_reg_pairs(self, BPF_RSH, true); 1556 } 1557 1558 static int bpf_fill_alu32_arsh_reg_pairs(struct bpf_test *self) 1559 { 1560 return __bpf_fill_alu_reg_pairs(self, BPF_ARSH, true); 1561 } 1562 1563 static int bpf_fill_alu32_add_reg_pairs(struct bpf_test *self) 1564 { 1565 return __bpf_fill_alu_reg_pairs(self, BPF_ADD, true); 1566 } 1567 1568 static int bpf_fill_alu32_sub_reg_pairs(struct bpf_test *self) 1569 { 1570 return __bpf_fill_alu_reg_pairs(self, BPF_SUB, true); 1571 } 1572 1573 static int bpf_fill_alu32_mul_reg_pairs(struct bpf_test *self) 1574 { 1575 return __bpf_fill_alu_reg_pairs(self, BPF_MUL, true); 1576 } 1577 1578 static int bpf_fill_alu32_div_reg_pairs(struct bpf_test *self) 1579 { 1580 return __bpf_fill_alu_reg_pairs(self, BPF_DIV, true); 1581 } 1582 1583 static int bpf_fill_alu32_mod_reg_pairs(struct bpf_test *self) 1584 { 1585 return __bpf_fill_alu_reg_pairs(self, BPF_MOD, true); 1586 } 1587 1588 /* 1589 * Exhaustive tests of atomic operations for all power-of-two operand 1590 * magnitudes, both for positive and negative values. 1591 */ 1592 1593 static int __bpf_emit_atomic64(struct bpf_test *self, void *arg, 1594 struct bpf_insn *insns, s64 dst, s64 src) 1595 { 1596 int op = *(int *)arg; 1597 u64 keep, fetch, res; 1598 int i = 0; 1599 1600 if (!insns) 1601 return 21; 1602 1603 switch (op) { 1604 case BPF_XCHG: 1605 res = src; 1606 break; 1607 default: 1608 __bpf_alu_result(&res, dst, src, BPF_OP(op)); 1609 } 1610 1611 keep = 0x0123456789abcdefULL; 1612 if (op & BPF_FETCH) 1613 fetch = dst; 1614 else 1615 fetch = src; 1616 1617 i += __bpf_ld_imm64(&insns[i], R0, keep); 1618 i += __bpf_ld_imm64(&insns[i], R1, dst); 1619 i += __bpf_ld_imm64(&insns[i], R2, src); 1620 i += __bpf_ld_imm64(&insns[i], R3, res); 1621 i += __bpf_ld_imm64(&insns[i], R4, fetch); 1622 i += __bpf_ld_imm64(&insns[i], R5, keep); 1623 1624 insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8); 1625 insns[i++] = BPF_ATOMIC_OP(BPF_DW, op, R10, R2, -8); 1626 insns[i++] = BPF_LDX_MEM(BPF_DW, R1, R10, -8); 1627 1628 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 1629 insns[i++] = BPF_EXIT_INSN(); 1630 1631 insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1); 1632 insns[i++] = BPF_EXIT_INSN(); 1633 1634 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1); 1635 insns[i++] = BPF_EXIT_INSN(); 1636 1637 return i; 1638 } 1639 1640 static int __bpf_emit_atomic32(struct bpf_test *self, void *arg, 1641 struct bpf_insn *insns, s64 dst, s64 src) 1642 { 1643 int op = *(int *)arg; 1644 u64 keep, fetch, res; 1645 int i = 0; 1646 1647 if (!insns) 1648 return 21; 1649 1650 switch (op) { 1651 case BPF_XCHG: 1652 res = src; 1653 break; 1654 default: 1655 __bpf_alu_result(&res, (u32)dst, (u32)src, BPF_OP(op)); 1656 } 1657 1658 keep = 0x0123456789abcdefULL; 1659 if (op & BPF_FETCH) 1660 fetch = (u32)dst; 1661 else 1662 fetch = src; 1663 1664 i += __bpf_ld_imm64(&insns[i], R0, keep); 1665 i += __bpf_ld_imm64(&insns[i], R1, (u32)dst); 1666 i += __bpf_ld_imm64(&insns[i], R2, src); 1667 i += __bpf_ld_imm64(&insns[i], R3, (u32)res); 1668 i += __bpf_ld_imm64(&insns[i], R4, fetch); 1669 i += __bpf_ld_imm64(&insns[i], R5, keep); 1670 1671 insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4); 1672 insns[i++] = BPF_ATOMIC_OP(BPF_W, op, R10, R2, -4); 1673 insns[i++] = BPF_LDX_MEM(BPF_W, R1, R10, -4); 1674 1675 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 1); 1676 insns[i++] = BPF_EXIT_INSN(); 1677 1678 insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R4, 1); 1679 insns[i++] = BPF_EXIT_INSN(); 1680 1681 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R5, 1); 1682 insns[i++] = BPF_EXIT_INSN(); 1683 1684 return i; 1685 } 1686 1687 static int __bpf_emit_cmpxchg64(struct bpf_test *self, void *arg, 1688 struct bpf_insn *insns, s64 dst, s64 src) 1689 { 1690 int i = 0; 1691 1692 if (!insns) 1693 return 23; 1694 1695 i += __bpf_ld_imm64(&insns[i], R0, ~dst); 1696 i += __bpf_ld_imm64(&insns[i], R1, dst); 1697 i += __bpf_ld_imm64(&insns[i], R2, src); 1698 1699 /* Result unsuccessful */ 1700 insns[i++] = BPF_STX_MEM(BPF_DW, R10, R1, -8); 1701 insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8); 1702 insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8); 1703 1704 insns[i++] = BPF_JMP_REG(BPF_JEQ, R1, R3, 2); 1705 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1706 insns[i++] = BPF_EXIT_INSN(); 1707 1708 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2); 1709 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1710 insns[i++] = BPF_EXIT_INSN(); 1711 1712 /* Result successful */ 1713 insns[i++] = BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -8); 1714 insns[i++] = BPF_LDX_MEM(BPF_DW, R3, R10, -8); 1715 1716 insns[i++] = BPF_JMP_REG(BPF_JEQ, R2, R3, 2); 1717 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1718 insns[i++] = BPF_EXIT_INSN(); 1719 1720 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2); 1721 insns[i++] = BPF_MOV64_IMM(R0, __LINE__); 1722 insns[i++] = BPF_EXIT_INSN(); 1723 1724 return i; 1725 } 1726 1727 static int __bpf_emit_cmpxchg32(struct bpf_test *self, void *arg, 1728 struct bpf_insn *insns, s64 dst, s64 src) 1729 { 1730 int i = 0; 1731 1732 if (!insns) 1733 return 27; 1734 1735 i += __bpf_ld_imm64(&insns[i], R0, ~dst); 1736 i += __bpf_ld_imm64(&insns[i], R1, (u32)dst); 1737 i += __bpf_ld_imm64(&insns[i], R2, src); 1738 1739 /* Result unsuccessful */ 1740 insns[i++] = BPF_STX_MEM(BPF_W, R10, R1, -4); 1741 insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4); 1742 insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */ 1743 insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4); 1744 1745 insns[i++] = BPF_JMP32_REG(BPF_JEQ, R1, R3, 2); 1746 insns[i++] = BPF_MOV32_IMM(R0, __LINE__); 1747 insns[i++] = BPF_EXIT_INSN(); 1748 1749 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R3, 2); 1750 insns[i++] = BPF_MOV32_IMM(R0, __LINE__); 1751 insns[i++] = BPF_EXIT_INSN(); 1752 1753 /* Result successful */ 1754 i += __bpf_ld_imm64(&insns[i], R0, dst); 1755 insns[i++] = BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R2, -4); 1756 insns[i++] = BPF_ZEXT_REG(R0), /* Zext always inserted by verifier */ 1757 insns[i++] = BPF_LDX_MEM(BPF_W, R3, R10, -4); 1758 1759 insns[i++] = BPF_JMP32_REG(BPF_JEQ, R2, R3, 2); 1760 insns[i++] = BPF_MOV32_IMM(R0, __LINE__); 1761 insns[i++] = BPF_EXIT_INSN(); 1762 1763 insns[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2); 1764 insns[i++] = BPF_MOV32_IMM(R0, __LINE__); 1765 insns[i++] = BPF_EXIT_INSN(); 1766 1767 return i; 1768 } 1769 1770 static int __bpf_fill_atomic64(struct bpf_test *self, int op) 1771 { 1772 return __bpf_fill_pattern(self, &op, 64, 64, 1773 0, PATTERN_BLOCK2, 1774 &__bpf_emit_atomic64); 1775 } 1776 1777 static int __bpf_fill_atomic32(struct bpf_test *self, int op) 1778 { 1779 return __bpf_fill_pattern(self, &op, 64, 64, 1780 0, PATTERN_BLOCK2, 1781 &__bpf_emit_atomic32); 1782 } 1783 1784 /* 64-bit atomic operations */ 1785 static int bpf_fill_atomic64_add(struct bpf_test *self) 1786 { 1787 return __bpf_fill_atomic64(self, BPF_ADD); 1788 } 1789 1790 static int bpf_fill_atomic64_and(struct bpf_test *self) 1791 { 1792 return __bpf_fill_atomic64(self, BPF_AND); 1793 } 1794 1795 static int bpf_fill_atomic64_or(struct bpf_test *self) 1796 { 1797 return __bpf_fill_atomic64(self, BPF_OR); 1798 } 1799 1800 static int bpf_fill_atomic64_xor(struct bpf_test *self) 1801 { 1802 return __bpf_fill_atomic64(self, BPF_XOR); 1803 } 1804 1805 static int bpf_fill_atomic64_add_fetch(struct bpf_test *self) 1806 { 1807 return __bpf_fill_atomic64(self, BPF_ADD | BPF_FETCH); 1808 } 1809 1810 static int bpf_fill_atomic64_and_fetch(struct bpf_test *self) 1811 { 1812 return __bpf_fill_atomic64(self, BPF_AND | BPF_FETCH); 1813 } 1814 1815 static int bpf_fill_atomic64_or_fetch(struct bpf_test *self) 1816 { 1817 return __bpf_fill_atomic64(self, BPF_OR | BPF_FETCH); 1818 } 1819 1820 static int bpf_fill_atomic64_xor_fetch(struct bpf_test *self) 1821 { 1822 return __bpf_fill_atomic64(self, BPF_XOR | BPF_FETCH); 1823 } 1824 1825 static int bpf_fill_atomic64_xchg(struct bpf_test *self) 1826 { 1827 return __bpf_fill_atomic64(self, BPF_XCHG); 1828 } 1829 1830 static int bpf_fill_cmpxchg64(struct bpf_test *self) 1831 { 1832 return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2, 1833 &__bpf_emit_cmpxchg64); 1834 } 1835 1836 /* 32-bit atomic operations */ 1837 static int bpf_fill_atomic32_add(struct bpf_test *self) 1838 { 1839 return __bpf_fill_atomic32(self, BPF_ADD); 1840 } 1841 1842 static int bpf_fill_atomic32_and(struct bpf_test *self) 1843 { 1844 return __bpf_fill_atomic32(self, BPF_AND); 1845 } 1846 1847 static int bpf_fill_atomic32_or(struct bpf_test *self) 1848 { 1849 return __bpf_fill_atomic32(self, BPF_OR); 1850 } 1851 1852 static int bpf_fill_atomic32_xor(struct bpf_test *self) 1853 { 1854 return __bpf_fill_atomic32(self, BPF_XOR); 1855 } 1856 1857 static int bpf_fill_atomic32_add_fetch(struct bpf_test *self) 1858 { 1859 return __bpf_fill_atomic32(self, BPF_ADD | BPF_FETCH); 1860 } 1861 1862 static int bpf_fill_atomic32_and_fetch(struct bpf_test *self) 1863 { 1864 return __bpf_fill_atomic32(self, BPF_AND | BPF_FETCH); 1865 } 1866 1867 static int bpf_fill_atomic32_or_fetch(struct bpf_test *self) 1868 { 1869 return __bpf_fill_atomic32(self, BPF_OR | BPF_FETCH); 1870 } 1871 1872 static int bpf_fill_atomic32_xor_fetch(struct bpf_test *self) 1873 { 1874 return __bpf_fill_atomic32(self, BPF_XOR | BPF_FETCH); 1875 } 1876 1877 static int bpf_fill_atomic32_xchg(struct bpf_test *self) 1878 { 1879 return __bpf_fill_atomic32(self, BPF_XCHG); 1880 } 1881 1882 static int bpf_fill_cmpxchg32(struct bpf_test *self) 1883 { 1884 return __bpf_fill_pattern(self, NULL, 64, 64, 0, PATTERN_BLOCK2, 1885 &__bpf_emit_cmpxchg32); 1886 } 1887 1888 /* 1889 * Test JITs that implement ATOMIC operations as function calls or 1890 * other primitives, and must re-arrange operands for argument passing. 1891 */ 1892 static int __bpf_fill_atomic_reg_pairs(struct bpf_test *self, u8 width, u8 op) 1893 { 1894 struct bpf_insn *insn; 1895 int len = 2 + 34 * 10 * 10; 1896 u64 mem, upd, res; 1897 int rd, rs, i = 0; 1898 1899 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 1900 if (!insn) 1901 return -ENOMEM; 1902 1903 /* Operand and memory values */ 1904 if (width == BPF_DW) { 1905 mem = 0x0123456789abcdefULL; 1906 upd = 0xfedcba9876543210ULL; 1907 } else { /* BPF_W */ 1908 mem = 0x01234567U; 1909 upd = 0x76543210U; 1910 } 1911 1912 /* Memory updated according to operation */ 1913 switch (op) { 1914 case BPF_XCHG: 1915 res = upd; 1916 break; 1917 case BPF_CMPXCHG: 1918 res = mem; 1919 break; 1920 default: 1921 __bpf_alu_result(&res, mem, upd, BPF_OP(op)); 1922 } 1923 1924 /* Test all operand registers */ 1925 for (rd = R0; rd <= R9; rd++) { 1926 for (rs = R0; rs <= R9; rs++) { 1927 u64 cmp, src; 1928 1929 /* Initialize value in memory */ 1930 i += __bpf_ld_imm64(&insn[i], R0, mem); 1931 insn[i++] = BPF_STX_MEM(width, R10, R0, -8); 1932 1933 /* Initialize registers in order */ 1934 i += __bpf_ld_imm64(&insn[i], R0, ~mem); 1935 i += __bpf_ld_imm64(&insn[i], rs, upd); 1936 insn[i++] = BPF_MOV64_REG(rd, R10); 1937 1938 /* Perform atomic operation */ 1939 insn[i++] = BPF_ATOMIC_OP(width, op, rd, rs, -8); 1940 if (op == BPF_CMPXCHG && width == BPF_W) 1941 insn[i++] = BPF_ZEXT_REG(R0); 1942 1943 /* Check R0 register value */ 1944 if (op == BPF_CMPXCHG) 1945 cmp = mem; /* Expect value from memory */ 1946 else if (R0 == rd || R0 == rs) 1947 cmp = 0; /* Aliased, checked below */ 1948 else 1949 cmp = ~mem; /* Expect value to be preserved */ 1950 if (cmp) { 1951 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0, 1952 (u32)cmp, 2); 1953 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 1954 insn[i++] = BPF_EXIT_INSN(); 1955 insn[i++] = BPF_ALU64_IMM(BPF_RSH, R0, 32); 1956 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, R0, 1957 cmp >> 32, 2); 1958 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 1959 insn[i++] = BPF_EXIT_INSN(); 1960 } 1961 1962 /* Check source register value */ 1963 if (rs == R0 && op == BPF_CMPXCHG) 1964 src = 0; /* Aliased with R0, checked above */ 1965 else if (rs == rd && (op == BPF_CMPXCHG || 1966 !(op & BPF_FETCH))) 1967 src = 0; /* Aliased with rd, checked below */ 1968 else if (op == BPF_CMPXCHG) 1969 src = upd; /* Expect value to be preserved */ 1970 else if (op & BPF_FETCH) 1971 src = mem; /* Expect fetched value from mem */ 1972 else /* no fetch */ 1973 src = upd; /* Expect value to be preserved */ 1974 if (src) { 1975 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs, 1976 (u32)src, 2); 1977 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 1978 insn[i++] = BPF_EXIT_INSN(); 1979 insn[i++] = BPF_ALU64_IMM(BPF_RSH, rs, 32); 1980 insn[i++] = BPF_JMP32_IMM(BPF_JEQ, rs, 1981 src >> 32, 2); 1982 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 1983 insn[i++] = BPF_EXIT_INSN(); 1984 } 1985 1986 /* Check destination register value */ 1987 if (!(rd == R0 && op == BPF_CMPXCHG) && 1988 !(rd == rs && (op & BPF_FETCH))) { 1989 insn[i++] = BPF_JMP_REG(BPF_JEQ, rd, R10, 2); 1990 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 1991 insn[i++] = BPF_EXIT_INSN(); 1992 } 1993 1994 /* Check value in memory */ 1995 if (rs != rd) { /* No aliasing */ 1996 i += __bpf_ld_imm64(&insn[i], R1, res); 1997 } else if (op == BPF_XCHG) { /* Aliased, XCHG */ 1998 insn[i++] = BPF_MOV64_REG(R1, R10); 1999 } else if (op == BPF_CMPXCHG) { /* Aliased, CMPXCHG */ 2000 i += __bpf_ld_imm64(&insn[i], R1, mem); 2001 } else { /* Aliased, ALU oper */ 2002 i += __bpf_ld_imm64(&insn[i], R1, mem); 2003 insn[i++] = BPF_ALU64_REG(BPF_OP(op), R1, R10); 2004 } 2005 2006 insn[i++] = BPF_LDX_MEM(width, R0, R10, -8); 2007 if (width == BPF_DW) 2008 insn[i++] = BPF_JMP_REG(BPF_JEQ, R0, R1, 2); 2009 else /* width == BPF_W */ 2010 insn[i++] = BPF_JMP32_REG(BPF_JEQ, R0, R1, 2); 2011 insn[i++] = BPF_MOV32_IMM(R0, __LINE__); 2012 insn[i++] = BPF_EXIT_INSN(); 2013 } 2014 } 2015 2016 insn[i++] = BPF_MOV64_IMM(R0, 1); 2017 insn[i++] = BPF_EXIT_INSN(); 2018 2019 self->u.ptr.insns = insn; 2020 self->u.ptr.len = i; 2021 BUG_ON(i > len); 2022 2023 return 0; 2024 } 2025 2026 /* 64-bit atomic register tests */ 2027 static int bpf_fill_atomic64_add_reg_pairs(struct bpf_test *self) 2028 { 2029 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD); 2030 } 2031 2032 static int bpf_fill_atomic64_and_reg_pairs(struct bpf_test *self) 2033 { 2034 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND); 2035 } 2036 2037 static int bpf_fill_atomic64_or_reg_pairs(struct bpf_test *self) 2038 { 2039 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR); 2040 } 2041 2042 static int bpf_fill_atomic64_xor_reg_pairs(struct bpf_test *self) 2043 { 2044 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR); 2045 } 2046 2047 static int bpf_fill_atomic64_add_fetch_reg_pairs(struct bpf_test *self) 2048 { 2049 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_ADD | BPF_FETCH); 2050 } 2051 2052 static int bpf_fill_atomic64_and_fetch_reg_pairs(struct bpf_test *self) 2053 { 2054 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_AND | BPF_FETCH); 2055 } 2056 2057 static int bpf_fill_atomic64_or_fetch_reg_pairs(struct bpf_test *self) 2058 { 2059 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_OR | BPF_FETCH); 2060 } 2061 2062 static int bpf_fill_atomic64_xor_fetch_reg_pairs(struct bpf_test *self) 2063 { 2064 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XOR | BPF_FETCH); 2065 } 2066 2067 static int bpf_fill_atomic64_xchg_reg_pairs(struct bpf_test *self) 2068 { 2069 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_XCHG); 2070 } 2071 2072 static int bpf_fill_atomic64_cmpxchg_reg_pairs(struct bpf_test *self) 2073 { 2074 return __bpf_fill_atomic_reg_pairs(self, BPF_DW, BPF_CMPXCHG); 2075 } 2076 2077 /* 32-bit atomic register tests */ 2078 static int bpf_fill_atomic32_add_reg_pairs(struct bpf_test *self) 2079 { 2080 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD); 2081 } 2082 2083 static int bpf_fill_atomic32_and_reg_pairs(struct bpf_test *self) 2084 { 2085 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND); 2086 } 2087 2088 static int bpf_fill_atomic32_or_reg_pairs(struct bpf_test *self) 2089 { 2090 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR); 2091 } 2092 2093 static int bpf_fill_atomic32_xor_reg_pairs(struct bpf_test *self) 2094 { 2095 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR); 2096 } 2097 2098 static int bpf_fill_atomic32_add_fetch_reg_pairs(struct bpf_test *self) 2099 { 2100 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_ADD | BPF_FETCH); 2101 } 2102 2103 static int bpf_fill_atomic32_and_fetch_reg_pairs(struct bpf_test *self) 2104 { 2105 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_AND | BPF_FETCH); 2106 } 2107 2108 static int bpf_fill_atomic32_or_fetch_reg_pairs(struct bpf_test *self) 2109 { 2110 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_OR | BPF_FETCH); 2111 } 2112 2113 static int bpf_fill_atomic32_xor_fetch_reg_pairs(struct bpf_test *self) 2114 { 2115 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XOR | BPF_FETCH); 2116 } 2117 2118 static int bpf_fill_atomic32_xchg_reg_pairs(struct bpf_test *self) 2119 { 2120 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_XCHG); 2121 } 2122 2123 static int bpf_fill_atomic32_cmpxchg_reg_pairs(struct bpf_test *self) 2124 { 2125 return __bpf_fill_atomic_reg_pairs(self, BPF_W, BPF_CMPXCHG); 2126 } 2127 2128 /* 2129 * Test the two-instruction 64-bit immediate load operation for all 2130 * power-of-two magnitudes of the immediate operand. For each MSB, a block 2131 * of immediate values centered around the power-of-two MSB are tested, 2132 * both for positive and negative values. The test is designed to verify 2133 * the operation for JITs that emit different code depending on the magnitude 2134 * of the immediate value. This is often the case if the native instruction 2135 * immediate field width is narrower than 32 bits. 2136 */ 2137 static int bpf_fill_ld_imm64(struct bpf_test *self) 2138 { 2139 int block = 64; /* Increase for more tests per MSB position */ 2140 int len = 3 + 8 * 63 * block * 2; 2141 struct bpf_insn *insn; 2142 int bit, adj, sign; 2143 int i = 0; 2144 2145 insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL); 2146 if (!insn) 2147 return -ENOMEM; 2148 2149 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 0); 2150 2151 for (bit = 0; bit <= 62; bit++) { 2152 for (adj = -block / 2; adj < block / 2; adj++) { 2153 for (sign = -1; sign <= 1; sign += 2) { 2154 s64 imm = sign * ((1LL << bit) + adj); 2155 2156 /* Perform operation */ 2157 i += __bpf_ld_imm64(&insn[i], R1, imm); 2158 2159 /* Load reference */ 2160 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R2, imm); 2161 insn[i++] = BPF_ALU32_IMM(BPF_MOV, R3, 2162 (u32)(imm >> 32)); 2163 insn[i++] = BPF_ALU64_IMM(BPF_LSH, R3, 32); 2164 insn[i++] = BPF_ALU64_REG(BPF_OR, R2, R3); 2165 2166 /* Check result */ 2167 insn[i++] = BPF_JMP_REG(BPF_JEQ, R1, R2, 1); 2168 insn[i++] = BPF_EXIT_INSN(); 2169 } 2170 } 2171 } 2172 2173 insn[i++] = BPF_ALU64_IMM(BPF_MOV, R0, 1); 2174 insn[i++] = BPF_EXIT_INSN(); 2175 2176 self->u.ptr.insns = insn; 2177 self->u.ptr.len = len; 2178 BUG_ON(i != len); 2179 2180 return 0; 2181 } 2182 2183 /* 2184 * Exhaustive tests of JMP operations for all combinations of power-of-two 2185 * magnitudes of the operands, both for positive and negative values. The 2186 * test is designed to verify e.g. the JMP and JMP32 operations for JITs that 2187 * emit different code depending on the magnitude of the immediate value. 2188 */ 2189 2190 static bool __bpf_match_jmp_cond(s64 v1, s64 v2, u8 op) 2191 { 2192 switch (op) { 2193 case BPF_JSET: 2194 return !!(v1 & v2); 2195 case BPF_JEQ: 2196 return v1 == v2; 2197 case BPF_JNE: 2198 return v1 != v2; 2199 case BPF_JGT: 2200 return (u64)v1 > (u64)v2; 2201 case BPF_JGE: 2202 return (u64)v1 >= (u64)v2; 2203 case BPF_JLT: 2204 return (u64)v1 < (u64)v2; 2205 case BPF_JLE: 2206 return (u64)v1 <= (u64)v2; 2207 case BPF_JSGT: 2208 return v1 > v2; 2209 case BPF_JSGE: 2210 return v1 >= v2; 2211 case BPF_JSLT: 2212 return v1 < v2; 2213 case BPF_JSLE: 2214 return v1 <= v2; 2215 } 2216 return false; 2217 } 2218 2219 static int __bpf_emit_jmp_imm(struct bpf_test *self, void *arg, 2220 struct bpf_insn *insns, s64 dst, s64 imm) 2221 { 2222 int op = *(int *)arg; 2223 2224 if (insns) { 2225 bool match = __bpf_match_jmp_cond(dst, (s32)imm, op); 2226 int i = 0; 2227 2228 insns[i++] = BPF_ALU32_IMM(BPF_MOV, R0, match); 2229 2230 i += __bpf_ld_imm64(&insns[i], R1, dst); 2231 insns[i++] = BPF_JMP_IMM(op, R1, imm, 1); 2232 if (!match) 2233 insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1); 2234 insns[i++] = BPF_EXIT_INSN(); 2235 2236 return i; 2237 } 2238 2239 return 5 + 1; 2240 } 2241 2242 static int __bpf_emit_jmp32_imm(struct bpf_test *self, void *arg, 2243 struct bpf_insn *insns, s64 dst, s64 imm) 2244 { 2245 int op = *(int *)arg; 2246 2247 if (insns) { 2248 bool match = __bpf_match_jmp_cond((s32)dst, (s32)imm, op); 2249 int i = 0; 2250 2251 i += __bpf_ld_imm64(&insns[i], R1, dst); 2252 insns[i++] = BPF_JMP32_IMM(op, R1, imm, 1); 2253 if (!match) 2254 insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1); 2255 insns[i++] = BPF_EXIT_INSN(); 2256 2257 return i; 2258 } 2259 2260 return 5; 2261 } 2262 2263 static int __bpf_emit_jmp_reg(struct bpf_test *self, void *arg, 2264 struct bpf_insn *insns, s64 dst, s64 src) 2265 { 2266 int op = *(int *)arg; 2267 2268 if (insns) { 2269 bool match = __bpf_match_jmp_cond(dst, src, op); 2270 int i = 0; 2271 2272 i += __bpf_ld_imm64(&insns[i], R1, dst); 2273 i += __bpf_ld_imm64(&insns[i], R2, src); 2274 insns[i++] = BPF_JMP_REG(op, R1, R2, 1); 2275 if (!match) 2276 insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1); 2277 insns[i++] = BPF_EXIT_INSN(); 2278 2279 return i; 2280 } 2281 2282 return 7; 2283 } 2284 2285 static int __bpf_emit_jmp32_reg(struct bpf_test *self, void *arg, 2286 struct bpf_insn *insns, s64 dst, s64 src) 2287 { 2288 int op = *(int *)arg; 2289 2290 if (insns) { 2291 bool match = __bpf_match_jmp_cond((s32)dst, (s32)src, op); 2292 int i = 0; 2293 2294 i += __bpf_ld_imm64(&insns[i], R1, dst); 2295 i += __bpf_ld_imm64(&insns[i], R2, src); 2296 insns[i++] = BPF_JMP32_REG(op, R1, R2, 1); 2297 if (!match) 2298 insns[i++] = BPF_JMP_IMM(BPF_JA, 0, 0, 1); 2299 insns[i++] = BPF_EXIT_INSN(); 2300 2301 return i; 2302 } 2303 2304 return 7; 2305 } 2306 2307 static int __bpf_fill_jmp_imm(struct bpf_test *self, int op) 2308 { 2309 return __bpf_fill_pattern(self, &op, 64, 32, 2310 PATTERN_BLOCK1, PATTERN_BLOCK2, 2311 &__bpf_emit_jmp_imm); 2312 } 2313 2314 static int __bpf_fill_jmp32_imm(struct bpf_test *self, int op) 2315 { 2316 return __bpf_fill_pattern(self, &op, 64, 32, 2317 PATTERN_BLOCK1, PATTERN_BLOCK2, 2318 &__bpf_emit_jmp32_imm); 2319 } 2320 2321 static int __bpf_fill_jmp_reg(struct bpf_test *self, int op) 2322 { 2323 return __bpf_fill_pattern(self, &op, 64, 64, 2324 PATTERN_BLOCK1, PATTERN_BLOCK2, 2325 &__bpf_emit_jmp_reg); 2326 } 2327 2328 static int __bpf_fill_jmp32_reg(struct bpf_test *self, int op) 2329 { 2330 return __bpf_fill_pattern(self, &op, 64, 64, 2331 PATTERN_BLOCK1, PATTERN_BLOCK2, 2332 &__bpf_emit_jmp32_reg); 2333 } 2334 2335 /* JMP immediate tests */ 2336 static int bpf_fill_jmp_jset_imm(struct bpf_test *self) 2337 { 2338 return __bpf_fill_jmp_imm(self, BPF_JSET); 2339 } 2340 2341 static int bpf_fill_jmp_jeq_imm(struct bpf_test *self) 2342 { 2343 return __bpf_fill_jmp_imm(self, BPF_JEQ); 2344 } 2345 2346 static int bpf_fill_jmp_jne_imm(struct bpf_test *self) 2347 { 2348 return __bpf_fill_jmp_imm(self, BPF_JNE); 2349 } 2350 2351 static int bpf_fill_jmp_jgt_imm(struct bpf_test *self) 2352 { 2353 return __bpf_fill_jmp_imm(self, BPF_JGT); 2354 } 2355 2356 static int bpf_fill_jmp_jge_imm(struct bpf_test *self) 2357 { 2358 return __bpf_fill_jmp_imm(self, BPF_JGE); 2359 } 2360 2361 static int bpf_fill_jmp_jlt_imm(struct bpf_test *self) 2362 { 2363 return __bpf_fill_jmp_imm(self, BPF_JLT); 2364 } 2365 2366 static int bpf_fill_jmp_jle_imm(struct bpf_test *self) 2367 { 2368 return __bpf_fill_jmp_imm(self, BPF_JLE); 2369 } 2370 2371 static int bpf_fill_jmp_jsgt_imm(struct bpf_test *self) 2372 { 2373 return __bpf_fill_jmp_imm(self, BPF_JSGT); 2374 } 2375 2376 static int bpf_fill_jmp_jsge_imm(struct bpf_test *self) 2377 { 2378 return __bpf_fill_jmp_imm(self, BPF_JSGE); 2379 } 2380 2381 static int bpf_fill_jmp_jslt_imm(struct bpf_test *self) 2382 { 2383 return __bpf_fill_jmp_imm(self, BPF_JSLT); 2384 } 2385 2386 static int bpf_fill_jmp_jsle_imm(struct bpf_test *self) 2387 { 2388 return __bpf_fill_jmp_imm(self, BPF_JSLE); 2389 } 2390 2391 /* JMP32 immediate tests */ 2392 static int bpf_fill_jmp32_jset_imm(struct bpf_test *self) 2393 { 2394 return __bpf_fill_jmp32_imm(self, BPF_JSET); 2395 } 2396 2397 static int bpf_fill_jmp32_jeq_imm(struct bpf_test *self) 2398 { 2399 return __bpf_fill_jmp32_imm(self, BPF_JEQ); 2400 } 2401 2402 static int bpf_fill_jmp32_jne_imm(struct bpf_test *self) 2403 { 2404 return __bpf_fill_jmp32_imm(self, BPF_JNE); 2405 } 2406 2407 static int bpf_fill_jmp32_jgt_imm(struct bpf_test *self) 2408 { 2409 return __bpf_fill_jmp32_imm(self, BPF_JGT); 2410 } 2411 2412 static int bpf_fill_jmp32_jge_imm(struct bpf_test *self) 2413 { 2414 return __bpf_fill_jmp32_imm(self, BPF_JGE); 2415 } 2416 2417 static int bpf_fill_jmp32_jlt_imm(struct bpf_test *self) 2418 { 2419 return __bpf_fill_jmp32_imm(self, BPF_JLT); 2420 } 2421 2422 static int bpf_fill_jmp32_jle_imm(struct bpf_test *self) 2423 { 2424 return __bpf_fill_jmp32_imm(self, BPF_JLE); 2425 } 2426 2427 static int bpf_fill_jmp32_jsgt_imm(struct bpf_test *self) 2428 { 2429 return __bpf_fill_jmp32_imm(self, BPF_JSGT); 2430 } 2431 2432 static int bpf_fill_jmp32_jsge_imm(struct bpf_test *self) 2433 { 2434 return __bpf_fill_jmp32_imm(self, BPF_JSGE); 2435 } 2436 2437 static int bpf_fill_jmp32_jslt_imm(struct bpf_test *self) 2438 { 2439 return __bpf_fill_jmp32_imm(self, BPF_JSLT); 2440 } 2441 2442 static int bpf_fill_jmp32_jsle_imm(struct bpf_test *self) 2443 { 2444 return __bpf_fill_jmp32_imm(self, BPF_JSLE); 2445 } 2446 2447 /* JMP register tests */ 2448 static int bpf_fill_jmp_jset_reg(struct bpf_test *self) 2449 { 2450 return __bpf_fill_jmp_reg(self, BPF_JSET); 2451 } 2452 2453 static int bpf_fill_jmp_jeq_reg(struct bpf_test *self) 2454 { 2455 return __bpf_fill_jmp_reg(self, BPF_JEQ); 2456 } 2457 2458 static int bpf_fill_jmp_jne_reg(struct bpf_test *self) 2459 { 2460 return __bpf_fill_jmp_reg(self, BPF_JNE); 2461 } 2462 2463 static int bpf_fill_jmp_jgt_reg(struct bpf_test *self) 2464 { 2465 return __bpf_fill_jmp_reg(self, BPF_JGT); 2466 } 2467 2468 static int bpf_fill_jmp_jge_reg(struct bpf_test *self) 2469 { 2470 return __bpf_fill_jmp_reg(self, BPF_JGE); 2471 } 2472 2473 static int bpf_fill_jmp_jlt_reg(struct bpf_test *self) 2474 { 2475 return __bpf_fill_jmp_reg(self, BPF_JLT); 2476 } 2477 2478 static int bpf_fill_jmp_jle_reg(struct bpf_test *self) 2479 { 2480 return __bpf_fill_jmp_reg(self, BPF_JLE); 2481 } 2482 2483 static int bpf_fill_jmp_jsgt_reg(struct bpf_test *self) 2484 { 2485 return __bpf_fill_jmp_reg(self, BPF_JSGT); 2486 } 2487 2488 static int bpf_fill_jmp_jsge_reg(struct bpf_test *self) 2489 { 2490 return __bpf_fill_jmp_reg(self, BPF_JSGE); 2491 } 2492 2493 static int bpf_fill_jmp_jslt_reg(struct bpf_test *self) 2494 { 2495 return __bpf_fill_jmp_reg(self, BPF_JSLT); 2496 } 2497 2498 static int bpf_fill_jmp_jsle_reg(struct bpf_test *self) 2499 { 2500 return __bpf_fill_jmp_reg(self, BPF_JSLE); 2501 } 2502 2503 /* JMP32 register tests */ 2504 static int bpf_fill_jmp32_jset_reg(struct bpf_test *self) 2505 { 2506 return __bpf_fill_jmp32_reg(self, BPF_JSET); 2507 } 2508 2509 static int bpf_fill_jmp32_jeq_reg(struct bpf_test *self) 2510 { 2511 return __bpf_fill_jmp32_reg(self, BPF_JEQ); 2512 } 2513 2514 static int bpf_fill_jmp32_jne_reg(struct bpf_test *self) 2515 { 2516 return __bpf_fill_jmp32_reg(self, BPF_JNE); 2517 } 2518 2519 static int bpf_fill_jmp32_jgt_reg(struct bpf_test *self) 2520 { 2521 return __bpf_fill_jmp32_reg(self, BPF_JGT); 2522 } 2523 2524 static int bpf_fill_jmp32_jge_reg(struct bpf_test *self) 2525 { 2526 return __bpf_fill_jmp32_reg(self, BPF_JGE); 2527 } 2528 2529 static int bpf_fill_jmp32_jlt_reg(struct bpf_test *self) 2530 { 2531 return __bpf_fill_jmp32_reg(self, BPF_JLT); 2532 } 2533 2534 static int bpf_fill_jmp32_jle_reg(struct bpf_test *self) 2535 { 2536 return __bpf_fill_jmp32_reg(self, BPF_JLE); 2537 } 2538 2539 static int bpf_fill_jmp32_jsgt_reg(struct bpf_test *self) 2540 { 2541 return __bpf_fill_jmp32_reg(self, BPF_JSGT); 2542 } 2543 2544 static int bpf_fill_jmp32_jsge_reg(struct bpf_test *self) 2545 { 2546 return __bpf_fill_jmp32_reg(self, BPF_JSGE); 2547 } 2548 2549 static int bpf_fill_jmp32_jslt_reg(struct bpf_test *self) 2550 { 2551 return __bpf_fill_jmp32_reg(self, BPF_JSLT); 2552 } 2553 2554 static int bpf_fill_jmp32_jsle_reg(struct bpf_test *self) 2555 { 2556 return __bpf_fill_jmp32_reg(self, BPF_JSLE); 2557 } 2558 2559 /* 2560 * Set up a sequence of staggered jumps, forwards and backwards with 2561 * increasing offset. This tests the conversion of relative jumps to 2562 * JITed native jumps. On some architectures, for example MIPS, a large 2563 * PC-relative jump offset may overflow the immediate field of the native 2564 * conditional branch instruction, triggering a conversion to use an 2565 * absolute jump instead. Since this changes the jump offsets, another 2566 * offset computation pass is necessary, and that may in turn trigger 2567 * another branch conversion. This jump sequence is particularly nasty 2568 * in that regard. 2569 * 2570 * The sequence generation is parameterized by size and jump type. 2571 * The size must be even, and the expected result is always size + 1. 2572 * Below is an example with size=8 and result=9. 2573 * 2574 * ________________________Start 2575 * R0 = 0 2576 * R1 = r1 2577 * R2 = r2 2578 * ,------- JMP +4 * 3______________Preamble: 4 insns 2579 * ,----------|-ind 0- if R0 != 7 JMP 8 * 3 + 1 <--------------------. 2580 * | | R0 = 8 | 2581 * | | JMP +7 * 3 ------------------------. 2582 * | ,--------|-----1- if R0 != 5 JMP 7 * 3 + 1 <--------------. | | 2583 * | | | R0 = 6 | | | 2584 * | | | JMP +5 * 3 ------------------. | | 2585 * | | ,------|-----2- if R0 != 3 JMP 6 * 3 + 1 <--------. | | | | 2586 * | | | | R0 = 4 | | | | | 2587 * | | | | JMP +3 * 3 ------------. | | | | 2588 * | | | ,----|-----3- if R0 != 1 JMP 5 * 3 + 1 <--. | | | | | | 2589 * | | | | | R0 = 2 | | | | | | | 2590 * | | | | | JMP +1 * 3 ------. | | | | | | 2591 * | | | | ,--t=====4> if R0 != 0 JMP 4 * 3 + 1 1 2 3 4 5 6 7 8 loc 2592 * | | | | | R0 = 1 -1 +2 -3 +4 -5 +6 -7 +8 off 2593 * | | | | | JMP -2 * 3 ---' | | | | | | | 2594 * | | | | | ,------5- if R0 != 2 JMP 3 * 3 + 1 <-----' | | | | | | 2595 * | | | | | | R0 = 3 | | | | | | 2596 * | | | | | | JMP -4 * 3 ---------' | | | | | 2597 * | | | | | | ,----6- if R0 != 4 JMP 2 * 3 + 1 <-----------' | | | | 2598 * | | | | | | | R0 = 5 | | | | 2599 * | | | | | | | JMP -6 * 3 ---------------' | | | 2600 * | | | | | | | ,--7- if R0 != 6 JMP 1 * 3 + 1 <-----------------' | | 2601 * | | | | | | | | R0 = 7 | | 2602 * | | Error | | | JMP -8 * 3 ---------------------' | 2603 * | | paths | | | ,8- if R0 != 8 JMP 0 * 3 + 1 <-----------------------' 2604 * | | | | | | | | | R0 = 9__________________Sequence: 3 * size - 1 insns 2605 * `-+-+-+-+-+-+-+-+-> EXIT____________________Return: 1 insn 2606 * 2607 */ 2608 2609 /* The maximum size parameter */ 2610 #define MAX_STAGGERED_JMP_SIZE ((0x7fff / 3) & ~1) 2611 2612 /* We use a reduced number of iterations to get a reasonable execution time */ 2613 #define NR_STAGGERED_JMP_RUNS 10 2614 2615 static int __bpf_fill_staggered_jumps(struct bpf_test *self, 2616 const struct bpf_insn *jmp, 2617 u64 r1, u64 r2) 2618 { 2619 int size = self->test[0].result - 1; 2620 int len = 4 + 3 * (size + 1); 2621 struct bpf_insn *insns; 2622 int off, ind; 2623 2624 insns = kmalloc_array(len, sizeof(*insns), GFP_KERNEL); 2625 if (!insns) 2626 return -ENOMEM; 2627 2628 /* Preamble */ 2629 insns[0] = BPF_ALU64_IMM(BPF_MOV, R0, 0); 2630 insns[1] = BPF_ALU64_IMM(BPF_MOV, R1, r1); 2631 insns[2] = BPF_ALU64_IMM(BPF_MOV, R2, r2); 2632 insns[3] = BPF_JMP_IMM(BPF_JA, 0, 0, 3 * size / 2); 2633 2634 /* Sequence */ 2635 for (ind = 0, off = size; ind <= size; ind++, off -= 2) { 2636 struct bpf_insn *ins = &insns[4 + 3 * ind]; 2637 int loc; 2638 2639 if (off == 0) 2640 off--; 2641 2642 loc = abs(off); 2643 ins[0] = BPF_JMP_IMM(BPF_JNE, R0, loc - 1, 2644 3 * (size - ind) + 1); 2645 ins[1] = BPF_ALU64_IMM(BPF_MOV, R0, loc); 2646 ins[2] = *jmp; 2647 ins[2].off = 3 * (off - 1); 2648 } 2649 2650 /* Return */ 2651 insns[len - 1] = BPF_EXIT_INSN(); 2652 2653 self->u.ptr.insns = insns; 2654 self->u.ptr.len = len; 2655 2656 return 0; 2657 } 2658 2659 /* 64-bit unconditional jump */ 2660 static int bpf_fill_staggered_ja(struct bpf_test *self) 2661 { 2662 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JA, 0, 0, 0); 2663 2664 return __bpf_fill_staggered_jumps(self, &jmp, 0, 0); 2665 } 2666 2667 /* 64-bit immediate jumps */ 2668 static int bpf_fill_staggered_jeq_imm(struct bpf_test *self) 2669 { 2670 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JEQ, R1, 1234, 0); 2671 2672 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2673 } 2674 2675 static int bpf_fill_staggered_jne_imm(struct bpf_test *self) 2676 { 2677 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JNE, R1, 1234, 0); 2678 2679 return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0); 2680 } 2681 2682 static int bpf_fill_staggered_jset_imm(struct bpf_test *self) 2683 { 2684 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSET, R1, 0x82, 0); 2685 2686 return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0); 2687 } 2688 2689 static int bpf_fill_staggered_jgt_imm(struct bpf_test *self) 2690 { 2691 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGT, R1, 1234, 0); 2692 2693 return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0); 2694 } 2695 2696 static int bpf_fill_staggered_jge_imm(struct bpf_test *self) 2697 { 2698 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JGE, R1, 1234, 0); 2699 2700 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2701 } 2702 2703 static int bpf_fill_staggered_jlt_imm(struct bpf_test *self) 2704 { 2705 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLT, R1, 0x80000000, 0); 2706 2707 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2708 } 2709 2710 static int bpf_fill_staggered_jle_imm(struct bpf_test *self) 2711 { 2712 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JLE, R1, 1234, 0); 2713 2714 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2715 } 2716 2717 static int bpf_fill_staggered_jsgt_imm(struct bpf_test *self) 2718 { 2719 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGT, R1, -2, 0); 2720 2721 return __bpf_fill_staggered_jumps(self, &jmp, -1, 0); 2722 } 2723 2724 static int bpf_fill_staggered_jsge_imm(struct bpf_test *self) 2725 { 2726 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSGE, R1, -2, 0); 2727 2728 return __bpf_fill_staggered_jumps(self, &jmp, -2, 0); 2729 } 2730 2731 static int bpf_fill_staggered_jslt_imm(struct bpf_test *self) 2732 { 2733 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLT, R1, -1, 0); 2734 2735 return __bpf_fill_staggered_jumps(self, &jmp, -2, 0); 2736 } 2737 2738 static int bpf_fill_staggered_jsle_imm(struct bpf_test *self) 2739 { 2740 struct bpf_insn jmp = BPF_JMP_IMM(BPF_JSLE, R1, -1, 0); 2741 2742 return __bpf_fill_staggered_jumps(self, &jmp, -1, 0); 2743 } 2744 2745 /* 64-bit register jumps */ 2746 static int bpf_fill_staggered_jeq_reg(struct bpf_test *self) 2747 { 2748 struct bpf_insn jmp = BPF_JMP_REG(BPF_JEQ, R1, R2, 0); 2749 2750 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2751 } 2752 2753 static int bpf_fill_staggered_jne_reg(struct bpf_test *self) 2754 { 2755 struct bpf_insn jmp = BPF_JMP_REG(BPF_JNE, R1, R2, 0); 2756 2757 return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234); 2758 } 2759 2760 static int bpf_fill_staggered_jset_reg(struct bpf_test *self) 2761 { 2762 struct bpf_insn jmp = BPF_JMP_REG(BPF_JSET, R1, R2, 0); 2763 2764 return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82); 2765 } 2766 2767 static int bpf_fill_staggered_jgt_reg(struct bpf_test *self) 2768 { 2769 struct bpf_insn jmp = BPF_JMP_REG(BPF_JGT, R1, R2, 0); 2770 2771 return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234); 2772 } 2773 2774 static int bpf_fill_staggered_jge_reg(struct bpf_test *self) 2775 { 2776 struct bpf_insn jmp = BPF_JMP_REG(BPF_JGE, R1, R2, 0); 2777 2778 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2779 } 2780 2781 static int bpf_fill_staggered_jlt_reg(struct bpf_test *self) 2782 { 2783 struct bpf_insn jmp = BPF_JMP_REG(BPF_JLT, R1, R2, 0); 2784 2785 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000); 2786 } 2787 2788 static int bpf_fill_staggered_jle_reg(struct bpf_test *self) 2789 { 2790 struct bpf_insn jmp = BPF_JMP_REG(BPF_JLE, R1, R2, 0); 2791 2792 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2793 } 2794 2795 static int bpf_fill_staggered_jsgt_reg(struct bpf_test *self) 2796 { 2797 struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGT, R1, R2, 0); 2798 2799 return __bpf_fill_staggered_jumps(self, &jmp, -1, -2); 2800 } 2801 2802 static int bpf_fill_staggered_jsge_reg(struct bpf_test *self) 2803 { 2804 struct bpf_insn jmp = BPF_JMP_REG(BPF_JSGE, R1, R2, 0); 2805 2806 return __bpf_fill_staggered_jumps(self, &jmp, -2, -2); 2807 } 2808 2809 static int bpf_fill_staggered_jslt_reg(struct bpf_test *self) 2810 { 2811 struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLT, R1, R2, 0); 2812 2813 return __bpf_fill_staggered_jumps(self, &jmp, -2, -1); 2814 } 2815 2816 static int bpf_fill_staggered_jsle_reg(struct bpf_test *self) 2817 { 2818 struct bpf_insn jmp = BPF_JMP_REG(BPF_JSLE, R1, R2, 0); 2819 2820 return __bpf_fill_staggered_jumps(self, &jmp, -1, -1); 2821 } 2822 2823 /* 32-bit immediate jumps */ 2824 static int bpf_fill_staggered_jeq32_imm(struct bpf_test *self) 2825 { 2826 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JEQ, R1, 1234, 0); 2827 2828 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2829 } 2830 2831 static int bpf_fill_staggered_jne32_imm(struct bpf_test *self) 2832 { 2833 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JNE, R1, 1234, 0); 2834 2835 return __bpf_fill_staggered_jumps(self, &jmp, 4321, 0); 2836 } 2837 2838 static int bpf_fill_staggered_jset32_imm(struct bpf_test *self) 2839 { 2840 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSET, R1, 0x82, 0); 2841 2842 return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0); 2843 } 2844 2845 static int bpf_fill_staggered_jgt32_imm(struct bpf_test *self) 2846 { 2847 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGT, R1, 1234, 0); 2848 2849 return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 0); 2850 } 2851 2852 static int bpf_fill_staggered_jge32_imm(struct bpf_test *self) 2853 { 2854 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JGE, R1, 1234, 0); 2855 2856 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2857 } 2858 2859 static int bpf_fill_staggered_jlt32_imm(struct bpf_test *self) 2860 { 2861 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLT, R1, 0x80000000, 0); 2862 2863 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2864 } 2865 2866 static int bpf_fill_staggered_jle32_imm(struct bpf_test *self) 2867 { 2868 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JLE, R1, 1234, 0); 2869 2870 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0); 2871 } 2872 2873 static int bpf_fill_staggered_jsgt32_imm(struct bpf_test *self) 2874 { 2875 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGT, R1, -2, 0); 2876 2877 return __bpf_fill_staggered_jumps(self, &jmp, -1, 0); 2878 } 2879 2880 static int bpf_fill_staggered_jsge32_imm(struct bpf_test *self) 2881 { 2882 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSGE, R1, -2, 0); 2883 2884 return __bpf_fill_staggered_jumps(self, &jmp, -2, 0); 2885 } 2886 2887 static int bpf_fill_staggered_jslt32_imm(struct bpf_test *self) 2888 { 2889 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLT, R1, -1, 0); 2890 2891 return __bpf_fill_staggered_jumps(self, &jmp, -2, 0); 2892 } 2893 2894 static int bpf_fill_staggered_jsle32_imm(struct bpf_test *self) 2895 { 2896 struct bpf_insn jmp = BPF_JMP32_IMM(BPF_JSLE, R1, -1, 0); 2897 2898 return __bpf_fill_staggered_jumps(self, &jmp, -1, 0); 2899 } 2900 2901 /* 32-bit register jumps */ 2902 static int bpf_fill_staggered_jeq32_reg(struct bpf_test *self) 2903 { 2904 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JEQ, R1, R2, 0); 2905 2906 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2907 } 2908 2909 static int bpf_fill_staggered_jne32_reg(struct bpf_test *self) 2910 { 2911 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JNE, R1, R2, 0); 2912 2913 return __bpf_fill_staggered_jumps(self, &jmp, 4321, 1234); 2914 } 2915 2916 static int bpf_fill_staggered_jset32_reg(struct bpf_test *self) 2917 { 2918 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSET, R1, R2, 0); 2919 2920 return __bpf_fill_staggered_jumps(self, &jmp, 0x86, 0x82); 2921 } 2922 2923 static int bpf_fill_staggered_jgt32_reg(struct bpf_test *self) 2924 { 2925 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGT, R1, R2, 0); 2926 2927 return __bpf_fill_staggered_jumps(self, &jmp, 0x80000000, 1234); 2928 } 2929 2930 static int bpf_fill_staggered_jge32_reg(struct bpf_test *self) 2931 { 2932 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JGE, R1, R2, 0); 2933 2934 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2935 } 2936 2937 static int bpf_fill_staggered_jlt32_reg(struct bpf_test *self) 2938 { 2939 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLT, R1, R2, 0); 2940 2941 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 0x80000000); 2942 } 2943 2944 static int bpf_fill_staggered_jle32_reg(struct bpf_test *self) 2945 { 2946 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JLE, R1, R2, 0); 2947 2948 return __bpf_fill_staggered_jumps(self, &jmp, 1234, 1234); 2949 } 2950 2951 static int bpf_fill_staggered_jsgt32_reg(struct bpf_test *self) 2952 { 2953 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGT, R1, R2, 0); 2954 2955 return __bpf_fill_staggered_jumps(self, &jmp, -1, -2); 2956 } 2957 2958 static int bpf_fill_staggered_jsge32_reg(struct bpf_test *self) 2959 { 2960 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSGE, R1, R2, 0); 2961 2962 return __bpf_fill_staggered_jumps(self, &jmp, -2, -2); 2963 } 2964 2965 static int bpf_fill_staggered_jslt32_reg(struct bpf_test *self) 2966 { 2967 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLT, R1, R2, 0); 2968 2969 return __bpf_fill_staggered_jumps(self, &jmp, -2, -1); 2970 } 2971 2972 static int bpf_fill_staggered_jsle32_reg(struct bpf_test *self) 2973 { 2974 struct bpf_insn jmp = BPF_JMP32_REG(BPF_JSLE, R1, R2, 0); 2975 2976 return __bpf_fill_staggered_jumps(self, &jmp, -1, -1); 2977 } 2978 2979 2980 static struct bpf_test tests[] = { 2981 { 2982 "TAX", 2983 .u.insns = { 2984 BPF_STMT(BPF_LD | BPF_IMM, 1), 2985 BPF_STMT(BPF_MISC | BPF_TAX, 0), 2986 BPF_STMT(BPF_LD | BPF_IMM, 2), 2987 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 2988 BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */ 2989 BPF_STMT(BPF_MISC | BPF_TAX, 0), 2990 BPF_STMT(BPF_LD | BPF_LEN, 0), 2991 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 2992 BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */ 2993 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1), 2994 BPF_STMT(BPF_RET | BPF_A, 0) 2995 }, 2996 CLASSIC, 2997 { 10, 20, 30, 40, 50 }, 2998 { { 2, 10 }, { 3, 20 }, { 4, 30 } }, 2999 }, 3000 { 3001 "TXA", 3002 .u.insns = { 3003 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3004 BPF_STMT(BPF_MISC | BPF_TXA, 0), 3005 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3006 BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */ 3007 }, 3008 CLASSIC, 3009 { 10, 20, 30, 40, 50 }, 3010 { { 1, 2 }, { 3, 6 }, { 4, 8 } }, 3011 }, 3012 { 3013 "ADD_SUB_MUL_K", 3014 .u.insns = { 3015 BPF_STMT(BPF_LD | BPF_IMM, 1), 3016 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2), 3017 BPF_STMT(BPF_LDX | BPF_IMM, 3), 3018 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0), 3019 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff), 3020 BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3), 3021 BPF_STMT(BPF_RET | BPF_A, 0) 3022 }, 3023 CLASSIC | FLAG_NO_DATA, 3024 { }, 3025 { { 0, 0xfffffffd } } 3026 }, 3027 { 3028 "DIV_MOD_KX", 3029 .u.insns = { 3030 BPF_STMT(BPF_LD | BPF_IMM, 8), 3031 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2), 3032 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3033 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff), 3034 BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0), 3035 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3036 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff), 3037 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000), 3038 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3039 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff), 3040 BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0), 3041 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3042 BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff), 3043 BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000), 3044 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3045 BPF_STMT(BPF_RET | BPF_A, 0) 3046 }, 3047 CLASSIC | FLAG_NO_DATA, 3048 { }, 3049 { { 0, 0x20000000 } } 3050 }, 3051 { 3052 "AND_OR_LSH_K", 3053 .u.insns = { 3054 BPF_STMT(BPF_LD | BPF_IMM, 0xff), 3055 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0), 3056 BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27), 3057 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3058 BPF_STMT(BPF_LD | BPF_IMM, 0xf), 3059 BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0), 3060 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3061 BPF_STMT(BPF_RET | BPF_A, 0) 3062 }, 3063 CLASSIC | FLAG_NO_DATA, 3064 { }, 3065 { { 0, 0x800000ff }, { 1, 0x800000ff } }, 3066 }, 3067 { 3068 "LD_IMM_0", 3069 .u.insns = { 3070 BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */ 3071 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0), 3072 BPF_STMT(BPF_RET | BPF_K, 0), 3073 BPF_STMT(BPF_RET | BPF_K, 1), 3074 }, 3075 CLASSIC, 3076 { }, 3077 { { 1, 1 } }, 3078 }, 3079 { 3080 "LD_IND", 3081 .u.insns = { 3082 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3083 BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K), 3084 BPF_STMT(BPF_RET | BPF_K, 1) 3085 }, 3086 CLASSIC, 3087 { }, 3088 { { 1, 0 }, { 10, 0 }, { 60, 0 } }, 3089 }, 3090 { 3091 "LD_ABS", 3092 .u.insns = { 3093 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000), 3094 BPF_STMT(BPF_RET | BPF_K, 1) 3095 }, 3096 CLASSIC, 3097 { }, 3098 { { 1, 0 }, { 10, 0 }, { 60, 0 } }, 3099 }, 3100 { 3101 "LD_ABS_LL", 3102 .u.insns = { 3103 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF), 3104 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3105 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1), 3106 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3107 BPF_STMT(BPF_RET | BPF_A, 0) 3108 }, 3109 CLASSIC, 3110 { 1, 2, 3 }, 3111 { { 1, 0 }, { 2, 3 } }, 3112 }, 3113 { 3114 "LD_IND_LL", 3115 .u.insns = { 3116 BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1), 3117 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3118 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3119 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3120 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0), 3121 BPF_STMT(BPF_RET | BPF_A, 0) 3122 }, 3123 CLASSIC, 3124 { 1, 2, 3, 0xff }, 3125 { { 1, 1 }, { 3, 3 }, { 4, 0xff } }, 3126 }, 3127 { 3128 "LD_ABS_NET", 3129 .u.insns = { 3130 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF), 3131 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3132 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1), 3133 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3134 BPF_STMT(BPF_RET | BPF_A, 0) 3135 }, 3136 CLASSIC, 3137 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 }, 3138 { { 15, 0 }, { 16, 3 } }, 3139 }, 3140 { 3141 "LD_IND_NET", 3142 .u.insns = { 3143 BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15), 3144 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3145 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 3146 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3147 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0), 3148 BPF_STMT(BPF_RET | BPF_A, 0) 3149 }, 3150 CLASSIC, 3151 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 }, 3152 { { 14, 0 }, { 15, 1 }, { 17, 3 } }, 3153 }, 3154 { 3155 "LD_PKTTYPE", 3156 .u.insns = { 3157 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3158 SKF_AD_OFF + SKF_AD_PKTTYPE), 3159 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0), 3160 BPF_STMT(BPF_RET | BPF_K, 1), 3161 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3162 SKF_AD_OFF + SKF_AD_PKTTYPE), 3163 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0), 3164 BPF_STMT(BPF_RET | BPF_K, 1), 3165 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3166 SKF_AD_OFF + SKF_AD_PKTTYPE), 3167 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0), 3168 BPF_STMT(BPF_RET | BPF_K, 1), 3169 BPF_STMT(BPF_RET | BPF_A, 0) 3170 }, 3171 CLASSIC, 3172 { }, 3173 { { 1, 3 }, { 10, 3 } }, 3174 }, 3175 { 3176 "LD_MARK", 3177 .u.insns = { 3178 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3179 SKF_AD_OFF + SKF_AD_MARK), 3180 BPF_STMT(BPF_RET | BPF_A, 0) 3181 }, 3182 CLASSIC, 3183 { }, 3184 { { 1, SKB_MARK}, { 10, SKB_MARK} }, 3185 }, 3186 { 3187 "LD_RXHASH", 3188 .u.insns = { 3189 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3190 SKF_AD_OFF + SKF_AD_RXHASH), 3191 BPF_STMT(BPF_RET | BPF_A, 0) 3192 }, 3193 CLASSIC, 3194 { }, 3195 { { 1, SKB_HASH}, { 10, SKB_HASH} }, 3196 }, 3197 { 3198 "LD_QUEUE", 3199 .u.insns = { 3200 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3201 SKF_AD_OFF + SKF_AD_QUEUE), 3202 BPF_STMT(BPF_RET | BPF_A, 0) 3203 }, 3204 CLASSIC, 3205 { }, 3206 { { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } }, 3207 }, 3208 { 3209 "LD_PROTOCOL", 3210 .u.insns = { 3211 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1), 3212 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0), 3213 BPF_STMT(BPF_RET | BPF_K, 0), 3214 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3215 SKF_AD_OFF + SKF_AD_PROTOCOL), 3216 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3217 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2), 3218 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0), 3219 BPF_STMT(BPF_RET | BPF_K, 0), 3220 BPF_STMT(BPF_MISC | BPF_TXA, 0), 3221 BPF_STMT(BPF_RET | BPF_A, 0) 3222 }, 3223 CLASSIC, 3224 { 10, 20, 30 }, 3225 { { 10, ETH_P_IP }, { 100, ETH_P_IP } }, 3226 }, 3227 { 3228 "LD_VLAN_TAG", 3229 .u.insns = { 3230 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3231 SKF_AD_OFF + SKF_AD_VLAN_TAG), 3232 BPF_STMT(BPF_RET | BPF_A, 0) 3233 }, 3234 CLASSIC, 3235 { }, 3236 { 3237 { 1, SKB_VLAN_TCI }, 3238 { 10, SKB_VLAN_TCI } 3239 }, 3240 }, 3241 { 3242 "LD_VLAN_TAG_PRESENT", 3243 .u.insns = { 3244 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3245 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT), 3246 BPF_STMT(BPF_RET | BPF_A, 0) 3247 }, 3248 CLASSIC, 3249 { }, 3250 { 3251 { 1, SKB_VLAN_PRESENT }, 3252 { 10, SKB_VLAN_PRESENT } 3253 }, 3254 }, 3255 { 3256 "LD_IFINDEX", 3257 .u.insns = { 3258 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3259 SKF_AD_OFF + SKF_AD_IFINDEX), 3260 BPF_STMT(BPF_RET | BPF_A, 0) 3261 }, 3262 CLASSIC, 3263 { }, 3264 { { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } }, 3265 }, 3266 { 3267 "LD_HATYPE", 3268 .u.insns = { 3269 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3270 SKF_AD_OFF + SKF_AD_HATYPE), 3271 BPF_STMT(BPF_RET | BPF_A, 0) 3272 }, 3273 CLASSIC, 3274 { }, 3275 { { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } }, 3276 }, 3277 { 3278 "LD_CPU", 3279 .u.insns = { 3280 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3281 SKF_AD_OFF + SKF_AD_CPU), 3282 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3283 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3284 SKF_AD_OFF + SKF_AD_CPU), 3285 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0), 3286 BPF_STMT(BPF_RET | BPF_A, 0) 3287 }, 3288 CLASSIC, 3289 { }, 3290 { { 1, 0 }, { 10, 0 } }, 3291 }, 3292 { 3293 "LD_NLATTR", 3294 .u.insns = { 3295 BPF_STMT(BPF_LDX | BPF_IMM, 2), 3296 BPF_STMT(BPF_MISC | BPF_TXA, 0), 3297 BPF_STMT(BPF_LDX | BPF_IMM, 3), 3298 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3299 SKF_AD_OFF + SKF_AD_NLATTR), 3300 BPF_STMT(BPF_RET | BPF_A, 0) 3301 }, 3302 CLASSIC, 3303 #ifdef __BIG_ENDIAN 3304 { 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 }, 3305 #else 3306 { 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 }, 3307 #endif 3308 { { 4, 0 }, { 20, 6 } }, 3309 }, 3310 { 3311 "LD_NLATTR_NEST", 3312 .u.insns = { 3313 BPF_STMT(BPF_LD | BPF_IMM, 2), 3314 BPF_STMT(BPF_LDX | BPF_IMM, 3), 3315 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3316 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3317 BPF_STMT(BPF_LD | BPF_IMM, 2), 3318 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3319 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3320 BPF_STMT(BPF_LD | BPF_IMM, 2), 3321 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3322 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3323 BPF_STMT(BPF_LD | BPF_IMM, 2), 3324 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3325 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3326 BPF_STMT(BPF_LD | BPF_IMM, 2), 3327 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3328 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3329 BPF_STMT(BPF_LD | BPF_IMM, 2), 3330 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3331 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3332 BPF_STMT(BPF_LD | BPF_IMM, 2), 3333 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3334 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3335 BPF_STMT(BPF_LD | BPF_IMM, 2), 3336 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3337 SKF_AD_OFF + SKF_AD_NLATTR_NEST), 3338 BPF_STMT(BPF_RET | BPF_A, 0) 3339 }, 3340 CLASSIC, 3341 #ifdef __BIG_ENDIAN 3342 { 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 }, 3343 #else 3344 { 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 }, 3345 #endif 3346 { { 4, 0 }, { 20, 10 } }, 3347 }, 3348 { 3349 "LD_PAYLOAD_OFF", 3350 .u.insns = { 3351 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3352 SKF_AD_OFF + SKF_AD_PAY_OFFSET), 3353 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3354 SKF_AD_OFF + SKF_AD_PAY_OFFSET), 3355 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3356 SKF_AD_OFF + SKF_AD_PAY_OFFSET), 3357 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3358 SKF_AD_OFF + SKF_AD_PAY_OFFSET), 3359 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3360 SKF_AD_OFF + SKF_AD_PAY_OFFSET), 3361 BPF_STMT(BPF_RET | BPF_A, 0) 3362 }, 3363 CLASSIC, 3364 /* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800), 3365 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request, 3366 * id 9737, seq 1, length 64 3367 */ 3368 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 3369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 3370 0x08, 0x00, 3371 0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40, 3372 0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 }, 3373 { { 30, 0 }, { 100, 42 } }, 3374 }, 3375 { 3376 "LD_ANC_XOR", 3377 .u.insns = { 3378 BPF_STMT(BPF_LD | BPF_IMM, 10), 3379 BPF_STMT(BPF_LDX | BPF_IMM, 300), 3380 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 3381 SKF_AD_OFF + SKF_AD_ALU_XOR_X), 3382 BPF_STMT(BPF_RET | BPF_A, 0) 3383 }, 3384 CLASSIC, 3385 { }, 3386 { { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } }, 3387 }, 3388 { 3389 "SPILL_FILL", 3390 .u.insns = { 3391 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3392 BPF_STMT(BPF_LD | BPF_IMM, 2), 3393 BPF_STMT(BPF_ALU | BPF_RSH, 1), 3394 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0), 3395 BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */ 3396 BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000), 3397 BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */ 3398 BPF_STMT(BPF_STX, 15), /* M3 = len */ 3399 BPF_STMT(BPF_LDX | BPF_MEM, 1), 3400 BPF_STMT(BPF_LD | BPF_MEM, 2), 3401 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0), 3402 BPF_STMT(BPF_LDX | BPF_MEM, 15), 3403 BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0), 3404 BPF_STMT(BPF_RET | BPF_A, 0) 3405 }, 3406 CLASSIC, 3407 { }, 3408 { { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } } 3409 }, 3410 { 3411 "JEQ", 3412 .u.insns = { 3413 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3414 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2), 3415 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1), 3416 BPF_STMT(BPF_RET | BPF_K, 1), 3417 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3418 }, 3419 CLASSIC, 3420 { 3, 3, 3, 3, 3 }, 3421 { { 1, 0 }, { 3, 1 }, { 4, MAX_K } }, 3422 }, 3423 { 3424 "JGT", 3425 .u.insns = { 3426 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3427 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2), 3428 BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1), 3429 BPF_STMT(BPF_RET | BPF_K, 1), 3430 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3431 }, 3432 CLASSIC, 3433 { 4, 4, 4, 3, 3 }, 3434 { { 2, 0 }, { 3, 1 }, { 4, MAX_K } }, 3435 }, 3436 { 3437 "JGE (jt 0), test 1", 3438 .u.insns = { 3439 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3440 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2), 3441 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1), 3442 BPF_STMT(BPF_RET | BPF_K, 1), 3443 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3444 }, 3445 CLASSIC, 3446 { 4, 4, 4, 3, 3 }, 3447 { { 2, 0 }, { 3, 1 }, { 4, 1 } }, 3448 }, 3449 { 3450 "JGE (jt 0), test 2", 3451 .u.insns = { 3452 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3453 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2), 3454 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1), 3455 BPF_STMT(BPF_RET | BPF_K, 1), 3456 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3457 }, 3458 CLASSIC, 3459 { 4, 4, 5, 3, 3 }, 3460 { { 4, 1 }, { 5, 1 }, { 6, MAX_K } }, 3461 }, 3462 { 3463 "JGE", 3464 .u.insns = { 3465 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3466 BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K), 3467 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0), 3468 BPF_STMT(BPF_RET | BPF_K, 10), 3469 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0), 3470 BPF_STMT(BPF_RET | BPF_K, 20), 3471 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0), 3472 BPF_STMT(BPF_RET | BPF_K, 30), 3473 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0), 3474 BPF_STMT(BPF_RET | BPF_K, 40), 3475 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3476 }, 3477 CLASSIC, 3478 { 1, 2, 3, 4, 5 }, 3479 { { 1, 20 }, { 3, 40 }, { 5, MAX_K } }, 3480 }, 3481 { 3482 "JSET", 3483 .u.insns = { 3484 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0), 3485 BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1), 3486 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0), 3487 BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0), 3488 BPF_STMT(BPF_LDX | BPF_LEN, 0), 3489 BPF_STMT(BPF_MISC | BPF_TXA, 0), 3490 BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4), 3491 BPF_STMT(BPF_MISC | BPF_TAX, 0), 3492 BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0), 3493 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1), 3494 BPF_STMT(BPF_RET | BPF_K, 10), 3495 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1), 3496 BPF_STMT(BPF_RET | BPF_K, 20), 3497 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0), 3498 BPF_STMT(BPF_RET | BPF_K, 30), 3499 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0), 3500 BPF_STMT(BPF_RET | BPF_K, 30), 3501 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0), 3502 BPF_STMT(BPF_RET | BPF_K, 30), 3503 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0), 3504 BPF_STMT(BPF_RET | BPF_K, 30), 3505 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0), 3506 BPF_STMT(BPF_RET | BPF_K, 30), 3507 BPF_STMT(BPF_RET | BPF_K, MAX_K) 3508 }, 3509 CLASSIC, 3510 { 0, 0xAA, 0x55, 1 }, 3511 { { 4, 10 }, { 5, 20 }, { 6, MAX_K } }, 3512 }, 3513 { 3514 "tcpdump port 22", 3515 .u.insns = { 3516 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12), 3517 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */ 3518 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20), 3519 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0), 3520 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0), 3521 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17), 3522 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54), 3523 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0), 3524 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56), 3525 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13), 3526 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */ 3527 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23), 3528 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0), 3529 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0), 3530 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8), 3531 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20), 3532 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0), 3533 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14), 3534 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14), 3535 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0), 3536 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16), 3537 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1), 3538 BPF_STMT(BPF_RET | BPF_K, 0xffff), 3539 BPF_STMT(BPF_RET | BPF_K, 0), 3540 }, 3541 CLASSIC, 3542 /* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800) 3543 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.], 3544 * seq 1305692979:1305693027, ack 3650467037, win 65535, 3545 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48 3546 */ 3547 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 3548 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76, 3549 0x08, 0x00, 3550 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5, 3551 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */ 3552 0x0a, 0x01, 0x01, 0x95, /* ip src */ 3553 0x0a, 0x01, 0x02, 0x0a, /* ip dst */ 3554 0xc2, 0x24, 3555 0x00, 0x16 /* dst port */ }, 3556 { { 10, 0 }, { 30, 0 }, { 100, 65535 } }, 3557 }, 3558 { 3559 "tcpdump complex", 3560 .u.insns = { 3561 /* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] - 3562 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and 3563 * (len > 115 or len < 30000000000)' -d 3564 */ 3565 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12), 3566 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0), 3567 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29), 3568 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23), 3569 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27), 3570 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20), 3571 BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0), 3572 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14), 3573 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14), 3574 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0), 3575 BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16), 3576 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20), 3577 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16), 3578 BPF_STMT(BPF_ST, 1), 3579 BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14), 3580 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf), 3581 BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2), 3582 BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */ 3583 BPF_STMT(BPF_LD | BPF_MEM, 1), 3584 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0), 3585 BPF_STMT(BPF_ST, 5), 3586 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14), 3587 BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26), 3588 BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0), 3589 BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2), 3590 BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */ 3591 BPF_STMT(BPF_LD | BPF_MEM, 5), 3592 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0), 3593 BPF_STMT(BPF_LD | BPF_LEN, 0), 3594 BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0), 3595 BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0), 3596 BPF_STMT(BPF_RET | BPF_K, 0xffff), 3597 BPF_STMT(BPF_RET | BPF_K, 0), 3598 }, 3599 CLASSIC, 3600 { 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6, 3601 0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76, 3602 0x08, 0x00, 3603 0x45, 0x10, 0x00, 0x64, 0x75, 0xb5, 3604 0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */ 3605 0x0a, 0x01, 0x01, 0x95, /* ip src */ 3606 0x0a, 0x01, 0x02, 0x0a, /* ip dst */ 3607 0xc2, 0x24, 3608 0x00, 0x16 /* dst port */ }, 3609 { { 10, 0 }, { 30, 0 }, { 100, 65535 } }, 3610 }, 3611 { 3612 "RET_A", 3613 .u.insns = { 3614 /* check that uninitialized X and A contain zeros */ 3615 BPF_STMT(BPF_MISC | BPF_TXA, 0), 3616 BPF_STMT(BPF_RET | BPF_A, 0) 3617 }, 3618 CLASSIC, 3619 { }, 3620 { {1, 0}, {2, 0} }, 3621 }, 3622 { 3623 "INT: ADD trivial", 3624 .u.insns_int = { 3625 BPF_ALU64_IMM(BPF_MOV, R1, 1), 3626 BPF_ALU64_IMM(BPF_ADD, R1, 2), 3627 BPF_ALU64_IMM(BPF_MOV, R2, 3), 3628 BPF_ALU64_REG(BPF_SUB, R1, R2), 3629 BPF_ALU64_IMM(BPF_ADD, R1, -1), 3630 BPF_ALU64_IMM(BPF_MUL, R1, 3), 3631 BPF_ALU64_REG(BPF_MOV, R0, R1), 3632 BPF_EXIT_INSN(), 3633 }, 3634 INTERNAL, 3635 { }, 3636 { { 0, 0xfffffffd } } 3637 }, 3638 { 3639 "INT: MUL_X", 3640 .u.insns_int = { 3641 BPF_ALU64_IMM(BPF_MOV, R0, -1), 3642 BPF_ALU64_IMM(BPF_MOV, R1, -1), 3643 BPF_ALU64_IMM(BPF_MOV, R2, 3), 3644 BPF_ALU64_REG(BPF_MUL, R1, R2), 3645 BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1), 3646 BPF_EXIT_INSN(), 3647 BPF_ALU64_IMM(BPF_MOV, R0, 1), 3648 BPF_EXIT_INSN(), 3649 }, 3650 INTERNAL, 3651 { }, 3652 { { 0, 1 } } 3653 }, 3654 { 3655 "INT: MUL_X2", 3656 .u.insns_int = { 3657 BPF_ALU32_IMM(BPF_MOV, R0, -1), 3658 BPF_ALU32_IMM(BPF_MOV, R1, -1), 3659 BPF_ALU32_IMM(BPF_MOV, R2, 3), 3660 BPF_ALU64_REG(BPF_MUL, R1, R2), 3661 BPF_ALU64_IMM(BPF_RSH, R1, 8), 3662 BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1), 3663 BPF_EXIT_INSN(), 3664 BPF_ALU32_IMM(BPF_MOV, R0, 1), 3665 BPF_EXIT_INSN(), 3666 }, 3667 INTERNAL, 3668 { }, 3669 { { 0, 1 } } 3670 }, 3671 { 3672 "INT: MUL32_X", 3673 .u.insns_int = { 3674 BPF_ALU32_IMM(BPF_MOV, R0, -1), 3675 BPF_ALU64_IMM(BPF_MOV, R1, -1), 3676 BPF_ALU32_IMM(BPF_MOV, R2, 3), 3677 BPF_ALU32_REG(BPF_MUL, R1, R2), 3678 BPF_ALU64_IMM(BPF_RSH, R1, 8), 3679 BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1), 3680 BPF_EXIT_INSN(), 3681 BPF_ALU32_IMM(BPF_MOV, R0, 1), 3682 BPF_EXIT_INSN(), 3683 }, 3684 INTERNAL, 3685 { }, 3686 { { 0, 1 } } 3687 }, 3688 { 3689 /* Have to test all register combinations, since 3690 * JITing of different registers will produce 3691 * different asm code. 3692 */ 3693 "INT: ADD 64-bit", 3694 .u.insns_int = { 3695 BPF_ALU64_IMM(BPF_MOV, R0, 0), 3696 BPF_ALU64_IMM(BPF_MOV, R1, 1), 3697 BPF_ALU64_IMM(BPF_MOV, R2, 2), 3698 BPF_ALU64_IMM(BPF_MOV, R3, 3), 3699 BPF_ALU64_IMM(BPF_MOV, R4, 4), 3700 BPF_ALU64_IMM(BPF_MOV, R5, 5), 3701 BPF_ALU64_IMM(BPF_MOV, R6, 6), 3702 BPF_ALU64_IMM(BPF_MOV, R7, 7), 3703 BPF_ALU64_IMM(BPF_MOV, R8, 8), 3704 BPF_ALU64_IMM(BPF_MOV, R9, 9), 3705 BPF_ALU64_IMM(BPF_ADD, R0, 20), 3706 BPF_ALU64_IMM(BPF_ADD, R1, 20), 3707 BPF_ALU64_IMM(BPF_ADD, R2, 20), 3708 BPF_ALU64_IMM(BPF_ADD, R3, 20), 3709 BPF_ALU64_IMM(BPF_ADD, R4, 20), 3710 BPF_ALU64_IMM(BPF_ADD, R5, 20), 3711 BPF_ALU64_IMM(BPF_ADD, R6, 20), 3712 BPF_ALU64_IMM(BPF_ADD, R7, 20), 3713 BPF_ALU64_IMM(BPF_ADD, R8, 20), 3714 BPF_ALU64_IMM(BPF_ADD, R9, 20), 3715 BPF_ALU64_IMM(BPF_SUB, R0, 10), 3716 BPF_ALU64_IMM(BPF_SUB, R1, 10), 3717 BPF_ALU64_IMM(BPF_SUB, R2, 10), 3718 BPF_ALU64_IMM(BPF_SUB, R3, 10), 3719 BPF_ALU64_IMM(BPF_SUB, R4, 10), 3720 BPF_ALU64_IMM(BPF_SUB, R5, 10), 3721 BPF_ALU64_IMM(BPF_SUB, R6, 10), 3722 BPF_ALU64_IMM(BPF_SUB, R7, 10), 3723 BPF_ALU64_IMM(BPF_SUB, R8, 10), 3724 BPF_ALU64_IMM(BPF_SUB, R9, 10), 3725 BPF_ALU64_REG(BPF_ADD, R0, R0), 3726 BPF_ALU64_REG(BPF_ADD, R0, R1), 3727 BPF_ALU64_REG(BPF_ADD, R0, R2), 3728 BPF_ALU64_REG(BPF_ADD, R0, R3), 3729 BPF_ALU64_REG(BPF_ADD, R0, R4), 3730 BPF_ALU64_REG(BPF_ADD, R0, R5), 3731 BPF_ALU64_REG(BPF_ADD, R0, R6), 3732 BPF_ALU64_REG(BPF_ADD, R0, R7), 3733 BPF_ALU64_REG(BPF_ADD, R0, R8), 3734 BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */ 3735 BPF_JMP_IMM(BPF_JEQ, R0, 155, 1), 3736 BPF_EXIT_INSN(), 3737 BPF_ALU64_REG(BPF_ADD, R1, R0), 3738 BPF_ALU64_REG(BPF_ADD, R1, R1), 3739 BPF_ALU64_REG(BPF_ADD, R1, R2), 3740 BPF_ALU64_REG(BPF_ADD, R1, R3), 3741 BPF_ALU64_REG(BPF_ADD, R1, R4), 3742 BPF_ALU64_REG(BPF_ADD, R1, R5), 3743 BPF_ALU64_REG(BPF_ADD, R1, R6), 3744 BPF_ALU64_REG(BPF_ADD, R1, R7), 3745 BPF_ALU64_REG(BPF_ADD, R1, R8), 3746 BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */ 3747 BPF_JMP_IMM(BPF_JEQ, R1, 456, 1), 3748 BPF_EXIT_INSN(), 3749 BPF_ALU64_REG(BPF_ADD, R2, R0), 3750 BPF_ALU64_REG(BPF_ADD, R2, R1), 3751 BPF_ALU64_REG(BPF_ADD, R2, R2), 3752 BPF_ALU64_REG(BPF_ADD, R2, R3), 3753 BPF_ALU64_REG(BPF_ADD, R2, R4), 3754 BPF_ALU64_REG(BPF_ADD, R2, R5), 3755 BPF_ALU64_REG(BPF_ADD, R2, R6), 3756 BPF_ALU64_REG(BPF_ADD, R2, R7), 3757 BPF_ALU64_REG(BPF_ADD, R2, R8), 3758 BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */ 3759 BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1), 3760 BPF_EXIT_INSN(), 3761 BPF_ALU64_REG(BPF_ADD, R3, R0), 3762 BPF_ALU64_REG(BPF_ADD, R3, R1), 3763 BPF_ALU64_REG(BPF_ADD, R3, R2), 3764 BPF_ALU64_REG(BPF_ADD, R3, R3), 3765 BPF_ALU64_REG(BPF_ADD, R3, R4), 3766 BPF_ALU64_REG(BPF_ADD, R3, R5), 3767 BPF_ALU64_REG(BPF_ADD, R3, R6), 3768 BPF_ALU64_REG(BPF_ADD, R3, R7), 3769 BPF_ALU64_REG(BPF_ADD, R3, R8), 3770 BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */ 3771 BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1), 3772 BPF_EXIT_INSN(), 3773 BPF_ALU64_REG(BPF_ADD, R4, R0), 3774 BPF_ALU64_REG(BPF_ADD, R4, R1), 3775 BPF_ALU64_REG(BPF_ADD, R4, R2), 3776 BPF_ALU64_REG(BPF_ADD, R4, R3), 3777 BPF_ALU64_REG(BPF_ADD, R4, R4), 3778 BPF_ALU64_REG(BPF_ADD, R4, R5), 3779 BPF_ALU64_REG(BPF_ADD, R4, R6), 3780 BPF_ALU64_REG(BPF_ADD, R4, R7), 3781 BPF_ALU64_REG(BPF_ADD, R4, R8), 3782 BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */ 3783 BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1), 3784 BPF_EXIT_INSN(), 3785 BPF_ALU64_REG(BPF_ADD, R5, R0), 3786 BPF_ALU64_REG(BPF_ADD, R5, R1), 3787 BPF_ALU64_REG(BPF_ADD, R5, R2), 3788 BPF_ALU64_REG(BPF_ADD, R5, R3), 3789 BPF_ALU64_REG(BPF_ADD, R5, R4), 3790 BPF_ALU64_REG(BPF_ADD, R5, R5), 3791 BPF_ALU64_REG(BPF_ADD, R5, R6), 3792 BPF_ALU64_REG(BPF_ADD, R5, R7), 3793 BPF_ALU64_REG(BPF_ADD, R5, R8), 3794 BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */ 3795 BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1), 3796 BPF_EXIT_INSN(), 3797 BPF_ALU64_REG(BPF_ADD, R6, R0), 3798 BPF_ALU64_REG(BPF_ADD, R6, R1), 3799 BPF_ALU64_REG(BPF_ADD, R6, R2), 3800 BPF_ALU64_REG(BPF_ADD, R6, R3), 3801 BPF_ALU64_REG(BPF_ADD, R6, R4), 3802 BPF_ALU64_REG(BPF_ADD, R6, R5), 3803 BPF_ALU64_REG(BPF_ADD, R6, R6), 3804 BPF_ALU64_REG(BPF_ADD, R6, R7), 3805 BPF_ALU64_REG(BPF_ADD, R6, R8), 3806 BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */ 3807 BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1), 3808 BPF_EXIT_INSN(), 3809 BPF_ALU64_REG(BPF_ADD, R7, R0), 3810 BPF_ALU64_REG(BPF_ADD, R7, R1), 3811 BPF_ALU64_REG(BPF_ADD, R7, R2), 3812 BPF_ALU64_REG(BPF_ADD, R7, R3), 3813 BPF_ALU64_REG(BPF_ADD, R7, R4), 3814 BPF_ALU64_REG(BPF_ADD, R7, R5), 3815 BPF_ALU64_REG(BPF_ADD, R7, R6), 3816 BPF_ALU64_REG(BPF_ADD, R7, R7), 3817 BPF_ALU64_REG(BPF_ADD, R7, R8), 3818 BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */ 3819 BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1), 3820 BPF_EXIT_INSN(), 3821 BPF_ALU64_REG(BPF_ADD, R8, R0), 3822 BPF_ALU64_REG(BPF_ADD, R8, R1), 3823 BPF_ALU64_REG(BPF_ADD, R8, R2), 3824 BPF_ALU64_REG(BPF_ADD, R8, R3), 3825 BPF_ALU64_REG(BPF_ADD, R8, R4), 3826 BPF_ALU64_REG(BPF_ADD, R8, R5), 3827 BPF_ALU64_REG(BPF_ADD, R8, R6), 3828 BPF_ALU64_REG(BPF_ADD, R8, R7), 3829 BPF_ALU64_REG(BPF_ADD, R8, R8), 3830 BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */ 3831 BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1), 3832 BPF_EXIT_INSN(), 3833 BPF_ALU64_REG(BPF_ADD, R9, R0), 3834 BPF_ALU64_REG(BPF_ADD, R9, R1), 3835 BPF_ALU64_REG(BPF_ADD, R9, R2), 3836 BPF_ALU64_REG(BPF_ADD, R9, R3), 3837 BPF_ALU64_REG(BPF_ADD, R9, R4), 3838 BPF_ALU64_REG(BPF_ADD, R9, R5), 3839 BPF_ALU64_REG(BPF_ADD, R9, R6), 3840 BPF_ALU64_REG(BPF_ADD, R9, R7), 3841 BPF_ALU64_REG(BPF_ADD, R9, R8), 3842 BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */ 3843 BPF_ALU64_REG(BPF_MOV, R0, R9), 3844 BPF_EXIT_INSN(), 3845 }, 3846 INTERNAL, 3847 { }, 3848 { { 0, 2957380 } } 3849 }, 3850 { 3851 "INT: ADD 32-bit", 3852 .u.insns_int = { 3853 BPF_ALU32_IMM(BPF_MOV, R0, 20), 3854 BPF_ALU32_IMM(BPF_MOV, R1, 1), 3855 BPF_ALU32_IMM(BPF_MOV, R2, 2), 3856 BPF_ALU32_IMM(BPF_MOV, R3, 3), 3857 BPF_ALU32_IMM(BPF_MOV, R4, 4), 3858 BPF_ALU32_IMM(BPF_MOV, R5, 5), 3859 BPF_ALU32_IMM(BPF_MOV, R6, 6), 3860 BPF_ALU32_IMM(BPF_MOV, R7, 7), 3861 BPF_ALU32_IMM(BPF_MOV, R8, 8), 3862 BPF_ALU32_IMM(BPF_MOV, R9, 9), 3863 BPF_ALU64_IMM(BPF_ADD, R1, 10), 3864 BPF_ALU64_IMM(BPF_ADD, R2, 10), 3865 BPF_ALU64_IMM(BPF_ADD, R3, 10), 3866 BPF_ALU64_IMM(BPF_ADD, R4, 10), 3867 BPF_ALU64_IMM(BPF_ADD, R5, 10), 3868 BPF_ALU64_IMM(BPF_ADD, R6, 10), 3869 BPF_ALU64_IMM(BPF_ADD, R7, 10), 3870 BPF_ALU64_IMM(BPF_ADD, R8, 10), 3871 BPF_ALU64_IMM(BPF_ADD, R9, 10), 3872 BPF_ALU32_REG(BPF_ADD, R0, R1), 3873 BPF_ALU32_REG(BPF_ADD, R0, R2), 3874 BPF_ALU32_REG(BPF_ADD, R0, R3), 3875 BPF_ALU32_REG(BPF_ADD, R0, R4), 3876 BPF_ALU32_REG(BPF_ADD, R0, R5), 3877 BPF_ALU32_REG(BPF_ADD, R0, R6), 3878 BPF_ALU32_REG(BPF_ADD, R0, R7), 3879 BPF_ALU32_REG(BPF_ADD, R0, R8), 3880 BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */ 3881 BPF_JMP_IMM(BPF_JEQ, R0, 155, 1), 3882 BPF_EXIT_INSN(), 3883 BPF_ALU32_REG(BPF_ADD, R1, R0), 3884 BPF_ALU32_REG(BPF_ADD, R1, R1), 3885 BPF_ALU32_REG(BPF_ADD, R1, R2), 3886 BPF_ALU32_REG(BPF_ADD, R1, R3), 3887 BPF_ALU32_REG(BPF_ADD, R1, R4), 3888 BPF_ALU32_REG(BPF_ADD, R1, R5), 3889 BPF_ALU32_REG(BPF_ADD, R1, R6), 3890 BPF_ALU32_REG(BPF_ADD, R1, R7), 3891 BPF_ALU32_REG(BPF_ADD, R1, R8), 3892 BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */ 3893 BPF_JMP_IMM(BPF_JEQ, R1, 456, 1), 3894 BPF_EXIT_INSN(), 3895 BPF_ALU32_REG(BPF_ADD, R2, R0), 3896 BPF_ALU32_REG(BPF_ADD, R2, R1), 3897 BPF_ALU32_REG(BPF_ADD, R2, R2), 3898 BPF_ALU32_REG(BPF_ADD, R2, R3), 3899 BPF_ALU32_REG(BPF_ADD, R2, R4), 3900 BPF_ALU32_REG(BPF_ADD, R2, R5), 3901 BPF_ALU32_REG(BPF_ADD, R2, R6), 3902 BPF_ALU32_REG(BPF_ADD, R2, R7), 3903 BPF_ALU32_REG(BPF_ADD, R2, R8), 3904 BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */ 3905 BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1), 3906 BPF_EXIT_INSN(), 3907 BPF_ALU32_REG(BPF_ADD, R3, R0), 3908 BPF_ALU32_REG(BPF_ADD, R3, R1), 3909 BPF_ALU32_REG(BPF_ADD, R3, R2), 3910 BPF_ALU32_REG(BPF_ADD, R3, R3), 3911 BPF_ALU32_REG(BPF_ADD, R3, R4), 3912 BPF_ALU32_REG(BPF_ADD, R3, R5), 3913 BPF_ALU32_REG(BPF_ADD, R3, R6), 3914 BPF_ALU32_REG(BPF_ADD, R3, R7), 3915 BPF_ALU32_REG(BPF_ADD, R3, R8), 3916 BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */ 3917 BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1), 3918 BPF_EXIT_INSN(), 3919 BPF_ALU32_REG(BPF_ADD, R4, R0), 3920 BPF_ALU32_REG(BPF_ADD, R4, R1), 3921 BPF_ALU32_REG(BPF_ADD, R4, R2), 3922 BPF_ALU32_REG(BPF_ADD, R4, R3), 3923 BPF_ALU32_REG(BPF_ADD, R4, R4), 3924 BPF_ALU32_REG(BPF_ADD, R4, R5), 3925 BPF_ALU32_REG(BPF_ADD, R4, R6), 3926 BPF_ALU32_REG(BPF_ADD, R4, R7), 3927 BPF_ALU32_REG(BPF_ADD, R4, R8), 3928 BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */ 3929 BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1), 3930 BPF_EXIT_INSN(), 3931 BPF_ALU32_REG(BPF_ADD, R5, R0), 3932 BPF_ALU32_REG(BPF_ADD, R5, R1), 3933 BPF_ALU32_REG(BPF_ADD, R5, R2), 3934 BPF_ALU32_REG(BPF_ADD, R5, R3), 3935 BPF_ALU32_REG(BPF_ADD, R5, R4), 3936 BPF_ALU32_REG(BPF_ADD, R5, R5), 3937 BPF_ALU32_REG(BPF_ADD, R5, R6), 3938 BPF_ALU32_REG(BPF_ADD, R5, R7), 3939 BPF_ALU32_REG(BPF_ADD, R5, R8), 3940 BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */ 3941 BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1), 3942 BPF_EXIT_INSN(), 3943 BPF_ALU32_REG(BPF_ADD, R6, R0), 3944 BPF_ALU32_REG(BPF_ADD, R6, R1), 3945 BPF_ALU32_REG(BPF_ADD, R6, R2), 3946 BPF_ALU32_REG(BPF_ADD, R6, R3), 3947 BPF_ALU32_REG(BPF_ADD, R6, R4), 3948 BPF_ALU32_REG(BPF_ADD, R6, R5), 3949 BPF_ALU32_REG(BPF_ADD, R6, R6), 3950 BPF_ALU32_REG(BPF_ADD, R6, R7), 3951 BPF_ALU32_REG(BPF_ADD, R6, R8), 3952 BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */ 3953 BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1), 3954 BPF_EXIT_INSN(), 3955 BPF_ALU32_REG(BPF_ADD, R7, R0), 3956 BPF_ALU32_REG(BPF_ADD, R7, R1), 3957 BPF_ALU32_REG(BPF_ADD, R7, R2), 3958 BPF_ALU32_REG(BPF_ADD, R7, R3), 3959 BPF_ALU32_REG(BPF_ADD, R7, R4), 3960 BPF_ALU32_REG(BPF_ADD, R7, R5), 3961 BPF_ALU32_REG(BPF_ADD, R7, R6), 3962 BPF_ALU32_REG(BPF_ADD, R7, R7), 3963 BPF_ALU32_REG(BPF_ADD, R7, R8), 3964 BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */ 3965 BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1), 3966 BPF_EXIT_INSN(), 3967 BPF_ALU32_REG(BPF_ADD, R8, R0), 3968 BPF_ALU32_REG(BPF_ADD, R8, R1), 3969 BPF_ALU32_REG(BPF_ADD, R8, R2), 3970 BPF_ALU32_REG(BPF_ADD, R8, R3), 3971 BPF_ALU32_REG(BPF_ADD, R8, R4), 3972 BPF_ALU32_REG(BPF_ADD, R8, R5), 3973 BPF_ALU32_REG(BPF_ADD, R8, R6), 3974 BPF_ALU32_REG(BPF_ADD, R8, R7), 3975 BPF_ALU32_REG(BPF_ADD, R8, R8), 3976 BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */ 3977 BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1), 3978 BPF_EXIT_INSN(), 3979 BPF_ALU32_REG(BPF_ADD, R9, R0), 3980 BPF_ALU32_REG(BPF_ADD, R9, R1), 3981 BPF_ALU32_REG(BPF_ADD, R9, R2), 3982 BPF_ALU32_REG(BPF_ADD, R9, R3), 3983 BPF_ALU32_REG(BPF_ADD, R9, R4), 3984 BPF_ALU32_REG(BPF_ADD, R9, R5), 3985 BPF_ALU32_REG(BPF_ADD, R9, R6), 3986 BPF_ALU32_REG(BPF_ADD, R9, R7), 3987 BPF_ALU32_REG(BPF_ADD, R9, R8), 3988 BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */ 3989 BPF_ALU32_REG(BPF_MOV, R0, R9), 3990 BPF_EXIT_INSN(), 3991 }, 3992 INTERNAL, 3993 { }, 3994 { { 0, 2957380 } } 3995 }, 3996 { /* Mainly checking JIT here. */ 3997 "INT: SUB", 3998 .u.insns_int = { 3999 BPF_ALU64_IMM(BPF_MOV, R0, 0), 4000 BPF_ALU64_IMM(BPF_MOV, R1, 1), 4001 BPF_ALU64_IMM(BPF_MOV, R2, 2), 4002 BPF_ALU64_IMM(BPF_MOV, R3, 3), 4003 BPF_ALU64_IMM(BPF_MOV, R4, 4), 4004 BPF_ALU64_IMM(BPF_MOV, R5, 5), 4005 BPF_ALU64_IMM(BPF_MOV, R6, 6), 4006 BPF_ALU64_IMM(BPF_MOV, R7, 7), 4007 BPF_ALU64_IMM(BPF_MOV, R8, 8), 4008 BPF_ALU64_IMM(BPF_MOV, R9, 9), 4009 BPF_ALU64_REG(BPF_SUB, R0, R0), 4010 BPF_ALU64_REG(BPF_SUB, R0, R1), 4011 BPF_ALU64_REG(BPF_SUB, R0, R2), 4012 BPF_ALU64_REG(BPF_SUB, R0, R3), 4013 BPF_ALU64_REG(BPF_SUB, R0, R4), 4014 BPF_ALU64_REG(BPF_SUB, R0, R5), 4015 BPF_ALU64_REG(BPF_SUB, R0, R6), 4016 BPF_ALU64_REG(BPF_SUB, R0, R7), 4017 BPF_ALU64_REG(BPF_SUB, R0, R8), 4018 BPF_ALU64_REG(BPF_SUB, R0, R9), 4019 BPF_ALU64_IMM(BPF_SUB, R0, 10), 4020 BPF_JMP_IMM(BPF_JEQ, R0, -55, 1), 4021 BPF_EXIT_INSN(), 4022 BPF_ALU64_REG(BPF_SUB, R1, R0), 4023 BPF_ALU64_REG(BPF_SUB, R1, R2), 4024 BPF_ALU64_REG(BPF_SUB, R1, R3), 4025 BPF_ALU64_REG(BPF_SUB, R1, R4), 4026 BPF_ALU64_REG(BPF_SUB, R1, R5), 4027 BPF_ALU64_REG(BPF_SUB, R1, R6), 4028 BPF_ALU64_REG(BPF_SUB, R1, R7), 4029 BPF_ALU64_REG(BPF_SUB, R1, R8), 4030 BPF_ALU64_REG(BPF_SUB, R1, R9), 4031 BPF_ALU64_IMM(BPF_SUB, R1, 10), 4032 BPF_ALU64_REG(BPF_SUB, R2, R0), 4033 BPF_ALU64_REG(BPF_SUB, R2, R1), 4034 BPF_ALU64_REG(BPF_SUB, R2, R3), 4035 BPF_ALU64_REG(BPF_SUB, R2, R4), 4036 BPF_ALU64_REG(BPF_SUB, R2, R5), 4037 BPF_ALU64_REG(BPF_SUB, R2, R6), 4038 BPF_ALU64_REG(BPF_SUB, R2, R7), 4039 BPF_ALU64_REG(BPF_SUB, R2, R8), 4040 BPF_ALU64_REG(BPF_SUB, R2, R9), 4041 BPF_ALU64_IMM(BPF_SUB, R2, 10), 4042 BPF_ALU64_REG(BPF_SUB, R3, R0), 4043 BPF_ALU64_REG(BPF_SUB, R3, R1), 4044 BPF_ALU64_REG(BPF_SUB, R3, R2), 4045 BPF_ALU64_REG(BPF_SUB, R3, R4), 4046 BPF_ALU64_REG(BPF_SUB, R3, R5), 4047 BPF_ALU64_REG(BPF_SUB, R3, R6), 4048 BPF_ALU64_REG(BPF_SUB, R3, R7), 4049 BPF_ALU64_REG(BPF_SUB, R3, R8), 4050 BPF_ALU64_REG(BPF_SUB, R3, R9), 4051 BPF_ALU64_IMM(BPF_SUB, R3, 10), 4052 BPF_ALU64_REG(BPF_SUB, R4, R0), 4053 BPF_ALU64_REG(BPF_SUB, R4, R1), 4054 BPF_ALU64_REG(BPF_SUB, R4, R2), 4055 BPF_ALU64_REG(BPF_SUB, R4, R3), 4056 BPF_ALU64_REG(BPF_SUB, R4, R5), 4057 BPF_ALU64_REG(BPF_SUB, R4, R6), 4058 BPF_ALU64_REG(BPF_SUB, R4, R7), 4059 BPF_ALU64_REG(BPF_SUB, R4, R8), 4060 BPF_ALU64_REG(BPF_SUB, R4, R9), 4061 BPF_ALU64_IMM(BPF_SUB, R4, 10), 4062 BPF_ALU64_REG(BPF_SUB, R5, R0), 4063 BPF_ALU64_REG(BPF_SUB, R5, R1), 4064 BPF_ALU64_REG(BPF_SUB, R5, R2), 4065 BPF_ALU64_REG(BPF_SUB, R5, R3), 4066 BPF_ALU64_REG(BPF_SUB, R5, R4), 4067 BPF_ALU64_REG(BPF_SUB, R5, R6), 4068 BPF_ALU64_REG(BPF_SUB, R5, R7), 4069 BPF_ALU64_REG(BPF_SUB, R5, R8), 4070 BPF_ALU64_REG(BPF_SUB, R5, R9), 4071 BPF_ALU64_IMM(BPF_SUB, R5, 10), 4072 BPF_ALU64_REG(BPF_SUB, R6, R0), 4073 BPF_ALU64_REG(BPF_SUB, R6, R1), 4074 BPF_ALU64_REG(BPF_SUB, R6, R2), 4075 BPF_ALU64_REG(BPF_SUB, R6, R3), 4076 BPF_ALU64_REG(BPF_SUB, R6, R4), 4077 BPF_ALU64_REG(BPF_SUB, R6, R5), 4078 BPF_ALU64_REG(BPF_SUB, R6, R7), 4079 BPF_ALU64_REG(BPF_SUB, R6, R8), 4080 BPF_ALU64_REG(BPF_SUB, R6, R9), 4081 BPF_ALU64_IMM(BPF_SUB, R6, 10), 4082 BPF_ALU64_REG(BPF_SUB, R7, R0), 4083 BPF_ALU64_REG(BPF_SUB, R7, R1), 4084 BPF_ALU64_REG(BPF_SUB, R7, R2), 4085 BPF_ALU64_REG(BPF_SUB, R7, R3), 4086 BPF_ALU64_REG(BPF_SUB, R7, R4), 4087 BPF_ALU64_REG(BPF_SUB, R7, R5), 4088 BPF_ALU64_REG(BPF_SUB, R7, R6), 4089 BPF_ALU64_REG(BPF_SUB, R7, R8), 4090 BPF_ALU64_REG(BPF_SUB, R7, R9), 4091 BPF_ALU64_IMM(BPF_SUB, R7, 10), 4092 BPF_ALU64_REG(BPF_SUB, R8, R0), 4093 BPF_ALU64_REG(BPF_SUB, R8, R1), 4094 BPF_ALU64_REG(BPF_SUB, R8, R2), 4095 BPF_ALU64_REG(BPF_SUB, R8, R3), 4096 BPF_ALU64_REG(BPF_SUB, R8, R4), 4097 BPF_ALU64_REG(BPF_SUB, R8, R5), 4098 BPF_ALU64_REG(BPF_SUB, R8, R6), 4099 BPF_ALU64_REG(BPF_SUB, R8, R7), 4100 BPF_ALU64_REG(BPF_SUB, R8, R9), 4101 BPF_ALU64_IMM(BPF_SUB, R8, 10), 4102 BPF_ALU64_REG(BPF_SUB, R9, R0), 4103 BPF_ALU64_REG(BPF_SUB, R9, R1), 4104 BPF_ALU64_REG(BPF_SUB, R9, R2), 4105 BPF_ALU64_REG(BPF_SUB, R9, R3), 4106 BPF_ALU64_REG(BPF_SUB, R9, R4), 4107 BPF_ALU64_REG(BPF_SUB, R9, R5), 4108 BPF_ALU64_REG(BPF_SUB, R9, R6), 4109 BPF_ALU64_REG(BPF_SUB, R9, R7), 4110 BPF_ALU64_REG(BPF_SUB, R9, R8), 4111 BPF_ALU64_IMM(BPF_SUB, R9, 10), 4112 BPF_ALU64_IMM(BPF_SUB, R0, 10), 4113 BPF_ALU64_IMM(BPF_NEG, R0, 0), 4114 BPF_ALU64_REG(BPF_SUB, R0, R1), 4115 BPF_ALU64_REG(BPF_SUB, R0, R2), 4116 BPF_ALU64_REG(BPF_SUB, R0, R3), 4117 BPF_ALU64_REG(BPF_SUB, R0, R4), 4118 BPF_ALU64_REG(BPF_SUB, R0, R5), 4119 BPF_ALU64_REG(BPF_SUB, R0, R6), 4120 BPF_ALU64_REG(BPF_SUB, R0, R7), 4121 BPF_ALU64_REG(BPF_SUB, R0, R8), 4122 BPF_ALU64_REG(BPF_SUB, R0, R9), 4123 BPF_EXIT_INSN(), 4124 }, 4125 INTERNAL, 4126 { }, 4127 { { 0, 11 } } 4128 }, 4129 { /* Mainly checking JIT here. */ 4130 "INT: XOR", 4131 .u.insns_int = { 4132 BPF_ALU64_REG(BPF_SUB, R0, R0), 4133 BPF_ALU64_REG(BPF_XOR, R1, R1), 4134 BPF_JMP_REG(BPF_JEQ, R0, R1, 1), 4135 BPF_EXIT_INSN(), 4136 BPF_ALU64_IMM(BPF_MOV, R0, 10), 4137 BPF_ALU64_IMM(BPF_MOV, R1, -1), 4138 BPF_ALU64_REG(BPF_SUB, R1, R1), 4139 BPF_ALU64_REG(BPF_XOR, R2, R2), 4140 BPF_JMP_REG(BPF_JEQ, R1, R2, 1), 4141 BPF_EXIT_INSN(), 4142 BPF_ALU64_REG(BPF_SUB, R2, R2), 4143 BPF_ALU64_REG(BPF_XOR, R3, R3), 4144 BPF_ALU64_IMM(BPF_MOV, R0, 10), 4145 BPF_ALU64_IMM(BPF_MOV, R1, -1), 4146 BPF_JMP_REG(BPF_JEQ, R2, R3, 1), 4147 BPF_EXIT_INSN(), 4148 BPF_ALU64_REG(BPF_SUB, R3, R3), 4149 BPF_ALU64_REG(BPF_XOR, R4, R4), 4150 BPF_ALU64_IMM(BPF_MOV, R2, 1), 4151 BPF_ALU64_IMM(BPF_MOV, R5, -1), 4152 BPF_JMP_REG(BPF_JEQ, R3, R4, 1), 4153 BPF_EXIT_INSN(), 4154 BPF_ALU64_REG(BPF_SUB, R4, R4), 4155 BPF_ALU64_REG(BPF_XOR, R5, R5), 4156 BPF_ALU64_IMM(BPF_MOV, R3, 1), 4157 BPF_ALU64_IMM(BPF_MOV, R7, -1), 4158 BPF_JMP_REG(BPF_JEQ, R5, R4, 1), 4159 BPF_EXIT_INSN(), 4160 BPF_ALU64_IMM(BPF_MOV, R5, 1), 4161 BPF_ALU64_REG(BPF_SUB, R5, R5), 4162 BPF_ALU64_REG(BPF_XOR, R6, R6), 4163 BPF_ALU64_IMM(BPF_MOV, R1, 1), 4164 BPF_ALU64_IMM(BPF_MOV, R8, -1), 4165 BPF_JMP_REG(BPF_JEQ, R5, R6, 1), 4166 BPF_EXIT_INSN(), 4167 BPF_ALU64_REG(BPF_SUB, R6, R6), 4168 BPF_ALU64_REG(BPF_XOR, R7, R7), 4169 BPF_JMP_REG(BPF_JEQ, R7, R6, 1), 4170 BPF_EXIT_INSN(), 4171 BPF_ALU64_REG(BPF_SUB, R7, R7), 4172 BPF_ALU64_REG(BPF_XOR, R8, R8), 4173 BPF_JMP_REG(BPF_JEQ, R7, R8, 1), 4174 BPF_EXIT_INSN(), 4175 BPF_ALU64_REG(BPF_SUB, R8, R8), 4176 BPF_ALU64_REG(BPF_XOR, R9, R9), 4177 BPF_JMP_REG(BPF_JEQ, R9, R8, 1), 4178 BPF_EXIT_INSN(), 4179 BPF_ALU64_REG(BPF_SUB, R9, R9), 4180 BPF_ALU64_REG(BPF_XOR, R0, R0), 4181 BPF_JMP_REG(BPF_JEQ, R9, R0, 1), 4182 BPF_EXIT_INSN(), 4183 BPF_ALU64_REG(BPF_SUB, R1, R1), 4184 BPF_ALU64_REG(BPF_XOR, R0, R0), 4185 BPF_JMP_REG(BPF_JEQ, R9, R0, 2), 4186 BPF_ALU64_IMM(BPF_MOV, R0, 0), 4187 BPF_EXIT_INSN(), 4188 BPF_ALU64_IMM(BPF_MOV, R0, 1), 4189 BPF_EXIT_INSN(), 4190 }, 4191 INTERNAL, 4192 { }, 4193 { { 0, 1 } } 4194 }, 4195 { /* Mainly checking JIT here. */ 4196 "INT: MUL", 4197 .u.insns_int = { 4198 BPF_ALU64_IMM(BPF_MOV, R0, 11), 4199 BPF_ALU64_IMM(BPF_MOV, R1, 1), 4200 BPF_ALU64_IMM(BPF_MOV, R2, 2), 4201 BPF_ALU64_IMM(BPF_MOV, R3, 3), 4202 BPF_ALU64_IMM(BPF_MOV, R4, 4), 4203 BPF_ALU64_IMM(BPF_MOV, R5, 5), 4204 BPF_ALU64_IMM(BPF_MOV, R6, 6), 4205 BPF_ALU64_IMM(BPF_MOV, R7, 7), 4206 BPF_ALU64_IMM(BPF_MOV, R8, 8), 4207 BPF_ALU64_IMM(BPF_MOV, R9, 9), 4208 BPF_ALU64_REG(BPF_MUL, R0, R0), 4209 BPF_ALU64_REG(BPF_MUL, R0, R1), 4210 BPF_ALU64_REG(BPF_MUL, R0, R2), 4211 BPF_ALU64_REG(BPF_MUL, R0, R3), 4212 BPF_ALU64_REG(BPF_MUL, R0, R4), 4213 BPF_ALU64_REG(BPF_MUL, R0, R5), 4214 BPF_ALU64_REG(BPF_MUL, R0, R6), 4215 BPF_ALU64_REG(BPF_MUL, R0, R7), 4216 BPF_ALU64_REG(BPF_MUL, R0, R8), 4217 BPF_ALU64_REG(BPF_MUL, R0, R9), 4218 BPF_ALU64_IMM(BPF_MUL, R0, 10), 4219 BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1), 4220 BPF_EXIT_INSN(), 4221 BPF_ALU64_REG(BPF_MUL, R1, R0), 4222 BPF_ALU64_REG(BPF_MUL, R1, R2), 4223 BPF_ALU64_REG(BPF_MUL, R1, R3), 4224 BPF_ALU64_REG(BPF_MUL, R1, R4), 4225 BPF_ALU64_REG(BPF_MUL, R1, R5), 4226 BPF_ALU64_REG(BPF_MUL, R1, R6), 4227 BPF_ALU64_REG(BPF_MUL, R1, R7), 4228 BPF_ALU64_REG(BPF_MUL, R1, R8), 4229 BPF_ALU64_REG(BPF_MUL, R1, R9), 4230 BPF_ALU64_IMM(BPF_MUL, R1, 10), 4231 BPF_ALU64_REG(BPF_MOV, R2, R1), 4232 BPF_ALU64_IMM(BPF_RSH, R2, 32), 4233 BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1), 4234 BPF_EXIT_INSN(), 4235 BPF_ALU64_IMM(BPF_LSH, R1, 32), 4236 BPF_ALU64_IMM(BPF_ARSH, R1, 32), 4237 BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1), 4238 BPF_EXIT_INSN(), 4239 BPF_ALU64_REG(BPF_MUL, R2, R0), 4240 BPF_ALU64_REG(BPF_MUL, R2, R1), 4241 BPF_ALU64_REG(BPF_MUL, R2, R3), 4242 BPF_ALU64_REG(BPF_MUL, R2, R4), 4243 BPF_ALU64_REG(BPF_MUL, R2, R5), 4244 BPF_ALU64_REG(BPF_MUL, R2, R6), 4245 BPF_ALU64_REG(BPF_MUL, R2, R7), 4246 BPF_ALU64_REG(BPF_MUL, R2, R8), 4247 BPF_ALU64_REG(BPF_MUL, R2, R9), 4248 BPF_ALU64_IMM(BPF_MUL, R2, 10), 4249 BPF_ALU64_IMM(BPF_RSH, R2, 32), 4250 BPF_ALU64_REG(BPF_MOV, R0, R2), 4251 BPF_EXIT_INSN(), 4252 }, 4253 INTERNAL, 4254 { }, 4255 { { 0, 0x35d97ef2 } } 4256 }, 4257 { /* Mainly checking JIT here. */ 4258 "MOV REG64", 4259 .u.insns_int = { 4260 BPF_LD_IMM64(R0, 0xffffffffffffffffLL), 4261 BPF_MOV64_REG(R1, R0), 4262 BPF_MOV64_REG(R2, R1), 4263 BPF_MOV64_REG(R3, R2), 4264 BPF_MOV64_REG(R4, R3), 4265 BPF_MOV64_REG(R5, R4), 4266 BPF_MOV64_REG(R6, R5), 4267 BPF_MOV64_REG(R7, R6), 4268 BPF_MOV64_REG(R8, R7), 4269 BPF_MOV64_REG(R9, R8), 4270 BPF_ALU64_IMM(BPF_MOV, R0, 0), 4271 BPF_ALU64_IMM(BPF_MOV, R1, 0), 4272 BPF_ALU64_IMM(BPF_MOV, R2, 0), 4273 BPF_ALU64_IMM(BPF_MOV, R3, 0), 4274 BPF_ALU64_IMM(BPF_MOV, R4, 0), 4275 BPF_ALU64_IMM(BPF_MOV, R5, 0), 4276 BPF_ALU64_IMM(BPF_MOV, R6, 0), 4277 BPF_ALU64_IMM(BPF_MOV, R7, 0), 4278 BPF_ALU64_IMM(BPF_MOV, R8, 0), 4279 BPF_ALU64_IMM(BPF_MOV, R9, 0), 4280 BPF_ALU64_REG(BPF_ADD, R0, R0), 4281 BPF_ALU64_REG(BPF_ADD, R0, R1), 4282 BPF_ALU64_REG(BPF_ADD, R0, R2), 4283 BPF_ALU64_REG(BPF_ADD, R0, R3), 4284 BPF_ALU64_REG(BPF_ADD, R0, R4), 4285 BPF_ALU64_REG(BPF_ADD, R0, R5), 4286 BPF_ALU64_REG(BPF_ADD, R0, R6), 4287 BPF_ALU64_REG(BPF_ADD, R0, R7), 4288 BPF_ALU64_REG(BPF_ADD, R0, R8), 4289 BPF_ALU64_REG(BPF_ADD, R0, R9), 4290 BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe), 4291 BPF_EXIT_INSN(), 4292 }, 4293 INTERNAL, 4294 { }, 4295 { { 0, 0xfefe } } 4296 }, 4297 { /* Mainly checking JIT here. */ 4298 "MOV REG32", 4299 .u.insns_int = { 4300 BPF_LD_IMM64(R0, 0xffffffffffffffffLL), 4301 BPF_MOV64_REG(R1, R0), 4302 BPF_MOV64_REG(R2, R1), 4303 BPF_MOV64_REG(R3, R2), 4304 BPF_MOV64_REG(R4, R3), 4305 BPF_MOV64_REG(R5, R4), 4306 BPF_MOV64_REG(R6, R5), 4307 BPF_MOV64_REG(R7, R6), 4308 BPF_MOV64_REG(R8, R7), 4309 BPF_MOV64_REG(R9, R8), 4310 BPF_ALU32_IMM(BPF_MOV, R0, 0), 4311 BPF_ALU32_IMM(BPF_MOV, R1, 0), 4312 BPF_ALU32_IMM(BPF_MOV, R2, 0), 4313 BPF_ALU32_IMM(BPF_MOV, R3, 0), 4314 BPF_ALU32_IMM(BPF_MOV, R4, 0), 4315 BPF_ALU32_IMM(BPF_MOV, R5, 0), 4316 BPF_ALU32_IMM(BPF_MOV, R6, 0), 4317 BPF_ALU32_IMM(BPF_MOV, R7, 0), 4318 BPF_ALU32_IMM(BPF_MOV, R8, 0), 4319 BPF_ALU32_IMM(BPF_MOV, R9, 0), 4320 BPF_ALU64_REG(BPF_ADD, R0, R0), 4321 BPF_ALU64_REG(BPF_ADD, R0, R1), 4322 BPF_ALU64_REG(BPF_ADD, R0, R2), 4323 BPF_ALU64_REG(BPF_ADD, R0, R3), 4324 BPF_ALU64_REG(BPF_ADD, R0, R4), 4325 BPF_ALU64_REG(BPF_ADD, R0, R5), 4326 BPF_ALU64_REG(BPF_ADD, R0, R6), 4327 BPF_ALU64_REG(BPF_ADD, R0, R7), 4328 BPF_ALU64_REG(BPF_ADD, R0, R8), 4329 BPF_ALU64_REG(BPF_ADD, R0, R9), 4330 BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe), 4331 BPF_EXIT_INSN(), 4332 }, 4333 INTERNAL, 4334 { }, 4335 { { 0, 0xfefe } } 4336 }, 4337 { /* Mainly checking JIT here. */ 4338 "LD IMM64", 4339 .u.insns_int = { 4340 BPF_LD_IMM64(R0, 0xffffffffffffffffLL), 4341 BPF_MOV64_REG(R1, R0), 4342 BPF_MOV64_REG(R2, R1), 4343 BPF_MOV64_REG(R3, R2), 4344 BPF_MOV64_REG(R4, R3), 4345 BPF_MOV64_REG(R5, R4), 4346 BPF_MOV64_REG(R6, R5), 4347 BPF_MOV64_REG(R7, R6), 4348 BPF_MOV64_REG(R8, R7), 4349 BPF_MOV64_REG(R9, R8), 4350 BPF_LD_IMM64(R0, 0x0LL), 4351 BPF_LD_IMM64(R1, 0x0LL), 4352 BPF_LD_IMM64(R2, 0x0LL), 4353 BPF_LD_IMM64(R3, 0x0LL), 4354 BPF_LD_IMM64(R4, 0x0LL), 4355 BPF_LD_IMM64(R5, 0x0LL), 4356 BPF_LD_IMM64(R6, 0x0LL), 4357 BPF_LD_IMM64(R7, 0x0LL), 4358 BPF_LD_IMM64(R8, 0x0LL), 4359 BPF_LD_IMM64(R9, 0x0LL), 4360 BPF_ALU64_REG(BPF_ADD, R0, R0), 4361 BPF_ALU64_REG(BPF_ADD, R0, R1), 4362 BPF_ALU64_REG(BPF_ADD, R0, R2), 4363 BPF_ALU64_REG(BPF_ADD, R0, R3), 4364 BPF_ALU64_REG(BPF_ADD, R0, R4), 4365 BPF_ALU64_REG(BPF_ADD, R0, R5), 4366 BPF_ALU64_REG(BPF_ADD, R0, R6), 4367 BPF_ALU64_REG(BPF_ADD, R0, R7), 4368 BPF_ALU64_REG(BPF_ADD, R0, R8), 4369 BPF_ALU64_REG(BPF_ADD, R0, R9), 4370 BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe), 4371 BPF_EXIT_INSN(), 4372 }, 4373 INTERNAL, 4374 { }, 4375 { { 0, 0xfefe } } 4376 }, 4377 { 4378 "INT: ALU MIX", 4379 .u.insns_int = { 4380 BPF_ALU64_IMM(BPF_MOV, R0, 11), 4381 BPF_ALU64_IMM(BPF_ADD, R0, -1), 4382 BPF_ALU64_IMM(BPF_MOV, R2, 2), 4383 BPF_ALU64_IMM(BPF_XOR, R2, 3), 4384 BPF_ALU64_REG(BPF_DIV, R0, R2), 4385 BPF_JMP_IMM(BPF_JEQ, R0, 10, 1), 4386 BPF_EXIT_INSN(), 4387 BPF_ALU64_IMM(BPF_MOD, R0, 3), 4388 BPF_JMP_IMM(BPF_JEQ, R0, 1, 1), 4389 BPF_EXIT_INSN(), 4390 BPF_ALU64_IMM(BPF_MOV, R0, -1), 4391 BPF_EXIT_INSN(), 4392 }, 4393 INTERNAL, 4394 { }, 4395 { { 0, -1 } } 4396 }, 4397 { 4398 "INT: shifts by register", 4399 .u.insns_int = { 4400 BPF_MOV64_IMM(R0, -1234), 4401 BPF_MOV64_IMM(R1, 1), 4402 BPF_ALU32_REG(BPF_RSH, R0, R1), 4403 BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1), 4404 BPF_EXIT_INSN(), 4405 BPF_MOV64_IMM(R2, 1), 4406 BPF_ALU64_REG(BPF_LSH, R0, R2), 4407 BPF_MOV32_IMM(R4, -1234), 4408 BPF_JMP_REG(BPF_JEQ, R0, R4, 1), 4409 BPF_EXIT_INSN(), 4410 BPF_ALU64_IMM(BPF_AND, R4, 63), 4411 BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */ 4412 BPF_MOV64_IMM(R3, 47), 4413 BPF_ALU64_REG(BPF_ARSH, R0, R3), 4414 BPF_JMP_IMM(BPF_JEQ, R0, -617, 1), 4415 BPF_EXIT_INSN(), 4416 BPF_MOV64_IMM(R2, 1), 4417 BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */ 4418 BPF_JMP_IMM(BPF_JEQ, R4, 92, 1), 4419 BPF_EXIT_INSN(), 4420 BPF_MOV64_IMM(R4, 4), 4421 BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */ 4422 BPF_JMP_IMM(BPF_JEQ, R4, 64, 1), 4423 BPF_EXIT_INSN(), 4424 BPF_MOV64_IMM(R4, 5), 4425 BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */ 4426 BPF_JMP_IMM(BPF_JEQ, R4, 160, 1), 4427 BPF_EXIT_INSN(), 4428 BPF_MOV64_IMM(R0, -1), 4429 BPF_EXIT_INSN(), 4430 }, 4431 INTERNAL, 4432 { }, 4433 { { 0, -1 } } 4434 }, 4435 #ifdef CONFIG_32BIT 4436 { 4437 "INT: 32-bit context pointer word order and zero-extension", 4438 .u.insns_int = { 4439 BPF_ALU32_IMM(BPF_MOV, R0, 0), 4440 BPF_JMP32_IMM(BPF_JEQ, R1, 0, 3), 4441 BPF_ALU64_IMM(BPF_RSH, R1, 32), 4442 BPF_JMP32_IMM(BPF_JNE, R1, 0, 1), 4443 BPF_ALU32_IMM(BPF_MOV, R0, 1), 4444 BPF_EXIT_INSN(), 4445 }, 4446 INTERNAL, 4447 { }, 4448 { { 0, 1 } } 4449 }, 4450 #endif 4451 { 4452 "check: missing ret", 4453 .u.insns = { 4454 BPF_STMT(BPF_LD | BPF_IMM, 1), 4455 }, 4456 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4457 { }, 4458 { }, 4459 .fill_helper = NULL, 4460 .expected_errcode = -EINVAL, 4461 }, 4462 { 4463 "check: div_k_0", 4464 .u.insns = { 4465 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0), 4466 BPF_STMT(BPF_RET | BPF_K, 0) 4467 }, 4468 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4469 { }, 4470 { }, 4471 .fill_helper = NULL, 4472 .expected_errcode = -EINVAL, 4473 }, 4474 { 4475 "check: unknown insn", 4476 .u.insns = { 4477 /* seccomp insn, rejected in socket filter */ 4478 BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0), 4479 BPF_STMT(BPF_RET | BPF_K, 0) 4480 }, 4481 CLASSIC | FLAG_EXPECTED_FAIL, 4482 { }, 4483 { }, 4484 .fill_helper = NULL, 4485 .expected_errcode = -EINVAL, 4486 }, 4487 { 4488 "check: out of range spill/fill", 4489 .u.insns = { 4490 BPF_STMT(BPF_STX, 16), 4491 BPF_STMT(BPF_RET | BPF_K, 0) 4492 }, 4493 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4494 { }, 4495 { }, 4496 .fill_helper = NULL, 4497 .expected_errcode = -EINVAL, 4498 }, 4499 { 4500 "JUMPS + HOLES", 4501 .u.insns = { 4502 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4503 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15), 4504 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4505 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4506 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4507 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4508 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4509 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4510 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4511 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4512 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4513 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4514 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4515 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4516 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4517 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4), 4518 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4519 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2), 4520 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4521 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15), 4522 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14), 4523 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4524 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4525 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4526 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4527 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4528 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4529 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4530 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4531 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4532 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4533 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4534 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4535 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4536 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3), 4537 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2), 4538 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4539 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15), 4540 BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14), 4541 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4542 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4543 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4544 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4545 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4546 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4547 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4548 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4549 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4550 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4551 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4552 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4553 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4554 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3), 4555 BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2), 4556 BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0), 4557 BPF_STMT(BPF_RET | BPF_A, 0), 4558 BPF_STMT(BPF_RET | BPF_A, 0), 4559 }, 4560 CLASSIC, 4561 { 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8, 4562 0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4, 4563 0x08, 0x00, 4564 0x45, 0x00, 0x00, 0x28, 0x00, 0x00, 4565 0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */ 4566 0xc0, 0xa8, 0x33, 0x01, 4567 0xc0, 0xa8, 0x33, 0x02, 4568 0xbb, 0xb6, 4569 0xa9, 0xfa, 4570 0x00, 0x14, 0x00, 0x00, 4571 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4572 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4573 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4574 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4575 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4576 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4577 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 4578 0xcc, 0xcc, 0xcc, 0xcc }, 4579 { { 88, 0x001b } } 4580 }, 4581 { 4582 "check: RET X", 4583 .u.insns = { 4584 BPF_STMT(BPF_RET | BPF_X, 0), 4585 }, 4586 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4587 { }, 4588 { }, 4589 .fill_helper = NULL, 4590 .expected_errcode = -EINVAL, 4591 }, 4592 { 4593 "check: LDX + RET X", 4594 .u.insns = { 4595 BPF_STMT(BPF_LDX | BPF_IMM, 42), 4596 BPF_STMT(BPF_RET | BPF_X, 0), 4597 }, 4598 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4599 { }, 4600 { }, 4601 .fill_helper = NULL, 4602 .expected_errcode = -EINVAL, 4603 }, 4604 { /* Mainly checking JIT here. */ 4605 "M[]: alt STX + LDX", 4606 .u.insns = { 4607 BPF_STMT(BPF_LDX | BPF_IMM, 100), 4608 BPF_STMT(BPF_STX, 0), 4609 BPF_STMT(BPF_LDX | BPF_MEM, 0), 4610 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4611 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4612 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4613 BPF_STMT(BPF_STX, 1), 4614 BPF_STMT(BPF_LDX | BPF_MEM, 1), 4615 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4616 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4617 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4618 BPF_STMT(BPF_STX, 2), 4619 BPF_STMT(BPF_LDX | BPF_MEM, 2), 4620 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4621 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4622 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4623 BPF_STMT(BPF_STX, 3), 4624 BPF_STMT(BPF_LDX | BPF_MEM, 3), 4625 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4626 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4627 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4628 BPF_STMT(BPF_STX, 4), 4629 BPF_STMT(BPF_LDX | BPF_MEM, 4), 4630 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4631 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4632 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4633 BPF_STMT(BPF_STX, 5), 4634 BPF_STMT(BPF_LDX | BPF_MEM, 5), 4635 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4636 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4637 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4638 BPF_STMT(BPF_STX, 6), 4639 BPF_STMT(BPF_LDX | BPF_MEM, 6), 4640 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4641 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4642 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4643 BPF_STMT(BPF_STX, 7), 4644 BPF_STMT(BPF_LDX | BPF_MEM, 7), 4645 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4646 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4647 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4648 BPF_STMT(BPF_STX, 8), 4649 BPF_STMT(BPF_LDX | BPF_MEM, 8), 4650 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4651 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4652 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4653 BPF_STMT(BPF_STX, 9), 4654 BPF_STMT(BPF_LDX | BPF_MEM, 9), 4655 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4656 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4657 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4658 BPF_STMT(BPF_STX, 10), 4659 BPF_STMT(BPF_LDX | BPF_MEM, 10), 4660 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4661 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4662 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4663 BPF_STMT(BPF_STX, 11), 4664 BPF_STMT(BPF_LDX | BPF_MEM, 11), 4665 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4666 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4667 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4668 BPF_STMT(BPF_STX, 12), 4669 BPF_STMT(BPF_LDX | BPF_MEM, 12), 4670 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4671 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4672 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4673 BPF_STMT(BPF_STX, 13), 4674 BPF_STMT(BPF_LDX | BPF_MEM, 13), 4675 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4676 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4677 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4678 BPF_STMT(BPF_STX, 14), 4679 BPF_STMT(BPF_LDX | BPF_MEM, 14), 4680 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4681 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4682 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4683 BPF_STMT(BPF_STX, 15), 4684 BPF_STMT(BPF_LDX | BPF_MEM, 15), 4685 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4686 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1), 4687 BPF_STMT(BPF_MISC | BPF_TAX, 0), 4688 BPF_STMT(BPF_RET | BPF_A, 0), 4689 }, 4690 CLASSIC | FLAG_NO_DATA, 4691 { }, 4692 { { 0, 116 } }, 4693 }, 4694 { /* Mainly checking JIT here. */ 4695 "M[]: full STX + full LDX", 4696 .u.insns = { 4697 BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb), 4698 BPF_STMT(BPF_STX, 0), 4699 BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae), 4700 BPF_STMT(BPF_STX, 1), 4701 BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf), 4702 BPF_STMT(BPF_STX, 2), 4703 BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc), 4704 BPF_STMT(BPF_STX, 3), 4705 BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb), 4706 BPF_STMT(BPF_STX, 4), 4707 BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda), 4708 BPF_STMT(BPF_STX, 5), 4709 BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb), 4710 BPF_STMT(BPF_STX, 6), 4711 BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade), 4712 BPF_STMT(BPF_STX, 7), 4713 BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec), 4714 BPF_STMT(BPF_STX, 8), 4715 BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc), 4716 BPF_STMT(BPF_STX, 9), 4717 BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac), 4718 BPF_STMT(BPF_STX, 10), 4719 BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea), 4720 BPF_STMT(BPF_STX, 11), 4721 BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb), 4722 BPF_STMT(BPF_STX, 12), 4723 BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf), 4724 BPF_STMT(BPF_STX, 13), 4725 BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde), 4726 BPF_STMT(BPF_STX, 14), 4727 BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad), 4728 BPF_STMT(BPF_STX, 15), 4729 BPF_STMT(BPF_LDX | BPF_MEM, 0), 4730 BPF_STMT(BPF_MISC | BPF_TXA, 0), 4731 BPF_STMT(BPF_LDX | BPF_MEM, 1), 4732 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4733 BPF_STMT(BPF_LDX | BPF_MEM, 2), 4734 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4735 BPF_STMT(BPF_LDX | BPF_MEM, 3), 4736 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4737 BPF_STMT(BPF_LDX | BPF_MEM, 4), 4738 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4739 BPF_STMT(BPF_LDX | BPF_MEM, 5), 4740 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4741 BPF_STMT(BPF_LDX | BPF_MEM, 6), 4742 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4743 BPF_STMT(BPF_LDX | BPF_MEM, 7), 4744 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4745 BPF_STMT(BPF_LDX | BPF_MEM, 8), 4746 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4747 BPF_STMT(BPF_LDX | BPF_MEM, 9), 4748 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4749 BPF_STMT(BPF_LDX | BPF_MEM, 10), 4750 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4751 BPF_STMT(BPF_LDX | BPF_MEM, 11), 4752 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4753 BPF_STMT(BPF_LDX | BPF_MEM, 12), 4754 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4755 BPF_STMT(BPF_LDX | BPF_MEM, 13), 4756 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4757 BPF_STMT(BPF_LDX | BPF_MEM, 14), 4758 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4759 BPF_STMT(BPF_LDX | BPF_MEM, 15), 4760 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 4761 BPF_STMT(BPF_RET | BPF_A, 0), 4762 }, 4763 CLASSIC | FLAG_NO_DATA, 4764 { }, 4765 { { 0, 0x2a5a5e5 } }, 4766 }, 4767 { 4768 "check: SKF_AD_MAX", 4769 .u.insns = { 4770 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 4771 SKF_AD_OFF + SKF_AD_MAX), 4772 BPF_STMT(BPF_RET | BPF_A, 0), 4773 }, 4774 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 4775 { }, 4776 { }, 4777 .fill_helper = NULL, 4778 .expected_errcode = -EINVAL, 4779 }, 4780 { /* Passes checker but fails during runtime. */ 4781 "LD [SKF_AD_OFF-1]", 4782 .u.insns = { 4783 BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 4784 SKF_AD_OFF - 1), 4785 BPF_STMT(BPF_RET | BPF_K, 1), 4786 }, 4787 CLASSIC, 4788 { }, 4789 { { 1, 0 } }, 4790 }, 4791 { 4792 "load 64-bit immediate", 4793 .u.insns_int = { 4794 BPF_LD_IMM64(R1, 0x567800001234LL), 4795 BPF_MOV64_REG(R2, R1), 4796 BPF_MOV64_REG(R3, R2), 4797 BPF_ALU64_IMM(BPF_RSH, R2, 32), 4798 BPF_ALU64_IMM(BPF_LSH, R3, 32), 4799 BPF_ALU64_IMM(BPF_RSH, R3, 32), 4800 BPF_ALU64_IMM(BPF_MOV, R0, 0), 4801 BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1), 4802 BPF_EXIT_INSN(), 4803 BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1), 4804 BPF_EXIT_INSN(), 4805 BPF_LD_IMM64(R0, 0x1ffffffffLL), 4806 BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */ 4807 BPF_EXIT_INSN(), 4808 }, 4809 INTERNAL, 4810 { }, 4811 { { 0, 1 } } 4812 }, 4813 /* BPF_ALU | BPF_MOV | BPF_X */ 4814 { 4815 "ALU_MOV_X: dst = 2", 4816 .u.insns_int = { 4817 BPF_ALU32_IMM(BPF_MOV, R1, 2), 4818 BPF_ALU32_REG(BPF_MOV, R0, R1), 4819 BPF_EXIT_INSN(), 4820 }, 4821 INTERNAL, 4822 { }, 4823 { { 0, 2 } }, 4824 }, 4825 { 4826 "ALU_MOV_X: dst = 4294967295", 4827 .u.insns_int = { 4828 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U), 4829 BPF_ALU32_REG(BPF_MOV, R0, R1), 4830 BPF_EXIT_INSN(), 4831 }, 4832 INTERNAL, 4833 { }, 4834 { { 0, 4294967295U } }, 4835 }, 4836 { 4837 "ALU64_MOV_X: dst = 2", 4838 .u.insns_int = { 4839 BPF_ALU32_IMM(BPF_MOV, R1, 2), 4840 BPF_ALU64_REG(BPF_MOV, R0, R1), 4841 BPF_EXIT_INSN(), 4842 }, 4843 INTERNAL, 4844 { }, 4845 { { 0, 2 } }, 4846 }, 4847 { 4848 "ALU64_MOV_X: dst = 4294967295", 4849 .u.insns_int = { 4850 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U), 4851 BPF_ALU64_REG(BPF_MOV, R0, R1), 4852 BPF_EXIT_INSN(), 4853 }, 4854 INTERNAL, 4855 { }, 4856 { { 0, 4294967295U } }, 4857 }, 4858 /* BPF_ALU | BPF_MOV | BPF_K */ 4859 { 4860 "ALU_MOV_K: dst = 2", 4861 .u.insns_int = { 4862 BPF_ALU32_IMM(BPF_MOV, R0, 2), 4863 BPF_EXIT_INSN(), 4864 }, 4865 INTERNAL, 4866 { }, 4867 { { 0, 2 } }, 4868 }, 4869 { 4870 "ALU_MOV_K: dst = 4294967295", 4871 .u.insns_int = { 4872 BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U), 4873 BPF_EXIT_INSN(), 4874 }, 4875 INTERNAL, 4876 { }, 4877 { { 0, 4294967295U } }, 4878 }, 4879 { 4880 "ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff", 4881 .u.insns_int = { 4882 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 4883 BPF_LD_IMM64(R3, 0x00000000ffffffffLL), 4884 BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff), 4885 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 4886 BPF_MOV32_IMM(R0, 2), 4887 BPF_EXIT_INSN(), 4888 BPF_MOV32_IMM(R0, 1), 4889 BPF_EXIT_INSN(), 4890 }, 4891 INTERNAL, 4892 { }, 4893 { { 0, 0x1 } }, 4894 }, 4895 { 4896 "ALU_MOV_K: small negative", 4897 .u.insns_int = { 4898 BPF_ALU32_IMM(BPF_MOV, R0, -123), 4899 BPF_EXIT_INSN(), 4900 }, 4901 INTERNAL, 4902 { }, 4903 { { 0, -123 } } 4904 }, 4905 { 4906 "ALU_MOV_K: small negative zero extension", 4907 .u.insns_int = { 4908 BPF_ALU32_IMM(BPF_MOV, R0, -123), 4909 BPF_ALU64_IMM(BPF_RSH, R0, 32), 4910 BPF_EXIT_INSN(), 4911 }, 4912 INTERNAL, 4913 { }, 4914 { { 0, 0 } } 4915 }, 4916 { 4917 "ALU_MOV_K: large negative", 4918 .u.insns_int = { 4919 BPF_ALU32_IMM(BPF_MOV, R0, -123456789), 4920 BPF_EXIT_INSN(), 4921 }, 4922 INTERNAL, 4923 { }, 4924 { { 0, -123456789 } } 4925 }, 4926 { 4927 "ALU_MOV_K: large negative zero extension", 4928 .u.insns_int = { 4929 BPF_ALU32_IMM(BPF_MOV, R0, -123456789), 4930 BPF_ALU64_IMM(BPF_RSH, R0, 32), 4931 BPF_EXIT_INSN(), 4932 }, 4933 INTERNAL, 4934 { }, 4935 { { 0, 0 } } 4936 }, 4937 { 4938 "ALU64_MOV_K: dst = 2", 4939 .u.insns_int = { 4940 BPF_ALU64_IMM(BPF_MOV, R0, 2), 4941 BPF_EXIT_INSN(), 4942 }, 4943 INTERNAL, 4944 { }, 4945 { { 0, 2 } }, 4946 }, 4947 { 4948 "ALU64_MOV_K: dst = 2147483647", 4949 .u.insns_int = { 4950 BPF_ALU64_IMM(BPF_MOV, R0, 2147483647), 4951 BPF_EXIT_INSN(), 4952 }, 4953 INTERNAL, 4954 { }, 4955 { { 0, 2147483647 } }, 4956 }, 4957 { 4958 "ALU64_OR_K: dst = 0x0", 4959 .u.insns_int = { 4960 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 4961 BPF_LD_IMM64(R3, 0x0), 4962 BPF_ALU64_IMM(BPF_MOV, R2, 0x0), 4963 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 4964 BPF_MOV32_IMM(R0, 2), 4965 BPF_EXIT_INSN(), 4966 BPF_MOV32_IMM(R0, 1), 4967 BPF_EXIT_INSN(), 4968 }, 4969 INTERNAL, 4970 { }, 4971 { { 0, 0x1 } }, 4972 }, 4973 { 4974 "ALU64_MOV_K: dst = -1", 4975 .u.insns_int = { 4976 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 4977 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 4978 BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff), 4979 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 4980 BPF_MOV32_IMM(R0, 2), 4981 BPF_EXIT_INSN(), 4982 BPF_MOV32_IMM(R0, 1), 4983 BPF_EXIT_INSN(), 4984 }, 4985 INTERNAL, 4986 { }, 4987 { { 0, 0x1 } }, 4988 }, 4989 { 4990 "ALU64_MOV_K: small negative", 4991 .u.insns_int = { 4992 BPF_ALU64_IMM(BPF_MOV, R0, -123), 4993 BPF_EXIT_INSN(), 4994 }, 4995 INTERNAL, 4996 { }, 4997 { { 0, -123 } } 4998 }, 4999 { 5000 "ALU64_MOV_K: small negative sign extension", 5001 .u.insns_int = { 5002 BPF_ALU64_IMM(BPF_MOV, R0, -123), 5003 BPF_ALU64_IMM(BPF_RSH, R0, 32), 5004 BPF_EXIT_INSN(), 5005 }, 5006 INTERNAL, 5007 { }, 5008 { { 0, 0xffffffff } } 5009 }, 5010 { 5011 "ALU64_MOV_K: large negative", 5012 .u.insns_int = { 5013 BPF_ALU64_IMM(BPF_MOV, R0, -123456789), 5014 BPF_EXIT_INSN(), 5015 }, 5016 INTERNAL, 5017 { }, 5018 { { 0, -123456789 } } 5019 }, 5020 { 5021 "ALU64_MOV_K: large negative sign extension", 5022 .u.insns_int = { 5023 BPF_ALU64_IMM(BPF_MOV, R0, -123456789), 5024 BPF_ALU64_IMM(BPF_RSH, R0, 32), 5025 BPF_EXIT_INSN(), 5026 }, 5027 INTERNAL, 5028 { }, 5029 { { 0, 0xffffffff } } 5030 }, 5031 /* BPF_ALU | BPF_ADD | BPF_X */ 5032 { 5033 "ALU_ADD_X: 1 + 2 = 3", 5034 .u.insns_int = { 5035 BPF_LD_IMM64(R0, 1), 5036 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5037 BPF_ALU32_REG(BPF_ADD, R0, R1), 5038 BPF_EXIT_INSN(), 5039 }, 5040 INTERNAL, 5041 { }, 5042 { { 0, 3 } }, 5043 }, 5044 { 5045 "ALU_ADD_X: 1 + 4294967294 = 4294967295", 5046 .u.insns_int = { 5047 BPF_LD_IMM64(R0, 1), 5048 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U), 5049 BPF_ALU32_REG(BPF_ADD, R0, R1), 5050 BPF_EXIT_INSN(), 5051 }, 5052 INTERNAL, 5053 { }, 5054 { { 0, 4294967295U } }, 5055 }, 5056 { 5057 "ALU_ADD_X: 2 + 4294967294 = 0", 5058 .u.insns_int = { 5059 BPF_LD_IMM64(R0, 2), 5060 BPF_LD_IMM64(R1, 4294967294U), 5061 BPF_ALU32_REG(BPF_ADD, R0, R1), 5062 BPF_JMP_IMM(BPF_JEQ, R0, 0, 2), 5063 BPF_ALU32_IMM(BPF_MOV, R0, 0), 5064 BPF_EXIT_INSN(), 5065 BPF_ALU32_IMM(BPF_MOV, R0, 1), 5066 BPF_EXIT_INSN(), 5067 }, 5068 INTERNAL, 5069 { }, 5070 { { 0, 1 } }, 5071 }, 5072 { 5073 "ALU64_ADD_X: 1 + 2 = 3", 5074 .u.insns_int = { 5075 BPF_LD_IMM64(R0, 1), 5076 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5077 BPF_ALU64_REG(BPF_ADD, R0, R1), 5078 BPF_EXIT_INSN(), 5079 }, 5080 INTERNAL, 5081 { }, 5082 { { 0, 3 } }, 5083 }, 5084 { 5085 "ALU64_ADD_X: 1 + 4294967294 = 4294967295", 5086 .u.insns_int = { 5087 BPF_LD_IMM64(R0, 1), 5088 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U), 5089 BPF_ALU64_REG(BPF_ADD, R0, R1), 5090 BPF_EXIT_INSN(), 5091 }, 5092 INTERNAL, 5093 { }, 5094 { { 0, 4294967295U } }, 5095 }, 5096 { 5097 "ALU64_ADD_X: 2 + 4294967294 = 4294967296", 5098 .u.insns_int = { 5099 BPF_LD_IMM64(R0, 2), 5100 BPF_LD_IMM64(R1, 4294967294U), 5101 BPF_LD_IMM64(R2, 4294967296ULL), 5102 BPF_ALU64_REG(BPF_ADD, R0, R1), 5103 BPF_JMP_REG(BPF_JEQ, R0, R2, 2), 5104 BPF_MOV32_IMM(R0, 0), 5105 BPF_EXIT_INSN(), 5106 BPF_MOV32_IMM(R0, 1), 5107 BPF_EXIT_INSN(), 5108 }, 5109 INTERNAL, 5110 { }, 5111 { { 0, 1 } }, 5112 }, 5113 /* BPF_ALU | BPF_ADD | BPF_K */ 5114 { 5115 "ALU_ADD_K: 1 + 2 = 3", 5116 .u.insns_int = { 5117 BPF_LD_IMM64(R0, 1), 5118 BPF_ALU32_IMM(BPF_ADD, R0, 2), 5119 BPF_EXIT_INSN(), 5120 }, 5121 INTERNAL, 5122 { }, 5123 { { 0, 3 } }, 5124 }, 5125 { 5126 "ALU_ADD_K: 3 + 0 = 3", 5127 .u.insns_int = { 5128 BPF_LD_IMM64(R0, 3), 5129 BPF_ALU32_IMM(BPF_ADD, R0, 0), 5130 BPF_EXIT_INSN(), 5131 }, 5132 INTERNAL, 5133 { }, 5134 { { 0, 3 } }, 5135 }, 5136 { 5137 "ALU_ADD_K: 1 + 4294967294 = 4294967295", 5138 .u.insns_int = { 5139 BPF_LD_IMM64(R0, 1), 5140 BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U), 5141 BPF_EXIT_INSN(), 5142 }, 5143 INTERNAL, 5144 { }, 5145 { { 0, 4294967295U } }, 5146 }, 5147 { 5148 "ALU_ADD_K: 4294967294 + 2 = 0", 5149 .u.insns_int = { 5150 BPF_LD_IMM64(R0, 4294967294U), 5151 BPF_ALU32_IMM(BPF_ADD, R0, 2), 5152 BPF_JMP_IMM(BPF_JEQ, R0, 0, 2), 5153 BPF_ALU32_IMM(BPF_MOV, R0, 0), 5154 BPF_EXIT_INSN(), 5155 BPF_ALU32_IMM(BPF_MOV, R0, 1), 5156 BPF_EXIT_INSN(), 5157 }, 5158 INTERNAL, 5159 { }, 5160 { { 0, 1 } }, 5161 }, 5162 { 5163 "ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff", 5164 .u.insns_int = { 5165 BPF_LD_IMM64(R2, 0x0), 5166 BPF_LD_IMM64(R3, 0x00000000ffffffff), 5167 BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff), 5168 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5169 BPF_MOV32_IMM(R0, 2), 5170 BPF_EXIT_INSN(), 5171 BPF_MOV32_IMM(R0, 1), 5172 BPF_EXIT_INSN(), 5173 }, 5174 INTERNAL, 5175 { }, 5176 { { 0, 0x1 } }, 5177 }, 5178 { 5179 "ALU_ADD_K: 0 + 0xffff = 0xffff", 5180 .u.insns_int = { 5181 BPF_LD_IMM64(R2, 0x0), 5182 BPF_LD_IMM64(R3, 0xffff), 5183 BPF_ALU32_IMM(BPF_ADD, R2, 0xffff), 5184 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5185 BPF_MOV32_IMM(R0, 2), 5186 BPF_EXIT_INSN(), 5187 BPF_MOV32_IMM(R0, 1), 5188 BPF_EXIT_INSN(), 5189 }, 5190 INTERNAL, 5191 { }, 5192 { { 0, 0x1 } }, 5193 }, 5194 { 5195 "ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff", 5196 .u.insns_int = { 5197 BPF_LD_IMM64(R2, 0x0), 5198 BPF_LD_IMM64(R3, 0x7fffffff), 5199 BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff), 5200 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5201 BPF_MOV32_IMM(R0, 2), 5202 BPF_EXIT_INSN(), 5203 BPF_MOV32_IMM(R0, 1), 5204 BPF_EXIT_INSN(), 5205 }, 5206 INTERNAL, 5207 { }, 5208 { { 0, 0x1 } }, 5209 }, 5210 { 5211 "ALU_ADD_K: 0 + 0x80000000 = 0x80000000", 5212 .u.insns_int = { 5213 BPF_LD_IMM64(R2, 0x0), 5214 BPF_LD_IMM64(R3, 0x80000000), 5215 BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000), 5216 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5217 BPF_MOV32_IMM(R0, 2), 5218 BPF_EXIT_INSN(), 5219 BPF_MOV32_IMM(R0, 1), 5220 BPF_EXIT_INSN(), 5221 }, 5222 INTERNAL, 5223 { }, 5224 { { 0, 0x1 } }, 5225 }, 5226 { 5227 "ALU_ADD_K: 0 + 0x80008000 = 0x80008000", 5228 .u.insns_int = { 5229 BPF_LD_IMM64(R2, 0x0), 5230 BPF_LD_IMM64(R3, 0x80008000), 5231 BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000), 5232 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5233 BPF_MOV32_IMM(R0, 2), 5234 BPF_EXIT_INSN(), 5235 BPF_MOV32_IMM(R0, 1), 5236 BPF_EXIT_INSN(), 5237 }, 5238 INTERNAL, 5239 { }, 5240 { { 0, 0x1 } }, 5241 }, 5242 { 5243 "ALU64_ADD_K: 1 + 2 = 3", 5244 .u.insns_int = { 5245 BPF_LD_IMM64(R0, 1), 5246 BPF_ALU64_IMM(BPF_ADD, R0, 2), 5247 BPF_EXIT_INSN(), 5248 }, 5249 INTERNAL, 5250 { }, 5251 { { 0, 3 } }, 5252 }, 5253 { 5254 "ALU64_ADD_K: 3 + 0 = 3", 5255 .u.insns_int = { 5256 BPF_LD_IMM64(R0, 3), 5257 BPF_ALU64_IMM(BPF_ADD, R0, 0), 5258 BPF_EXIT_INSN(), 5259 }, 5260 INTERNAL, 5261 { }, 5262 { { 0, 3 } }, 5263 }, 5264 { 5265 "ALU64_ADD_K: 1 + 2147483646 = 2147483647", 5266 .u.insns_int = { 5267 BPF_LD_IMM64(R0, 1), 5268 BPF_ALU64_IMM(BPF_ADD, R0, 2147483646), 5269 BPF_EXIT_INSN(), 5270 }, 5271 INTERNAL, 5272 { }, 5273 { { 0, 2147483647 } }, 5274 }, 5275 { 5276 "ALU64_ADD_K: 4294967294 + 2 = 4294967296", 5277 .u.insns_int = { 5278 BPF_LD_IMM64(R0, 4294967294U), 5279 BPF_LD_IMM64(R1, 4294967296ULL), 5280 BPF_ALU64_IMM(BPF_ADD, R0, 2), 5281 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 5282 BPF_ALU32_IMM(BPF_MOV, R0, 0), 5283 BPF_EXIT_INSN(), 5284 BPF_ALU32_IMM(BPF_MOV, R0, 1), 5285 BPF_EXIT_INSN(), 5286 }, 5287 INTERNAL, 5288 { }, 5289 { { 0, 1 } }, 5290 }, 5291 { 5292 "ALU64_ADD_K: 2147483646 + -2147483647 = -1", 5293 .u.insns_int = { 5294 BPF_LD_IMM64(R0, 2147483646), 5295 BPF_ALU64_IMM(BPF_ADD, R0, -2147483647), 5296 BPF_EXIT_INSN(), 5297 }, 5298 INTERNAL, 5299 { }, 5300 { { 0, -1 } }, 5301 }, 5302 { 5303 "ALU64_ADD_K: 1 + 0 = 1", 5304 .u.insns_int = { 5305 BPF_LD_IMM64(R2, 0x1), 5306 BPF_LD_IMM64(R3, 0x1), 5307 BPF_ALU64_IMM(BPF_ADD, R2, 0x0), 5308 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5309 BPF_MOV32_IMM(R0, 2), 5310 BPF_EXIT_INSN(), 5311 BPF_MOV32_IMM(R0, 1), 5312 BPF_EXIT_INSN(), 5313 }, 5314 INTERNAL, 5315 { }, 5316 { { 0, 0x1 } }, 5317 }, 5318 { 5319 "ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff", 5320 .u.insns_int = { 5321 BPF_LD_IMM64(R2, 0x0), 5322 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 5323 BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff), 5324 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5325 BPF_MOV32_IMM(R0, 2), 5326 BPF_EXIT_INSN(), 5327 BPF_MOV32_IMM(R0, 1), 5328 BPF_EXIT_INSN(), 5329 }, 5330 INTERNAL, 5331 { }, 5332 { { 0, 0x1 } }, 5333 }, 5334 { 5335 "ALU64_ADD_K: 0 + 0xffff = 0xffff", 5336 .u.insns_int = { 5337 BPF_LD_IMM64(R2, 0x0), 5338 BPF_LD_IMM64(R3, 0xffff), 5339 BPF_ALU64_IMM(BPF_ADD, R2, 0xffff), 5340 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5341 BPF_MOV32_IMM(R0, 2), 5342 BPF_EXIT_INSN(), 5343 BPF_MOV32_IMM(R0, 1), 5344 BPF_EXIT_INSN(), 5345 }, 5346 INTERNAL, 5347 { }, 5348 { { 0, 0x1 } }, 5349 }, 5350 { 5351 "ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff", 5352 .u.insns_int = { 5353 BPF_LD_IMM64(R2, 0x0), 5354 BPF_LD_IMM64(R3, 0x7fffffff), 5355 BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff), 5356 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5357 BPF_MOV32_IMM(R0, 2), 5358 BPF_EXIT_INSN(), 5359 BPF_MOV32_IMM(R0, 1), 5360 BPF_EXIT_INSN(), 5361 }, 5362 INTERNAL, 5363 { }, 5364 { { 0, 0x1 } }, 5365 }, 5366 { 5367 "ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000", 5368 .u.insns_int = { 5369 BPF_LD_IMM64(R2, 0x0), 5370 BPF_LD_IMM64(R3, 0xffffffff80000000LL), 5371 BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000), 5372 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5373 BPF_MOV32_IMM(R0, 2), 5374 BPF_EXIT_INSN(), 5375 BPF_MOV32_IMM(R0, 1), 5376 BPF_EXIT_INSN(), 5377 }, 5378 INTERNAL, 5379 { }, 5380 { { 0, 0x1 } }, 5381 }, 5382 { 5383 "ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000", 5384 .u.insns_int = { 5385 BPF_LD_IMM64(R2, 0x0), 5386 BPF_LD_IMM64(R3, 0xffffffff80008000LL), 5387 BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000), 5388 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5389 BPF_MOV32_IMM(R0, 2), 5390 BPF_EXIT_INSN(), 5391 BPF_MOV32_IMM(R0, 1), 5392 BPF_EXIT_INSN(), 5393 }, 5394 INTERNAL, 5395 { }, 5396 { { 0, 0x1 } }, 5397 }, 5398 /* BPF_ALU | BPF_SUB | BPF_X */ 5399 { 5400 "ALU_SUB_X: 3 - 1 = 2", 5401 .u.insns_int = { 5402 BPF_LD_IMM64(R0, 3), 5403 BPF_ALU32_IMM(BPF_MOV, R1, 1), 5404 BPF_ALU32_REG(BPF_SUB, R0, R1), 5405 BPF_EXIT_INSN(), 5406 }, 5407 INTERNAL, 5408 { }, 5409 { { 0, 2 } }, 5410 }, 5411 { 5412 "ALU_SUB_X: 4294967295 - 4294967294 = 1", 5413 .u.insns_int = { 5414 BPF_LD_IMM64(R0, 4294967295U), 5415 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U), 5416 BPF_ALU32_REG(BPF_SUB, R0, R1), 5417 BPF_EXIT_INSN(), 5418 }, 5419 INTERNAL, 5420 { }, 5421 { { 0, 1 } }, 5422 }, 5423 { 5424 "ALU64_SUB_X: 3 - 1 = 2", 5425 .u.insns_int = { 5426 BPF_LD_IMM64(R0, 3), 5427 BPF_ALU32_IMM(BPF_MOV, R1, 1), 5428 BPF_ALU64_REG(BPF_SUB, R0, R1), 5429 BPF_EXIT_INSN(), 5430 }, 5431 INTERNAL, 5432 { }, 5433 { { 0, 2 } }, 5434 }, 5435 { 5436 "ALU64_SUB_X: 4294967295 - 4294967294 = 1", 5437 .u.insns_int = { 5438 BPF_LD_IMM64(R0, 4294967295U), 5439 BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U), 5440 BPF_ALU64_REG(BPF_SUB, R0, R1), 5441 BPF_EXIT_INSN(), 5442 }, 5443 INTERNAL, 5444 { }, 5445 { { 0, 1 } }, 5446 }, 5447 /* BPF_ALU | BPF_SUB | BPF_K */ 5448 { 5449 "ALU_SUB_K: 3 - 1 = 2", 5450 .u.insns_int = { 5451 BPF_LD_IMM64(R0, 3), 5452 BPF_ALU32_IMM(BPF_SUB, R0, 1), 5453 BPF_EXIT_INSN(), 5454 }, 5455 INTERNAL, 5456 { }, 5457 { { 0, 2 } }, 5458 }, 5459 { 5460 "ALU_SUB_K: 3 - 0 = 3", 5461 .u.insns_int = { 5462 BPF_LD_IMM64(R0, 3), 5463 BPF_ALU32_IMM(BPF_SUB, R0, 0), 5464 BPF_EXIT_INSN(), 5465 }, 5466 INTERNAL, 5467 { }, 5468 { { 0, 3 } }, 5469 }, 5470 { 5471 "ALU_SUB_K: 4294967295 - 4294967294 = 1", 5472 .u.insns_int = { 5473 BPF_LD_IMM64(R0, 4294967295U), 5474 BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U), 5475 BPF_EXIT_INSN(), 5476 }, 5477 INTERNAL, 5478 { }, 5479 { { 0, 1 } }, 5480 }, 5481 { 5482 "ALU64_SUB_K: 3 - 1 = 2", 5483 .u.insns_int = { 5484 BPF_LD_IMM64(R0, 3), 5485 BPF_ALU64_IMM(BPF_SUB, R0, 1), 5486 BPF_EXIT_INSN(), 5487 }, 5488 INTERNAL, 5489 { }, 5490 { { 0, 2 } }, 5491 }, 5492 { 5493 "ALU64_SUB_K: 3 - 0 = 3", 5494 .u.insns_int = { 5495 BPF_LD_IMM64(R0, 3), 5496 BPF_ALU64_IMM(BPF_SUB, R0, 0), 5497 BPF_EXIT_INSN(), 5498 }, 5499 INTERNAL, 5500 { }, 5501 { { 0, 3 } }, 5502 }, 5503 { 5504 "ALU64_SUB_K: 4294967294 - 4294967295 = -1", 5505 .u.insns_int = { 5506 BPF_LD_IMM64(R0, 4294967294U), 5507 BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U), 5508 BPF_EXIT_INSN(), 5509 }, 5510 INTERNAL, 5511 { }, 5512 { { 0, -1 } }, 5513 }, 5514 { 5515 "ALU64_ADD_K: 2147483646 - 2147483647 = -1", 5516 .u.insns_int = { 5517 BPF_LD_IMM64(R0, 2147483646), 5518 BPF_ALU64_IMM(BPF_SUB, R0, 2147483647), 5519 BPF_EXIT_INSN(), 5520 }, 5521 INTERNAL, 5522 { }, 5523 { { 0, -1 } }, 5524 }, 5525 /* BPF_ALU | BPF_MUL | BPF_X */ 5526 { 5527 "ALU_MUL_X: 2 * 3 = 6", 5528 .u.insns_int = { 5529 BPF_LD_IMM64(R0, 2), 5530 BPF_ALU32_IMM(BPF_MOV, R1, 3), 5531 BPF_ALU32_REG(BPF_MUL, R0, R1), 5532 BPF_EXIT_INSN(), 5533 }, 5534 INTERNAL, 5535 { }, 5536 { { 0, 6 } }, 5537 }, 5538 { 5539 "ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0", 5540 .u.insns_int = { 5541 BPF_LD_IMM64(R0, 2), 5542 BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8), 5543 BPF_ALU32_REG(BPF_MUL, R0, R1), 5544 BPF_EXIT_INSN(), 5545 }, 5546 INTERNAL, 5547 { }, 5548 { { 0, 0xFFFFFFF0 } }, 5549 }, 5550 { 5551 "ALU_MUL_X: -1 * -1 = 1", 5552 .u.insns_int = { 5553 BPF_LD_IMM64(R0, -1), 5554 BPF_ALU32_IMM(BPF_MOV, R1, -1), 5555 BPF_ALU32_REG(BPF_MUL, R0, R1), 5556 BPF_EXIT_INSN(), 5557 }, 5558 INTERNAL, 5559 { }, 5560 { { 0, 1 } }, 5561 }, 5562 { 5563 "ALU64_MUL_X: 2 * 3 = 6", 5564 .u.insns_int = { 5565 BPF_LD_IMM64(R0, 2), 5566 BPF_ALU32_IMM(BPF_MOV, R1, 3), 5567 BPF_ALU64_REG(BPF_MUL, R0, R1), 5568 BPF_EXIT_INSN(), 5569 }, 5570 INTERNAL, 5571 { }, 5572 { { 0, 6 } }, 5573 }, 5574 { 5575 "ALU64_MUL_X: 1 * 2147483647 = 2147483647", 5576 .u.insns_int = { 5577 BPF_LD_IMM64(R0, 1), 5578 BPF_ALU32_IMM(BPF_MOV, R1, 2147483647), 5579 BPF_ALU64_REG(BPF_MUL, R0, R1), 5580 BPF_EXIT_INSN(), 5581 }, 5582 INTERNAL, 5583 { }, 5584 { { 0, 2147483647 } }, 5585 }, 5586 { 5587 "ALU64_MUL_X: 64x64 multiply, low word", 5588 .u.insns_int = { 5589 BPF_LD_IMM64(R0, 0x0fedcba987654321LL), 5590 BPF_LD_IMM64(R1, 0x123456789abcdef0LL), 5591 BPF_ALU64_REG(BPF_MUL, R0, R1), 5592 BPF_EXIT_INSN(), 5593 }, 5594 INTERNAL, 5595 { }, 5596 { { 0, 0xe5618cf0 } } 5597 }, 5598 { 5599 "ALU64_MUL_X: 64x64 multiply, high word", 5600 .u.insns_int = { 5601 BPF_LD_IMM64(R0, 0x0fedcba987654321LL), 5602 BPF_LD_IMM64(R1, 0x123456789abcdef0LL), 5603 BPF_ALU64_REG(BPF_MUL, R0, R1), 5604 BPF_ALU64_IMM(BPF_RSH, R0, 32), 5605 BPF_EXIT_INSN(), 5606 }, 5607 INTERNAL, 5608 { }, 5609 { { 0, 0x2236d88f } } 5610 }, 5611 /* BPF_ALU | BPF_MUL | BPF_K */ 5612 { 5613 "ALU_MUL_K: 2 * 3 = 6", 5614 .u.insns_int = { 5615 BPF_LD_IMM64(R0, 2), 5616 BPF_ALU32_IMM(BPF_MUL, R0, 3), 5617 BPF_EXIT_INSN(), 5618 }, 5619 INTERNAL, 5620 { }, 5621 { { 0, 6 } }, 5622 }, 5623 { 5624 "ALU_MUL_K: 3 * 1 = 3", 5625 .u.insns_int = { 5626 BPF_LD_IMM64(R0, 3), 5627 BPF_ALU32_IMM(BPF_MUL, R0, 1), 5628 BPF_EXIT_INSN(), 5629 }, 5630 INTERNAL, 5631 { }, 5632 { { 0, 3 } }, 5633 }, 5634 { 5635 "ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0", 5636 .u.insns_int = { 5637 BPF_LD_IMM64(R0, 2), 5638 BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8), 5639 BPF_EXIT_INSN(), 5640 }, 5641 INTERNAL, 5642 { }, 5643 { { 0, 0xFFFFFFF0 } }, 5644 }, 5645 { 5646 "ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff", 5647 .u.insns_int = { 5648 BPF_LD_IMM64(R2, 0x1), 5649 BPF_LD_IMM64(R3, 0x00000000ffffffff), 5650 BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff), 5651 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5652 BPF_MOV32_IMM(R0, 2), 5653 BPF_EXIT_INSN(), 5654 BPF_MOV32_IMM(R0, 1), 5655 BPF_EXIT_INSN(), 5656 }, 5657 INTERNAL, 5658 { }, 5659 { { 0, 0x1 } }, 5660 }, 5661 { 5662 "ALU64_MUL_K: 2 * 3 = 6", 5663 .u.insns_int = { 5664 BPF_LD_IMM64(R0, 2), 5665 BPF_ALU64_IMM(BPF_MUL, R0, 3), 5666 BPF_EXIT_INSN(), 5667 }, 5668 INTERNAL, 5669 { }, 5670 { { 0, 6 } }, 5671 }, 5672 { 5673 "ALU64_MUL_K: 3 * 1 = 3", 5674 .u.insns_int = { 5675 BPF_LD_IMM64(R0, 3), 5676 BPF_ALU64_IMM(BPF_MUL, R0, 1), 5677 BPF_EXIT_INSN(), 5678 }, 5679 INTERNAL, 5680 { }, 5681 { { 0, 3 } }, 5682 }, 5683 { 5684 "ALU64_MUL_K: 1 * 2147483647 = 2147483647", 5685 .u.insns_int = { 5686 BPF_LD_IMM64(R0, 1), 5687 BPF_ALU64_IMM(BPF_MUL, R0, 2147483647), 5688 BPF_EXIT_INSN(), 5689 }, 5690 INTERNAL, 5691 { }, 5692 { { 0, 2147483647 } }, 5693 }, 5694 { 5695 "ALU64_MUL_K: 1 * -2147483647 = -2147483647", 5696 .u.insns_int = { 5697 BPF_LD_IMM64(R0, 1), 5698 BPF_ALU64_IMM(BPF_MUL, R0, -2147483647), 5699 BPF_EXIT_INSN(), 5700 }, 5701 INTERNAL, 5702 { }, 5703 { { 0, -2147483647 } }, 5704 }, 5705 { 5706 "ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff", 5707 .u.insns_int = { 5708 BPF_LD_IMM64(R2, 0x1), 5709 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 5710 BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff), 5711 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5712 BPF_MOV32_IMM(R0, 2), 5713 BPF_EXIT_INSN(), 5714 BPF_MOV32_IMM(R0, 1), 5715 BPF_EXIT_INSN(), 5716 }, 5717 INTERNAL, 5718 { }, 5719 { { 0, 0x1 } }, 5720 }, 5721 { 5722 "ALU64_MUL_K: 64x32 multiply, low word", 5723 .u.insns_int = { 5724 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 5725 BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678), 5726 BPF_EXIT_INSN(), 5727 }, 5728 INTERNAL, 5729 { }, 5730 { { 0, 0xe242d208 } } 5731 }, 5732 { 5733 "ALU64_MUL_K: 64x32 multiply, high word", 5734 .u.insns_int = { 5735 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 5736 BPF_ALU64_IMM(BPF_MUL, R0, 0x12345678), 5737 BPF_ALU64_IMM(BPF_RSH, R0, 32), 5738 BPF_EXIT_INSN(), 5739 }, 5740 INTERNAL, 5741 { }, 5742 { { 0, 0xc28f5c28 } } 5743 }, 5744 /* BPF_ALU | BPF_DIV | BPF_X */ 5745 { 5746 "ALU_DIV_X: 6 / 2 = 3", 5747 .u.insns_int = { 5748 BPF_LD_IMM64(R0, 6), 5749 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5750 BPF_ALU32_REG(BPF_DIV, R0, R1), 5751 BPF_EXIT_INSN(), 5752 }, 5753 INTERNAL, 5754 { }, 5755 { { 0, 3 } }, 5756 }, 5757 { 5758 "ALU_DIV_X: 4294967295 / 4294967295 = 1", 5759 .u.insns_int = { 5760 BPF_LD_IMM64(R0, 4294967295U), 5761 BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U), 5762 BPF_ALU32_REG(BPF_DIV, R0, R1), 5763 BPF_EXIT_INSN(), 5764 }, 5765 INTERNAL, 5766 { }, 5767 { { 0, 1 } }, 5768 }, 5769 { 5770 "ALU64_DIV_X: 6 / 2 = 3", 5771 .u.insns_int = { 5772 BPF_LD_IMM64(R0, 6), 5773 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5774 BPF_ALU64_REG(BPF_DIV, R0, R1), 5775 BPF_EXIT_INSN(), 5776 }, 5777 INTERNAL, 5778 { }, 5779 { { 0, 3 } }, 5780 }, 5781 { 5782 "ALU64_DIV_X: 2147483647 / 2147483647 = 1", 5783 .u.insns_int = { 5784 BPF_LD_IMM64(R0, 2147483647), 5785 BPF_ALU32_IMM(BPF_MOV, R1, 2147483647), 5786 BPF_ALU64_REG(BPF_DIV, R0, R1), 5787 BPF_EXIT_INSN(), 5788 }, 5789 INTERNAL, 5790 { }, 5791 { { 0, 1 } }, 5792 }, 5793 { 5794 "ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001", 5795 .u.insns_int = { 5796 BPF_LD_IMM64(R2, 0xffffffffffffffffLL), 5797 BPF_LD_IMM64(R4, 0xffffffffffffffffLL), 5798 BPF_LD_IMM64(R3, 0x0000000000000001LL), 5799 BPF_ALU64_REG(BPF_DIV, R2, R4), 5800 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5801 BPF_MOV32_IMM(R0, 2), 5802 BPF_EXIT_INSN(), 5803 BPF_MOV32_IMM(R0, 1), 5804 BPF_EXIT_INSN(), 5805 }, 5806 INTERNAL, 5807 { }, 5808 { { 0, 0x1 } }, 5809 }, 5810 /* BPF_ALU | BPF_DIV | BPF_K */ 5811 { 5812 "ALU_DIV_K: 6 / 2 = 3", 5813 .u.insns_int = { 5814 BPF_LD_IMM64(R0, 6), 5815 BPF_ALU32_IMM(BPF_DIV, R0, 2), 5816 BPF_EXIT_INSN(), 5817 }, 5818 INTERNAL, 5819 { }, 5820 { { 0, 3 } }, 5821 }, 5822 { 5823 "ALU_DIV_K: 3 / 1 = 3", 5824 .u.insns_int = { 5825 BPF_LD_IMM64(R0, 3), 5826 BPF_ALU32_IMM(BPF_DIV, R0, 1), 5827 BPF_EXIT_INSN(), 5828 }, 5829 INTERNAL, 5830 { }, 5831 { { 0, 3 } }, 5832 }, 5833 { 5834 "ALU_DIV_K: 4294967295 / 4294967295 = 1", 5835 .u.insns_int = { 5836 BPF_LD_IMM64(R0, 4294967295U), 5837 BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U), 5838 BPF_EXIT_INSN(), 5839 }, 5840 INTERNAL, 5841 { }, 5842 { { 0, 1 } }, 5843 }, 5844 { 5845 "ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1", 5846 .u.insns_int = { 5847 BPF_LD_IMM64(R2, 0xffffffffffffffffLL), 5848 BPF_LD_IMM64(R3, 0x1UL), 5849 BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff), 5850 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5851 BPF_MOV32_IMM(R0, 2), 5852 BPF_EXIT_INSN(), 5853 BPF_MOV32_IMM(R0, 1), 5854 BPF_EXIT_INSN(), 5855 }, 5856 INTERNAL, 5857 { }, 5858 { { 0, 0x1 } }, 5859 }, 5860 { 5861 "ALU64_DIV_K: 6 / 2 = 3", 5862 .u.insns_int = { 5863 BPF_LD_IMM64(R0, 6), 5864 BPF_ALU64_IMM(BPF_DIV, R0, 2), 5865 BPF_EXIT_INSN(), 5866 }, 5867 INTERNAL, 5868 { }, 5869 { { 0, 3 } }, 5870 }, 5871 { 5872 "ALU64_DIV_K: 3 / 1 = 3", 5873 .u.insns_int = { 5874 BPF_LD_IMM64(R0, 3), 5875 BPF_ALU64_IMM(BPF_DIV, R0, 1), 5876 BPF_EXIT_INSN(), 5877 }, 5878 INTERNAL, 5879 { }, 5880 { { 0, 3 } }, 5881 }, 5882 { 5883 "ALU64_DIV_K: 2147483647 / 2147483647 = 1", 5884 .u.insns_int = { 5885 BPF_LD_IMM64(R0, 2147483647), 5886 BPF_ALU64_IMM(BPF_DIV, R0, 2147483647), 5887 BPF_EXIT_INSN(), 5888 }, 5889 INTERNAL, 5890 { }, 5891 { { 0, 1 } }, 5892 }, 5893 { 5894 "ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001", 5895 .u.insns_int = { 5896 BPF_LD_IMM64(R2, 0xffffffffffffffffLL), 5897 BPF_LD_IMM64(R3, 0x0000000000000001LL), 5898 BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff), 5899 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 5900 BPF_MOV32_IMM(R0, 2), 5901 BPF_EXIT_INSN(), 5902 BPF_MOV32_IMM(R0, 1), 5903 BPF_EXIT_INSN(), 5904 }, 5905 INTERNAL, 5906 { }, 5907 { { 0, 0x1 } }, 5908 }, 5909 /* BPF_ALU | BPF_MOD | BPF_X */ 5910 { 5911 "ALU_MOD_X: 3 % 2 = 1", 5912 .u.insns_int = { 5913 BPF_LD_IMM64(R0, 3), 5914 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5915 BPF_ALU32_REG(BPF_MOD, R0, R1), 5916 BPF_EXIT_INSN(), 5917 }, 5918 INTERNAL, 5919 { }, 5920 { { 0, 1 } }, 5921 }, 5922 { 5923 "ALU_MOD_X: 4294967295 % 4294967293 = 2", 5924 .u.insns_int = { 5925 BPF_LD_IMM64(R0, 4294967295U), 5926 BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U), 5927 BPF_ALU32_REG(BPF_MOD, R0, R1), 5928 BPF_EXIT_INSN(), 5929 }, 5930 INTERNAL, 5931 { }, 5932 { { 0, 2 } }, 5933 }, 5934 { 5935 "ALU64_MOD_X: 3 % 2 = 1", 5936 .u.insns_int = { 5937 BPF_LD_IMM64(R0, 3), 5938 BPF_ALU32_IMM(BPF_MOV, R1, 2), 5939 BPF_ALU64_REG(BPF_MOD, R0, R1), 5940 BPF_EXIT_INSN(), 5941 }, 5942 INTERNAL, 5943 { }, 5944 { { 0, 1 } }, 5945 }, 5946 { 5947 "ALU64_MOD_X: 2147483647 % 2147483645 = 2", 5948 .u.insns_int = { 5949 BPF_LD_IMM64(R0, 2147483647), 5950 BPF_ALU32_IMM(BPF_MOV, R1, 2147483645), 5951 BPF_ALU64_REG(BPF_MOD, R0, R1), 5952 BPF_EXIT_INSN(), 5953 }, 5954 INTERNAL, 5955 { }, 5956 { { 0, 2 } }, 5957 }, 5958 /* BPF_ALU | BPF_MOD | BPF_K */ 5959 { 5960 "ALU_MOD_K: 3 % 2 = 1", 5961 .u.insns_int = { 5962 BPF_LD_IMM64(R0, 3), 5963 BPF_ALU32_IMM(BPF_MOD, R0, 2), 5964 BPF_EXIT_INSN(), 5965 }, 5966 INTERNAL, 5967 { }, 5968 { { 0, 1 } }, 5969 }, 5970 { 5971 "ALU_MOD_K: 3 % 1 = 0", 5972 .u.insns_int = { 5973 BPF_LD_IMM64(R0, 3), 5974 BPF_ALU32_IMM(BPF_MOD, R0, 1), 5975 BPF_EXIT_INSN(), 5976 }, 5977 INTERNAL, 5978 { }, 5979 { { 0, 0 } }, 5980 }, 5981 { 5982 "ALU_MOD_K: 4294967295 % 4294967293 = 2", 5983 .u.insns_int = { 5984 BPF_LD_IMM64(R0, 4294967295U), 5985 BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U), 5986 BPF_EXIT_INSN(), 5987 }, 5988 INTERNAL, 5989 { }, 5990 { { 0, 2 } }, 5991 }, 5992 { 5993 "ALU64_MOD_K: 3 % 2 = 1", 5994 .u.insns_int = { 5995 BPF_LD_IMM64(R0, 3), 5996 BPF_ALU64_IMM(BPF_MOD, R0, 2), 5997 BPF_EXIT_INSN(), 5998 }, 5999 INTERNAL, 6000 { }, 6001 { { 0, 1 } }, 6002 }, 6003 { 6004 "ALU64_MOD_K: 3 % 1 = 0", 6005 .u.insns_int = { 6006 BPF_LD_IMM64(R0, 3), 6007 BPF_ALU64_IMM(BPF_MOD, R0, 1), 6008 BPF_EXIT_INSN(), 6009 }, 6010 INTERNAL, 6011 { }, 6012 { { 0, 0 } }, 6013 }, 6014 { 6015 "ALU64_MOD_K: 2147483647 % 2147483645 = 2", 6016 .u.insns_int = { 6017 BPF_LD_IMM64(R0, 2147483647), 6018 BPF_ALU64_IMM(BPF_MOD, R0, 2147483645), 6019 BPF_EXIT_INSN(), 6020 }, 6021 INTERNAL, 6022 { }, 6023 { { 0, 2 } }, 6024 }, 6025 /* BPF_ALU | BPF_AND | BPF_X */ 6026 { 6027 "ALU_AND_X: 3 & 2 = 2", 6028 .u.insns_int = { 6029 BPF_LD_IMM64(R0, 3), 6030 BPF_ALU32_IMM(BPF_MOV, R1, 2), 6031 BPF_ALU32_REG(BPF_AND, R0, R1), 6032 BPF_EXIT_INSN(), 6033 }, 6034 INTERNAL, 6035 { }, 6036 { { 0, 2 } }, 6037 }, 6038 { 6039 "ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff", 6040 .u.insns_int = { 6041 BPF_LD_IMM64(R0, 0xffffffff), 6042 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6043 BPF_ALU32_REG(BPF_AND, R0, R1), 6044 BPF_EXIT_INSN(), 6045 }, 6046 INTERNAL, 6047 { }, 6048 { { 0, 0xffffffff } }, 6049 }, 6050 { 6051 "ALU64_AND_X: 3 & 2 = 2", 6052 .u.insns_int = { 6053 BPF_LD_IMM64(R0, 3), 6054 BPF_ALU32_IMM(BPF_MOV, R1, 2), 6055 BPF_ALU64_REG(BPF_AND, R0, R1), 6056 BPF_EXIT_INSN(), 6057 }, 6058 INTERNAL, 6059 { }, 6060 { { 0, 2 } }, 6061 }, 6062 { 6063 "ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff", 6064 .u.insns_int = { 6065 BPF_LD_IMM64(R0, 0xffffffff), 6066 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6067 BPF_ALU64_REG(BPF_AND, R0, R1), 6068 BPF_EXIT_INSN(), 6069 }, 6070 INTERNAL, 6071 { }, 6072 { { 0, 0xffffffff } }, 6073 }, 6074 /* BPF_ALU | BPF_AND | BPF_K */ 6075 { 6076 "ALU_AND_K: 3 & 2 = 2", 6077 .u.insns_int = { 6078 BPF_LD_IMM64(R0, 3), 6079 BPF_ALU32_IMM(BPF_AND, R0, 2), 6080 BPF_EXIT_INSN(), 6081 }, 6082 INTERNAL, 6083 { }, 6084 { { 0, 2 } }, 6085 }, 6086 { 6087 "ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff", 6088 .u.insns_int = { 6089 BPF_LD_IMM64(R0, 0xffffffff), 6090 BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff), 6091 BPF_EXIT_INSN(), 6092 }, 6093 INTERNAL, 6094 { }, 6095 { { 0, 0xffffffff } }, 6096 }, 6097 { 6098 "ALU_AND_K: Small immediate", 6099 .u.insns_int = { 6100 BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304), 6101 BPF_ALU32_IMM(BPF_AND, R0, 15), 6102 BPF_EXIT_INSN(), 6103 }, 6104 INTERNAL, 6105 { }, 6106 { { 0, 4 } } 6107 }, 6108 { 6109 "ALU_AND_K: Large immediate", 6110 .u.insns_int = { 6111 BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4), 6112 BPF_ALU32_IMM(BPF_AND, R0, 0xafbfcfdf), 6113 BPF_EXIT_INSN(), 6114 }, 6115 INTERNAL, 6116 { }, 6117 { { 0, 0xa1b2c3d4 } } 6118 }, 6119 { 6120 "ALU_AND_K: Zero extension", 6121 .u.insns_int = { 6122 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6123 BPF_LD_IMM64(R1, 0x0000000080a0c0e0LL), 6124 BPF_ALU32_IMM(BPF_AND, R0, 0xf0f0f0f0), 6125 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6126 BPF_MOV32_IMM(R0, 2), 6127 BPF_EXIT_INSN(), 6128 BPF_MOV32_IMM(R0, 1), 6129 BPF_EXIT_INSN(), 6130 }, 6131 INTERNAL, 6132 { }, 6133 { { 0, 1 } } 6134 }, 6135 { 6136 "ALU64_AND_K: 3 & 2 = 2", 6137 .u.insns_int = { 6138 BPF_LD_IMM64(R0, 3), 6139 BPF_ALU64_IMM(BPF_AND, R0, 2), 6140 BPF_EXIT_INSN(), 6141 }, 6142 INTERNAL, 6143 { }, 6144 { { 0, 2 } }, 6145 }, 6146 { 6147 "ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff", 6148 .u.insns_int = { 6149 BPF_LD_IMM64(R0, 0xffffffff), 6150 BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff), 6151 BPF_EXIT_INSN(), 6152 }, 6153 INTERNAL, 6154 { }, 6155 { { 0, 0xffffffff } }, 6156 }, 6157 { 6158 "ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000000000000000", 6159 .u.insns_int = { 6160 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6161 BPF_LD_IMM64(R3, 0x0000000000000000LL), 6162 BPF_ALU64_IMM(BPF_AND, R2, 0x0), 6163 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6164 BPF_MOV32_IMM(R0, 2), 6165 BPF_EXIT_INSN(), 6166 BPF_MOV32_IMM(R0, 1), 6167 BPF_EXIT_INSN(), 6168 }, 6169 INTERNAL, 6170 { }, 6171 { { 0, 0x1 } }, 6172 }, 6173 { 6174 "ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffff0000", 6175 .u.insns_int = { 6176 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6177 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL), 6178 BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff), 6179 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6180 BPF_MOV32_IMM(R0, 2), 6181 BPF_EXIT_INSN(), 6182 BPF_MOV32_IMM(R0, 1), 6183 BPF_EXIT_INSN(), 6184 }, 6185 INTERNAL, 6186 { }, 6187 { { 0, 0x1 } }, 6188 }, 6189 { 6190 "ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff", 6191 .u.insns_int = { 6192 BPF_LD_IMM64(R2, 0xffffffffffffffffLL), 6193 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 6194 BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff), 6195 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6196 BPF_MOV32_IMM(R0, 2), 6197 BPF_EXIT_INSN(), 6198 BPF_MOV32_IMM(R0, 1), 6199 BPF_EXIT_INSN(), 6200 }, 6201 INTERNAL, 6202 { }, 6203 { { 0, 0x1 } }, 6204 }, 6205 { 6206 "ALU64_AND_K: Sign extension 1", 6207 .u.insns_int = { 6208 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6209 BPF_LD_IMM64(R1, 0x00000000090b0d0fLL), 6210 BPF_ALU64_IMM(BPF_AND, R0, 0x0f0f0f0f), 6211 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6212 BPF_MOV32_IMM(R0, 2), 6213 BPF_EXIT_INSN(), 6214 BPF_MOV32_IMM(R0, 1), 6215 BPF_EXIT_INSN(), 6216 }, 6217 INTERNAL, 6218 { }, 6219 { { 0, 1 } } 6220 }, 6221 { 6222 "ALU64_AND_K: Sign extension 2", 6223 .u.insns_int = { 6224 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6225 BPF_LD_IMM64(R1, 0x0123456780a0c0e0LL), 6226 BPF_ALU64_IMM(BPF_AND, R0, 0xf0f0f0f0), 6227 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6228 BPF_MOV32_IMM(R0, 2), 6229 BPF_EXIT_INSN(), 6230 BPF_MOV32_IMM(R0, 1), 6231 BPF_EXIT_INSN(), 6232 }, 6233 INTERNAL, 6234 { }, 6235 { { 0, 1 } } 6236 }, 6237 /* BPF_ALU | BPF_OR | BPF_X */ 6238 { 6239 "ALU_OR_X: 1 | 2 = 3", 6240 .u.insns_int = { 6241 BPF_LD_IMM64(R0, 1), 6242 BPF_ALU32_IMM(BPF_MOV, R1, 2), 6243 BPF_ALU32_REG(BPF_OR, R0, R1), 6244 BPF_EXIT_INSN(), 6245 }, 6246 INTERNAL, 6247 { }, 6248 { { 0, 3 } }, 6249 }, 6250 { 6251 "ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff", 6252 .u.insns_int = { 6253 BPF_LD_IMM64(R0, 0), 6254 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6255 BPF_ALU32_REG(BPF_OR, R0, R1), 6256 BPF_EXIT_INSN(), 6257 }, 6258 INTERNAL, 6259 { }, 6260 { { 0, 0xffffffff } }, 6261 }, 6262 { 6263 "ALU64_OR_X: 1 | 2 = 3", 6264 .u.insns_int = { 6265 BPF_LD_IMM64(R0, 1), 6266 BPF_ALU32_IMM(BPF_MOV, R1, 2), 6267 BPF_ALU64_REG(BPF_OR, R0, R1), 6268 BPF_EXIT_INSN(), 6269 }, 6270 INTERNAL, 6271 { }, 6272 { { 0, 3 } }, 6273 }, 6274 { 6275 "ALU64_OR_X: 0 | 0xffffffff = 0xffffffff", 6276 .u.insns_int = { 6277 BPF_LD_IMM64(R0, 0), 6278 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6279 BPF_ALU64_REG(BPF_OR, R0, R1), 6280 BPF_EXIT_INSN(), 6281 }, 6282 INTERNAL, 6283 { }, 6284 { { 0, 0xffffffff } }, 6285 }, 6286 /* BPF_ALU | BPF_OR | BPF_K */ 6287 { 6288 "ALU_OR_K: 1 | 2 = 3", 6289 .u.insns_int = { 6290 BPF_LD_IMM64(R0, 1), 6291 BPF_ALU32_IMM(BPF_OR, R0, 2), 6292 BPF_EXIT_INSN(), 6293 }, 6294 INTERNAL, 6295 { }, 6296 { { 0, 3 } }, 6297 }, 6298 { 6299 "ALU_OR_K: 0 & 0xffffffff = 0xffffffff", 6300 .u.insns_int = { 6301 BPF_LD_IMM64(R0, 0), 6302 BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff), 6303 BPF_EXIT_INSN(), 6304 }, 6305 INTERNAL, 6306 { }, 6307 { { 0, 0xffffffff } }, 6308 }, 6309 { 6310 "ALU_OR_K: Small immediate", 6311 .u.insns_int = { 6312 BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304), 6313 BPF_ALU32_IMM(BPF_OR, R0, 1), 6314 BPF_EXIT_INSN(), 6315 }, 6316 INTERNAL, 6317 { }, 6318 { { 0, 0x01020305 } } 6319 }, 6320 { 6321 "ALU_OR_K: Large immediate", 6322 .u.insns_int = { 6323 BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304), 6324 BPF_ALU32_IMM(BPF_OR, R0, 0xa0b0c0d0), 6325 BPF_EXIT_INSN(), 6326 }, 6327 INTERNAL, 6328 { }, 6329 { { 0, 0xa1b2c3d4 } } 6330 }, 6331 { 6332 "ALU_OR_K: Zero extension", 6333 .u.insns_int = { 6334 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6335 BPF_LD_IMM64(R1, 0x00000000f9fbfdffLL), 6336 BPF_ALU32_IMM(BPF_OR, R0, 0xf0f0f0f0), 6337 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6338 BPF_MOV32_IMM(R0, 2), 6339 BPF_EXIT_INSN(), 6340 BPF_MOV32_IMM(R0, 1), 6341 BPF_EXIT_INSN(), 6342 }, 6343 INTERNAL, 6344 { }, 6345 { { 0, 1 } } 6346 }, 6347 { 6348 "ALU64_OR_K: 1 | 2 = 3", 6349 .u.insns_int = { 6350 BPF_LD_IMM64(R0, 1), 6351 BPF_ALU64_IMM(BPF_OR, R0, 2), 6352 BPF_EXIT_INSN(), 6353 }, 6354 INTERNAL, 6355 { }, 6356 { { 0, 3 } }, 6357 }, 6358 { 6359 "ALU64_OR_K: 0 & 0xffffffff = 0xffffffff", 6360 .u.insns_int = { 6361 BPF_LD_IMM64(R0, 0), 6362 BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff), 6363 BPF_EXIT_INSN(), 6364 }, 6365 INTERNAL, 6366 { }, 6367 { { 0, 0xffffffff } }, 6368 }, 6369 { 6370 "ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffffffff0000", 6371 .u.insns_int = { 6372 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6373 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL), 6374 BPF_ALU64_IMM(BPF_OR, R2, 0x0), 6375 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6376 BPF_MOV32_IMM(R0, 2), 6377 BPF_EXIT_INSN(), 6378 BPF_MOV32_IMM(R0, 1), 6379 BPF_EXIT_INSN(), 6380 }, 6381 INTERNAL, 6382 { }, 6383 { { 0, 0x1 } }, 6384 }, 6385 { 6386 "ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff", 6387 .u.insns_int = { 6388 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6389 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 6390 BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff), 6391 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6392 BPF_MOV32_IMM(R0, 2), 6393 BPF_EXIT_INSN(), 6394 BPF_MOV32_IMM(R0, 1), 6395 BPF_EXIT_INSN(), 6396 }, 6397 INTERNAL, 6398 { }, 6399 { { 0, 0x1 } }, 6400 }, 6401 { 6402 "ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff", 6403 .u.insns_int = { 6404 BPF_LD_IMM64(R2, 0x0000000000000000LL), 6405 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 6406 BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff), 6407 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6408 BPF_MOV32_IMM(R0, 2), 6409 BPF_EXIT_INSN(), 6410 BPF_MOV32_IMM(R0, 1), 6411 BPF_EXIT_INSN(), 6412 }, 6413 INTERNAL, 6414 { }, 6415 { { 0, 0x1 } }, 6416 }, 6417 { 6418 "ALU64_OR_K: Sign extension 1", 6419 .u.insns_int = { 6420 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6421 BPF_LD_IMM64(R1, 0x012345678fafcfefLL), 6422 BPF_ALU64_IMM(BPF_OR, R0, 0x0f0f0f0f), 6423 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6424 BPF_MOV32_IMM(R0, 2), 6425 BPF_EXIT_INSN(), 6426 BPF_MOV32_IMM(R0, 1), 6427 BPF_EXIT_INSN(), 6428 }, 6429 INTERNAL, 6430 { }, 6431 { { 0, 1 } } 6432 }, 6433 { 6434 "ALU64_OR_K: Sign extension 2", 6435 .u.insns_int = { 6436 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6437 BPF_LD_IMM64(R1, 0xfffffffff9fbfdffLL), 6438 BPF_ALU64_IMM(BPF_OR, R0, 0xf0f0f0f0), 6439 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6440 BPF_MOV32_IMM(R0, 2), 6441 BPF_EXIT_INSN(), 6442 BPF_MOV32_IMM(R0, 1), 6443 BPF_EXIT_INSN(), 6444 }, 6445 INTERNAL, 6446 { }, 6447 { { 0, 1 } } 6448 }, 6449 /* BPF_ALU | BPF_XOR | BPF_X */ 6450 { 6451 "ALU_XOR_X: 5 ^ 6 = 3", 6452 .u.insns_int = { 6453 BPF_LD_IMM64(R0, 5), 6454 BPF_ALU32_IMM(BPF_MOV, R1, 6), 6455 BPF_ALU32_REG(BPF_XOR, R0, R1), 6456 BPF_EXIT_INSN(), 6457 }, 6458 INTERNAL, 6459 { }, 6460 { { 0, 3 } }, 6461 }, 6462 { 6463 "ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe", 6464 .u.insns_int = { 6465 BPF_LD_IMM64(R0, 1), 6466 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6467 BPF_ALU32_REG(BPF_XOR, R0, R1), 6468 BPF_EXIT_INSN(), 6469 }, 6470 INTERNAL, 6471 { }, 6472 { { 0, 0xfffffffe } }, 6473 }, 6474 { 6475 "ALU64_XOR_X: 5 ^ 6 = 3", 6476 .u.insns_int = { 6477 BPF_LD_IMM64(R0, 5), 6478 BPF_ALU32_IMM(BPF_MOV, R1, 6), 6479 BPF_ALU64_REG(BPF_XOR, R0, R1), 6480 BPF_EXIT_INSN(), 6481 }, 6482 INTERNAL, 6483 { }, 6484 { { 0, 3 } }, 6485 }, 6486 { 6487 "ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe", 6488 .u.insns_int = { 6489 BPF_LD_IMM64(R0, 1), 6490 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 6491 BPF_ALU64_REG(BPF_XOR, R0, R1), 6492 BPF_EXIT_INSN(), 6493 }, 6494 INTERNAL, 6495 { }, 6496 { { 0, 0xfffffffe } }, 6497 }, 6498 /* BPF_ALU | BPF_XOR | BPF_K */ 6499 { 6500 "ALU_XOR_K: 5 ^ 6 = 3", 6501 .u.insns_int = { 6502 BPF_LD_IMM64(R0, 5), 6503 BPF_ALU32_IMM(BPF_XOR, R0, 6), 6504 BPF_EXIT_INSN(), 6505 }, 6506 INTERNAL, 6507 { }, 6508 { { 0, 3 } }, 6509 }, 6510 { 6511 "ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe", 6512 .u.insns_int = { 6513 BPF_LD_IMM64(R0, 1), 6514 BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff), 6515 BPF_EXIT_INSN(), 6516 }, 6517 INTERNAL, 6518 { }, 6519 { { 0, 0xfffffffe } }, 6520 }, 6521 { 6522 "ALU_XOR_K: Small immediate", 6523 .u.insns_int = { 6524 BPF_ALU32_IMM(BPF_MOV, R0, 0x01020304), 6525 BPF_ALU32_IMM(BPF_XOR, R0, 15), 6526 BPF_EXIT_INSN(), 6527 }, 6528 INTERNAL, 6529 { }, 6530 { { 0, 0x0102030b } } 6531 }, 6532 { 6533 "ALU_XOR_K: Large immediate", 6534 .u.insns_int = { 6535 BPF_ALU32_IMM(BPF_MOV, R0, 0xf1f2f3f4), 6536 BPF_ALU32_IMM(BPF_XOR, R0, 0xafbfcfdf), 6537 BPF_EXIT_INSN(), 6538 }, 6539 INTERNAL, 6540 { }, 6541 { { 0, 0x5e4d3c2b } } 6542 }, 6543 { 6544 "ALU_XOR_K: Zero extension", 6545 .u.insns_int = { 6546 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6547 BPF_LD_IMM64(R1, 0x00000000795b3d1fLL), 6548 BPF_ALU32_IMM(BPF_XOR, R0, 0xf0f0f0f0), 6549 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6550 BPF_MOV32_IMM(R0, 2), 6551 BPF_EXIT_INSN(), 6552 BPF_MOV32_IMM(R0, 1), 6553 BPF_EXIT_INSN(), 6554 }, 6555 INTERNAL, 6556 { }, 6557 { { 0, 1 } } 6558 }, 6559 { 6560 "ALU64_XOR_K: 5 ^ 6 = 3", 6561 .u.insns_int = { 6562 BPF_LD_IMM64(R0, 5), 6563 BPF_ALU64_IMM(BPF_XOR, R0, 6), 6564 BPF_EXIT_INSN(), 6565 }, 6566 INTERNAL, 6567 { }, 6568 { { 0, 3 } }, 6569 }, 6570 { 6571 "ALU64_XOR_K: 1 ^ 0xffffffff = 0xfffffffe", 6572 .u.insns_int = { 6573 BPF_LD_IMM64(R0, 1), 6574 BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff), 6575 BPF_EXIT_INSN(), 6576 }, 6577 INTERNAL, 6578 { }, 6579 { { 0, 0xfffffffe } }, 6580 }, 6581 { 6582 "ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000", 6583 .u.insns_int = { 6584 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6585 BPF_LD_IMM64(R3, 0x0000ffffffff0000LL), 6586 BPF_ALU64_IMM(BPF_XOR, R2, 0x0), 6587 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6588 BPF_MOV32_IMM(R0, 2), 6589 BPF_EXIT_INSN(), 6590 BPF_MOV32_IMM(R0, 1), 6591 BPF_EXIT_INSN(), 6592 }, 6593 INTERNAL, 6594 { }, 6595 { { 0, 0x1 } }, 6596 }, 6597 { 6598 "ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff", 6599 .u.insns_int = { 6600 BPF_LD_IMM64(R2, 0x0000ffffffff0000LL), 6601 BPF_LD_IMM64(R3, 0xffff00000000ffffLL), 6602 BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff), 6603 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6604 BPF_MOV32_IMM(R0, 2), 6605 BPF_EXIT_INSN(), 6606 BPF_MOV32_IMM(R0, 1), 6607 BPF_EXIT_INSN(), 6608 }, 6609 INTERNAL, 6610 { }, 6611 { { 0, 0x1 } }, 6612 }, 6613 { 6614 "ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff", 6615 .u.insns_int = { 6616 BPF_LD_IMM64(R2, 0x0000000000000000LL), 6617 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 6618 BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff), 6619 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 6620 BPF_MOV32_IMM(R0, 2), 6621 BPF_EXIT_INSN(), 6622 BPF_MOV32_IMM(R0, 1), 6623 BPF_EXIT_INSN(), 6624 }, 6625 INTERNAL, 6626 { }, 6627 { { 0, 0x1 } }, 6628 }, 6629 { 6630 "ALU64_XOR_K: Sign extension 1", 6631 .u.insns_int = { 6632 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6633 BPF_LD_IMM64(R1, 0x0123456786a4c2e0LL), 6634 BPF_ALU64_IMM(BPF_XOR, R0, 0x0f0f0f0f), 6635 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6636 BPF_MOV32_IMM(R0, 2), 6637 BPF_EXIT_INSN(), 6638 BPF_MOV32_IMM(R0, 1), 6639 BPF_EXIT_INSN(), 6640 }, 6641 INTERNAL, 6642 { }, 6643 { { 0, 1 } } 6644 }, 6645 { 6646 "ALU64_XOR_K: Sign extension 2", 6647 .u.insns_int = { 6648 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6649 BPF_LD_IMM64(R1, 0xfedcba98795b3d1fLL), 6650 BPF_ALU64_IMM(BPF_XOR, R0, 0xf0f0f0f0), 6651 BPF_JMP_REG(BPF_JEQ, R0, R1, 2), 6652 BPF_MOV32_IMM(R0, 2), 6653 BPF_EXIT_INSN(), 6654 BPF_MOV32_IMM(R0, 1), 6655 BPF_EXIT_INSN(), 6656 }, 6657 INTERNAL, 6658 { }, 6659 { { 0, 1 } } 6660 }, 6661 /* BPF_ALU | BPF_LSH | BPF_X */ 6662 { 6663 "ALU_LSH_X: 1 << 1 = 2", 6664 .u.insns_int = { 6665 BPF_LD_IMM64(R0, 1), 6666 BPF_ALU32_IMM(BPF_MOV, R1, 1), 6667 BPF_ALU32_REG(BPF_LSH, R0, R1), 6668 BPF_EXIT_INSN(), 6669 }, 6670 INTERNAL, 6671 { }, 6672 { { 0, 2 } }, 6673 }, 6674 { 6675 "ALU_LSH_X: 1 << 31 = 0x80000000", 6676 .u.insns_int = { 6677 BPF_LD_IMM64(R0, 1), 6678 BPF_ALU32_IMM(BPF_MOV, R1, 31), 6679 BPF_ALU32_REG(BPF_LSH, R0, R1), 6680 BPF_EXIT_INSN(), 6681 }, 6682 INTERNAL, 6683 { }, 6684 { { 0, 0x80000000 } }, 6685 }, 6686 { 6687 "ALU_LSH_X: 0x12345678 << 12 = 0x45678000", 6688 .u.insns_int = { 6689 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 6690 BPF_ALU32_IMM(BPF_MOV, R1, 12), 6691 BPF_ALU32_REG(BPF_LSH, R0, R1), 6692 BPF_EXIT_INSN(), 6693 }, 6694 INTERNAL, 6695 { }, 6696 { { 0, 0x45678000 } } 6697 }, 6698 { 6699 "ALU64_LSH_X: 1 << 1 = 2", 6700 .u.insns_int = { 6701 BPF_LD_IMM64(R0, 1), 6702 BPF_ALU32_IMM(BPF_MOV, R1, 1), 6703 BPF_ALU64_REG(BPF_LSH, R0, R1), 6704 BPF_EXIT_INSN(), 6705 }, 6706 INTERNAL, 6707 { }, 6708 { { 0, 2 } }, 6709 }, 6710 { 6711 "ALU64_LSH_X: 1 << 31 = 0x80000000", 6712 .u.insns_int = { 6713 BPF_LD_IMM64(R0, 1), 6714 BPF_ALU32_IMM(BPF_MOV, R1, 31), 6715 BPF_ALU64_REG(BPF_LSH, R0, R1), 6716 BPF_EXIT_INSN(), 6717 }, 6718 INTERNAL, 6719 { }, 6720 { { 0, 0x80000000 } }, 6721 }, 6722 { 6723 "ALU64_LSH_X: Shift < 32, low word", 6724 .u.insns_int = { 6725 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6726 BPF_ALU32_IMM(BPF_MOV, R1, 12), 6727 BPF_ALU64_REG(BPF_LSH, R0, R1), 6728 BPF_EXIT_INSN(), 6729 }, 6730 INTERNAL, 6731 { }, 6732 { { 0, 0xbcdef000 } } 6733 }, 6734 { 6735 "ALU64_LSH_X: Shift < 32, high word", 6736 .u.insns_int = { 6737 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6738 BPF_ALU32_IMM(BPF_MOV, R1, 12), 6739 BPF_ALU64_REG(BPF_LSH, R0, R1), 6740 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6741 BPF_EXIT_INSN(), 6742 }, 6743 INTERNAL, 6744 { }, 6745 { { 0, 0x3456789a } } 6746 }, 6747 { 6748 "ALU64_LSH_X: Shift > 32, low word", 6749 .u.insns_int = { 6750 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6751 BPF_ALU32_IMM(BPF_MOV, R1, 36), 6752 BPF_ALU64_REG(BPF_LSH, R0, R1), 6753 BPF_EXIT_INSN(), 6754 }, 6755 INTERNAL, 6756 { }, 6757 { { 0, 0 } } 6758 }, 6759 { 6760 "ALU64_LSH_X: Shift > 32, high word", 6761 .u.insns_int = { 6762 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6763 BPF_ALU32_IMM(BPF_MOV, R1, 36), 6764 BPF_ALU64_REG(BPF_LSH, R0, R1), 6765 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6766 BPF_EXIT_INSN(), 6767 }, 6768 INTERNAL, 6769 { }, 6770 { { 0, 0x9abcdef0 } } 6771 }, 6772 { 6773 "ALU64_LSH_X: Shift == 32, low word", 6774 .u.insns_int = { 6775 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6776 BPF_ALU32_IMM(BPF_MOV, R1, 32), 6777 BPF_ALU64_REG(BPF_LSH, R0, R1), 6778 BPF_EXIT_INSN(), 6779 }, 6780 INTERNAL, 6781 { }, 6782 { { 0, 0 } } 6783 }, 6784 { 6785 "ALU64_LSH_X: Shift == 32, high word", 6786 .u.insns_int = { 6787 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6788 BPF_ALU32_IMM(BPF_MOV, R1, 32), 6789 BPF_ALU64_REG(BPF_LSH, R0, R1), 6790 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6791 BPF_EXIT_INSN(), 6792 }, 6793 INTERNAL, 6794 { }, 6795 { { 0, 0x89abcdef } } 6796 }, 6797 { 6798 "ALU64_LSH_X: Zero shift, low word", 6799 .u.insns_int = { 6800 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6801 BPF_ALU32_IMM(BPF_MOV, R1, 0), 6802 BPF_ALU64_REG(BPF_LSH, R0, R1), 6803 BPF_EXIT_INSN(), 6804 }, 6805 INTERNAL, 6806 { }, 6807 { { 0, 0x89abcdef } } 6808 }, 6809 { 6810 "ALU64_LSH_X: Zero shift, high word", 6811 .u.insns_int = { 6812 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6813 BPF_ALU32_IMM(BPF_MOV, R1, 0), 6814 BPF_ALU64_REG(BPF_LSH, R0, R1), 6815 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6816 BPF_EXIT_INSN(), 6817 }, 6818 INTERNAL, 6819 { }, 6820 { { 0, 0x01234567 } } 6821 }, 6822 /* BPF_ALU | BPF_LSH | BPF_K */ 6823 { 6824 "ALU_LSH_K: 1 << 1 = 2", 6825 .u.insns_int = { 6826 BPF_LD_IMM64(R0, 1), 6827 BPF_ALU32_IMM(BPF_LSH, R0, 1), 6828 BPF_EXIT_INSN(), 6829 }, 6830 INTERNAL, 6831 { }, 6832 { { 0, 2 } }, 6833 }, 6834 { 6835 "ALU_LSH_K: 1 << 31 = 0x80000000", 6836 .u.insns_int = { 6837 BPF_LD_IMM64(R0, 1), 6838 BPF_ALU32_IMM(BPF_LSH, R0, 31), 6839 BPF_EXIT_INSN(), 6840 }, 6841 INTERNAL, 6842 { }, 6843 { { 0, 0x80000000 } }, 6844 }, 6845 { 6846 "ALU_LSH_K: 0x12345678 << 12 = 0x45678000", 6847 .u.insns_int = { 6848 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 6849 BPF_ALU32_IMM(BPF_LSH, R0, 12), 6850 BPF_EXIT_INSN(), 6851 }, 6852 INTERNAL, 6853 { }, 6854 { { 0, 0x45678000 } } 6855 }, 6856 { 6857 "ALU_LSH_K: 0x12345678 << 0 = 0x12345678", 6858 .u.insns_int = { 6859 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 6860 BPF_ALU32_IMM(BPF_LSH, R0, 0), 6861 BPF_EXIT_INSN(), 6862 }, 6863 INTERNAL, 6864 { }, 6865 { { 0, 0x12345678 } } 6866 }, 6867 { 6868 "ALU64_LSH_K: 1 << 1 = 2", 6869 .u.insns_int = { 6870 BPF_LD_IMM64(R0, 1), 6871 BPF_ALU64_IMM(BPF_LSH, R0, 1), 6872 BPF_EXIT_INSN(), 6873 }, 6874 INTERNAL, 6875 { }, 6876 { { 0, 2 } }, 6877 }, 6878 { 6879 "ALU64_LSH_K: 1 << 31 = 0x80000000", 6880 .u.insns_int = { 6881 BPF_LD_IMM64(R0, 1), 6882 BPF_ALU64_IMM(BPF_LSH, R0, 31), 6883 BPF_EXIT_INSN(), 6884 }, 6885 INTERNAL, 6886 { }, 6887 { { 0, 0x80000000 } }, 6888 }, 6889 { 6890 "ALU64_LSH_K: Shift < 32, low word", 6891 .u.insns_int = { 6892 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6893 BPF_ALU64_IMM(BPF_LSH, R0, 12), 6894 BPF_EXIT_INSN(), 6895 }, 6896 INTERNAL, 6897 { }, 6898 { { 0, 0xbcdef000 } } 6899 }, 6900 { 6901 "ALU64_LSH_K: Shift < 32, high word", 6902 .u.insns_int = { 6903 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6904 BPF_ALU64_IMM(BPF_LSH, R0, 12), 6905 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6906 BPF_EXIT_INSN(), 6907 }, 6908 INTERNAL, 6909 { }, 6910 { { 0, 0x3456789a } } 6911 }, 6912 { 6913 "ALU64_LSH_K: Shift > 32, low word", 6914 .u.insns_int = { 6915 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6916 BPF_ALU64_IMM(BPF_LSH, R0, 36), 6917 BPF_EXIT_INSN(), 6918 }, 6919 INTERNAL, 6920 { }, 6921 { { 0, 0 } } 6922 }, 6923 { 6924 "ALU64_LSH_K: Shift > 32, high word", 6925 .u.insns_int = { 6926 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6927 BPF_ALU64_IMM(BPF_LSH, R0, 36), 6928 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6929 BPF_EXIT_INSN(), 6930 }, 6931 INTERNAL, 6932 { }, 6933 { { 0, 0x9abcdef0 } } 6934 }, 6935 { 6936 "ALU64_LSH_K: Shift == 32, low word", 6937 .u.insns_int = { 6938 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6939 BPF_ALU64_IMM(BPF_LSH, R0, 32), 6940 BPF_EXIT_INSN(), 6941 }, 6942 INTERNAL, 6943 { }, 6944 { { 0, 0 } } 6945 }, 6946 { 6947 "ALU64_LSH_K: Shift == 32, high word", 6948 .u.insns_int = { 6949 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6950 BPF_ALU64_IMM(BPF_LSH, R0, 32), 6951 BPF_ALU64_IMM(BPF_RSH, R0, 32), 6952 BPF_EXIT_INSN(), 6953 }, 6954 INTERNAL, 6955 { }, 6956 { { 0, 0x89abcdef } } 6957 }, 6958 { 6959 "ALU64_LSH_K: Zero shift", 6960 .u.insns_int = { 6961 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 6962 BPF_ALU64_IMM(BPF_LSH, R0, 0), 6963 BPF_EXIT_INSN(), 6964 }, 6965 INTERNAL, 6966 { }, 6967 { { 0, 0x89abcdef } } 6968 }, 6969 /* BPF_ALU | BPF_RSH | BPF_X */ 6970 { 6971 "ALU_RSH_X: 2 >> 1 = 1", 6972 .u.insns_int = { 6973 BPF_LD_IMM64(R0, 2), 6974 BPF_ALU32_IMM(BPF_MOV, R1, 1), 6975 BPF_ALU32_REG(BPF_RSH, R0, R1), 6976 BPF_EXIT_INSN(), 6977 }, 6978 INTERNAL, 6979 { }, 6980 { { 0, 1 } }, 6981 }, 6982 { 6983 "ALU_RSH_X: 0x80000000 >> 31 = 1", 6984 .u.insns_int = { 6985 BPF_LD_IMM64(R0, 0x80000000), 6986 BPF_ALU32_IMM(BPF_MOV, R1, 31), 6987 BPF_ALU32_REG(BPF_RSH, R0, R1), 6988 BPF_EXIT_INSN(), 6989 }, 6990 INTERNAL, 6991 { }, 6992 { { 0, 1 } }, 6993 }, 6994 { 6995 "ALU_RSH_X: 0x12345678 >> 20 = 0x123", 6996 .u.insns_int = { 6997 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 6998 BPF_ALU32_IMM(BPF_MOV, R1, 20), 6999 BPF_ALU32_REG(BPF_RSH, R0, R1), 7000 BPF_EXIT_INSN(), 7001 }, 7002 INTERNAL, 7003 { }, 7004 { { 0, 0x123 } } 7005 }, 7006 { 7007 "ALU64_RSH_X: 2 >> 1 = 1", 7008 .u.insns_int = { 7009 BPF_LD_IMM64(R0, 2), 7010 BPF_ALU32_IMM(BPF_MOV, R1, 1), 7011 BPF_ALU64_REG(BPF_RSH, R0, R1), 7012 BPF_EXIT_INSN(), 7013 }, 7014 INTERNAL, 7015 { }, 7016 { { 0, 1 } }, 7017 }, 7018 { 7019 "ALU64_RSH_X: 0x80000000 >> 31 = 1", 7020 .u.insns_int = { 7021 BPF_LD_IMM64(R0, 0x80000000), 7022 BPF_ALU32_IMM(BPF_MOV, R1, 31), 7023 BPF_ALU64_REG(BPF_RSH, R0, R1), 7024 BPF_EXIT_INSN(), 7025 }, 7026 INTERNAL, 7027 { }, 7028 { { 0, 1 } }, 7029 }, 7030 { 7031 "ALU64_RSH_X: Shift < 32, low word", 7032 .u.insns_int = { 7033 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7034 BPF_ALU32_IMM(BPF_MOV, R1, 12), 7035 BPF_ALU64_REG(BPF_RSH, R0, R1), 7036 BPF_EXIT_INSN(), 7037 }, 7038 INTERNAL, 7039 { }, 7040 { { 0, 0x56789abc } } 7041 }, 7042 { 7043 "ALU64_RSH_X: Shift < 32, high word", 7044 .u.insns_int = { 7045 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7046 BPF_ALU32_IMM(BPF_MOV, R1, 12), 7047 BPF_ALU64_REG(BPF_RSH, R0, R1), 7048 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7049 BPF_EXIT_INSN(), 7050 }, 7051 INTERNAL, 7052 { }, 7053 { { 0, 0x00081234 } } 7054 }, 7055 { 7056 "ALU64_RSH_X: Shift > 32, low word", 7057 .u.insns_int = { 7058 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7059 BPF_ALU32_IMM(BPF_MOV, R1, 36), 7060 BPF_ALU64_REG(BPF_RSH, R0, R1), 7061 BPF_EXIT_INSN(), 7062 }, 7063 INTERNAL, 7064 { }, 7065 { { 0, 0x08123456 } } 7066 }, 7067 { 7068 "ALU64_RSH_X: Shift > 32, high word", 7069 .u.insns_int = { 7070 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7071 BPF_ALU32_IMM(BPF_MOV, R1, 36), 7072 BPF_ALU64_REG(BPF_RSH, R0, R1), 7073 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7074 BPF_EXIT_INSN(), 7075 }, 7076 INTERNAL, 7077 { }, 7078 { { 0, 0 } } 7079 }, 7080 { 7081 "ALU64_RSH_X: Shift == 32, low word", 7082 .u.insns_int = { 7083 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7084 BPF_ALU32_IMM(BPF_MOV, R1, 32), 7085 BPF_ALU64_REG(BPF_RSH, R0, R1), 7086 BPF_EXIT_INSN(), 7087 }, 7088 INTERNAL, 7089 { }, 7090 { { 0, 0x81234567 } } 7091 }, 7092 { 7093 "ALU64_RSH_X: Shift == 32, high word", 7094 .u.insns_int = { 7095 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7096 BPF_ALU32_IMM(BPF_MOV, R1, 32), 7097 BPF_ALU64_REG(BPF_RSH, R0, R1), 7098 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7099 BPF_EXIT_INSN(), 7100 }, 7101 INTERNAL, 7102 { }, 7103 { { 0, 0 } } 7104 }, 7105 { 7106 "ALU64_RSH_X: Zero shift, low word", 7107 .u.insns_int = { 7108 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7109 BPF_ALU32_IMM(BPF_MOV, R1, 0), 7110 BPF_ALU64_REG(BPF_RSH, R0, R1), 7111 BPF_EXIT_INSN(), 7112 }, 7113 INTERNAL, 7114 { }, 7115 { { 0, 0x89abcdef } } 7116 }, 7117 { 7118 "ALU64_RSH_X: Zero shift, high word", 7119 .u.insns_int = { 7120 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7121 BPF_ALU32_IMM(BPF_MOV, R1, 0), 7122 BPF_ALU64_REG(BPF_RSH, R0, R1), 7123 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7124 BPF_EXIT_INSN(), 7125 }, 7126 INTERNAL, 7127 { }, 7128 { { 0, 0x81234567 } } 7129 }, 7130 /* BPF_ALU | BPF_RSH | BPF_K */ 7131 { 7132 "ALU_RSH_K: 2 >> 1 = 1", 7133 .u.insns_int = { 7134 BPF_LD_IMM64(R0, 2), 7135 BPF_ALU32_IMM(BPF_RSH, R0, 1), 7136 BPF_EXIT_INSN(), 7137 }, 7138 INTERNAL, 7139 { }, 7140 { { 0, 1 } }, 7141 }, 7142 { 7143 "ALU_RSH_K: 0x80000000 >> 31 = 1", 7144 .u.insns_int = { 7145 BPF_LD_IMM64(R0, 0x80000000), 7146 BPF_ALU32_IMM(BPF_RSH, R0, 31), 7147 BPF_EXIT_INSN(), 7148 }, 7149 INTERNAL, 7150 { }, 7151 { { 0, 1 } }, 7152 }, 7153 { 7154 "ALU_RSH_K: 0x12345678 >> 20 = 0x123", 7155 .u.insns_int = { 7156 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 7157 BPF_ALU32_IMM(BPF_RSH, R0, 20), 7158 BPF_EXIT_INSN(), 7159 }, 7160 INTERNAL, 7161 { }, 7162 { { 0, 0x123 } } 7163 }, 7164 { 7165 "ALU_RSH_K: 0x12345678 >> 0 = 0x12345678", 7166 .u.insns_int = { 7167 BPF_ALU32_IMM(BPF_MOV, R0, 0x12345678), 7168 BPF_ALU32_IMM(BPF_RSH, R0, 0), 7169 BPF_EXIT_INSN(), 7170 }, 7171 INTERNAL, 7172 { }, 7173 { { 0, 0x12345678 } } 7174 }, 7175 { 7176 "ALU64_RSH_K: 2 >> 1 = 1", 7177 .u.insns_int = { 7178 BPF_LD_IMM64(R0, 2), 7179 BPF_ALU64_IMM(BPF_RSH, R0, 1), 7180 BPF_EXIT_INSN(), 7181 }, 7182 INTERNAL, 7183 { }, 7184 { { 0, 1 } }, 7185 }, 7186 { 7187 "ALU64_RSH_K: 0x80000000 >> 31 = 1", 7188 .u.insns_int = { 7189 BPF_LD_IMM64(R0, 0x80000000), 7190 BPF_ALU64_IMM(BPF_RSH, R0, 31), 7191 BPF_EXIT_INSN(), 7192 }, 7193 INTERNAL, 7194 { }, 7195 { { 0, 1 } }, 7196 }, 7197 { 7198 "ALU64_RSH_K: Shift < 32, low word", 7199 .u.insns_int = { 7200 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7201 BPF_ALU64_IMM(BPF_RSH, R0, 12), 7202 BPF_EXIT_INSN(), 7203 }, 7204 INTERNAL, 7205 { }, 7206 { { 0, 0x56789abc } } 7207 }, 7208 { 7209 "ALU64_RSH_K: Shift < 32, high word", 7210 .u.insns_int = { 7211 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7212 BPF_ALU64_IMM(BPF_RSH, R0, 12), 7213 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7214 BPF_EXIT_INSN(), 7215 }, 7216 INTERNAL, 7217 { }, 7218 { { 0, 0x00081234 } } 7219 }, 7220 { 7221 "ALU64_RSH_K: Shift > 32, low word", 7222 .u.insns_int = { 7223 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7224 BPF_ALU64_IMM(BPF_RSH, R0, 36), 7225 BPF_EXIT_INSN(), 7226 }, 7227 INTERNAL, 7228 { }, 7229 { { 0, 0x08123456 } } 7230 }, 7231 { 7232 "ALU64_RSH_K: Shift > 32, high word", 7233 .u.insns_int = { 7234 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7235 BPF_ALU64_IMM(BPF_RSH, R0, 36), 7236 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7237 BPF_EXIT_INSN(), 7238 }, 7239 INTERNAL, 7240 { }, 7241 { { 0, 0 } } 7242 }, 7243 { 7244 "ALU64_RSH_K: Shift == 32, low word", 7245 .u.insns_int = { 7246 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7247 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7248 BPF_EXIT_INSN(), 7249 }, 7250 INTERNAL, 7251 { }, 7252 { { 0, 0x81234567 } } 7253 }, 7254 { 7255 "ALU64_RSH_K: Shift == 32, high word", 7256 .u.insns_int = { 7257 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7258 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7259 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7260 BPF_EXIT_INSN(), 7261 }, 7262 INTERNAL, 7263 { }, 7264 { { 0, 0 } } 7265 }, 7266 { 7267 "ALU64_RSH_K: Zero shift", 7268 .u.insns_int = { 7269 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7270 BPF_ALU64_IMM(BPF_RSH, R0, 0), 7271 BPF_EXIT_INSN(), 7272 }, 7273 INTERNAL, 7274 { }, 7275 { { 0, 0x89abcdef } } 7276 }, 7277 /* BPF_ALU | BPF_ARSH | BPF_X */ 7278 { 7279 "ALU32_ARSH_X: -1234 >> 7 = -10", 7280 .u.insns_int = { 7281 BPF_ALU32_IMM(BPF_MOV, R0, -1234), 7282 BPF_ALU32_IMM(BPF_MOV, R1, 7), 7283 BPF_ALU32_REG(BPF_ARSH, R0, R1), 7284 BPF_EXIT_INSN(), 7285 }, 7286 INTERNAL, 7287 { }, 7288 { { 0, -10 } } 7289 }, 7290 { 7291 "ALU64_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff", 7292 .u.insns_int = { 7293 BPF_LD_IMM64(R0, 0xff00ff0000000000LL), 7294 BPF_ALU32_IMM(BPF_MOV, R1, 40), 7295 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7296 BPF_EXIT_INSN(), 7297 }, 7298 INTERNAL, 7299 { }, 7300 { { 0, 0xffff00ff } }, 7301 }, 7302 { 7303 "ALU64_ARSH_X: Shift < 32, low word", 7304 .u.insns_int = { 7305 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7306 BPF_ALU32_IMM(BPF_MOV, R1, 12), 7307 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7308 BPF_EXIT_INSN(), 7309 }, 7310 INTERNAL, 7311 { }, 7312 { { 0, 0x56789abc } } 7313 }, 7314 { 7315 "ALU64_ARSH_X: Shift < 32, high word", 7316 .u.insns_int = { 7317 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7318 BPF_ALU32_IMM(BPF_MOV, R1, 12), 7319 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7320 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7321 BPF_EXIT_INSN(), 7322 }, 7323 INTERNAL, 7324 { }, 7325 { { 0, 0xfff81234 } } 7326 }, 7327 { 7328 "ALU64_ARSH_X: Shift > 32, low word", 7329 .u.insns_int = { 7330 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7331 BPF_ALU32_IMM(BPF_MOV, R1, 36), 7332 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7333 BPF_EXIT_INSN(), 7334 }, 7335 INTERNAL, 7336 { }, 7337 { { 0, 0xf8123456 } } 7338 }, 7339 { 7340 "ALU64_ARSH_X: Shift > 32, high word", 7341 .u.insns_int = { 7342 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7343 BPF_ALU32_IMM(BPF_MOV, R1, 36), 7344 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7345 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7346 BPF_EXIT_INSN(), 7347 }, 7348 INTERNAL, 7349 { }, 7350 { { 0, -1 } } 7351 }, 7352 { 7353 "ALU64_ARSH_X: Shift == 32, low word", 7354 .u.insns_int = { 7355 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7356 BPF_ALU32_IMM(BPF_MOV, R1, 32), 7357 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7358 BPF_EXIT_INSN(), 7359 }, 7360 INTERNAL, 7361 { }, 7362 { { 0, 0x81234567 } } 7363 }, 7364 { 7365 "ALU64_ARSH_X: Shift == 32, high word", 7366 .u.insns_int = { 7367 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7368 BPF_ALU32_IMM(BPF_MOV, R1, 32), 7369 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7370 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7371 BPF_EXIT_INSN(), 7372 }, 7373 INTERNAL, 7374 { }, 7375 { { 0, -1 } } 7376 }, 7377 { 7378 "ALU64_ARSH_X: Zero shift, low word", 7379 .u.insns_int = { 7380 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7381 BPF_ALU32_IMM(BPF_MOV, R1, 0), 7382 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7383 BPF_EXIT_INSN(), 7384 }, 7385 INTERNAL, 7386 { }, 7387 { { 0, 0x89abcdef } } 7388 }, 7389 { 7390 "ALU64_ARSH_X: Zero shift, high word", 7391 .u.insns_int = { 7392 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7393 BPF_ALU32_IMM(BPF_MOV, R1, 0), 7394 BPF_ALU64_REG(BPF_ARSH, R0, R1), 7395 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7396 BPF_EXIT_INSN(), 7397 }, 7398 INTERNAL, 7399 { }, 7400 { { 0, 0x81234567 } } 7401 }, 7402 /* BPF_ALU | BPF_ARSH | BPF_K */ 7403 { 7404 "ALU32_ARSH_K: -1234 >> 7 = -10", 7405 .u.insns_int = { 7406 BPF_ALU32_IMM(BPF_MOV, R0, -1234), 7407 BPF_ALU32_IMM(BPF_ARSH, R0, 7), 7408 BPF_EXIT_INSN(), 7409 }, 7410 INTERNAL, 7411 { }, 7412 { { 0, -10 } } 7413 }, 7414 { 7415 "ALU32_ARSH_K: -1234 >> 0 = -1234", 7416 .u.insns_int = { 7417 BPF_ALU32_IMM(BPF_MOV, R0, -1234), 7418 BPF_ALU32_IMM(BPF_ARSH, R0, 0), 7419 BPF_EXIT_INSN(), 7420 }, 7421 INTERNAL, 7422 { }, 7423 { { 0, -1234 } } 7424 }, 7425 { 7426 "ALU64_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff", 7427 .u.insns_int = { 7428 BPF_LD_IMM64(R0, 0xff00ff0000000000LL), 7429 BPF_ALU64_IMM(BPF_ARSH, R0, 40), 7430 BPF_EXIT_INSN(), 7431 }, 7432 INTERNAL, 7433 { }, 7434 { { 0, 0xffff00ff } }, 7435 }, 7436 { 7437 "ALU64_ARSH_K: Shift < 32, low word", 7438 .u.insns_int = { 7439 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7440 BPF_ALU64_IMM(BPF_RSH, R0, 12), 7441 BPF_EXIT_INSN(), 7442 }, 7443 INTERNAL, 7444 { }, 7445 { { 0, 0x56789abc } } 7446 }, 7447 { 7448 "ALU64_ARSH_K: Shift < 32, high word", 7449 .u.insns_int = { 7450 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7451 BPF_ALU64_IMM(BPF_ARSH, R0, 12), 7452 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7453 BPF_EXIT_INSN(), 7454 }, 7455 INTERNAL, 7456 { }, 7457 { { 0, 0xfff81234 } } 7458 }, 7459 { 7460 "ALU64_ARSH_K: Shift > 32, low word", 7461 .u.insns_int = { 7462 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7463 BPF_ALU64_IMM(BPF_ARSH, R0, 36), 7464 BPF_EXIT_INSN(), 7465 }, 7466 INTERNAL, 7467 { }, 7468 { { 0, 0xf8123456 } } 7469 }, 7470 { 7471 "ALU64_ARSH_K: Shift > 32, high word", 7472 .u.insns_int = { 7473 BPF_LD_IMM64(R0, 0xf123456789abcdefLL), 7474 BPF_ALU64_IMM(BPF_ARSH, R0, 36), 7475 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7476 BPF_EXIT_INSN(), 7477 }, 7478 INTERNAL, 7479 { }, 7480 { { 0, -1 } } 7481 }, 7482 { 7483 "ALU64_ARSH_K: Shift == 32, low word", 7484 .u.insns_int = { 7485 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7486 BPF_ALU64_IMM(BPF_ARSH, R0, 32), 7487 BPF_EXIT_INSN(), 7488 }, 7489 INTERNAL, 7490 { }, 7491 { { 0, 0x81234567 } } 7492 }, 7493 { 7494 "ALU64_ARSH_K: Shift == 32, high word", 7495 .u.insns_int = { 7496 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7497 BPF_ALU64_IMM(BPF_ARSH, R0, 32), 7498 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7499 BPF_EXIT_INSN(), 7500 }, 7501 INTERNAL, 7502 { }, 7503 { { 0, -1 } } 7504 }, 7505 { 7506 "ALU64_ARSH_K: Zero shift", 7507 .u.insns_int = { 7508 BPF_LD_IMM64(R0, 0x8123456789abcdefLL), 7509 BPF_ALU64_IMM(BPF_ARSH, R0, 0), 7510 BPF_EXIT_INSN(), 7511 }, 7512 INTERNAL, 7513 { }, 7514 { { 0, 0x89abcdef } } 7515 }, 7516 /* BPF_ALU | BPF_NEG */ 7517 { 7518 "ALU_NEG: -(3) = -3", 7519 .u.insns_int = { 7520 BPF_ALU32_IMM(BPF_MOV, R0, 3), 7521 BPF_ALU32_IMM(BPF_NEG, R0, 0), 7522 BPF_EXIT_INSN(), 7523 }, 7524 INTERNAL, 7525 { }, 7526 { { 0, -3 } }, 7527 }, 7528 { 7529 "ALU_NEG: -(-3) = 3", 7530 .u.insns_int = { 7531 BPF_ALU32_IMM(BPF_MOV, R0, -3), 7532 BPF_ALU32_IMM(BPF_NEG, R0, 0), 7533 BPF_EXIT_INSN(), 7534 }, 7535 INTERNAL, 7536 { }, 7537 { { 0, 3 } }, 7538 }, 7539 { 7540 "ALU64_NEG: -(3) = -3", 7541 .u.insns_int = { 7542 BPF_LD_IMM64(R0, 3), 7543 BPF_ALU64_IMM(BPF_NEG, R0, 0), 7544 BPF_EXIT_INSN(), 7545 }, 7546 INTERNAL, 7547 { }, 7548 { { 0, -3 } }, 7549 }, 7550 { 7551 "ALU64_NEG: -(-3) = 3", 7552 .u.insns_int = { 7553 BPF_LD_IMM64(R0, -3), 7554 BPF_ALU64_IMM(BPF_NEG, R0, 0), 7555 BPF_EXIT_INSN(), 7556 }, 7557 INTERNAL, 7558 { }, 7559 { { 0, 3 } }, 7560 }, 7561 /* BPF_ALU | BPF_END | BPF_FROM_BE */ 7562 { 7563 "ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef", 7564 .u.insns_int = { 7565 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7566 BPF_ENDIAN(BPF_FROM_BE, R0, 16), 7567 BPF_EXIT_INSN(), 7568 }, 7569 INTERNAL, 7570 { }, 7571 { { 0, cpu_to_be16(0xcdef) } }, 7572 }, 7573 { 7574 "ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef", 7575 .u.insns_int = { 7576 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7577 BPF_ENDIAN(BPF_FROM_BE, R0, 32), 7578 BPF_ALU64_REG(BPF_MOV, R1, R0), 7579 BPF_ALU64_IMM(BPF_RSH, R1, 32), 7580 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */ 7581 BPF_EXIT_INSN(), 7582 }, 7583 INTERNAL, 7584 { }, 7585 { { 0, cpu_to_be32(0x89abcdef) } }, 7586 }, 7587 { 7588 "ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef", 7589 .u.insns_int = { 7590 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7591 BPF_ENDIAN(BPF_FROM_BE, R0, 64), 7592 BPF_EXIT_INSN(), 7593 }, 7594 INTERNAL, 7595 { }, 7596 { { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } }, 7597 }, 7598 { 7599 "ALU_END_FROM_BE 64: 0x0123456789abcdef >> 32 -> 0x01234567", 7600 .u.insns_int = { 7601 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7602 BPF_ENDIAN(BPF_FROM_BE, R0, 64), 7603 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7604 BPF_EXIT_INSN(), 7605 }, 7606 INTERNAL, 7607 { }, 7608 { { 0, (u32) (cpu_to_be64(0x0123456789abcdefLL) >> 32) } }, 7609 }, 7610 /* BPF_ALU | BPF_END | BPF_FROM_BE, reversed */ 7611 { 7612 "ALU_END_FROM_BE 16: 0xfedcba9876543210 -> 0x3210", 7613 .u.insns_int = { 7614 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7615 BPF_ENDIAN(BPF_FROM_BE, R0, 16), 7616 BPF_EXIT_INSN(), 7617 }, 7618 INTERNAL, 7619 { }, 7620 { { 0, cpu_to_be16(0x3210) } }, 7621 }, 7622 { 7623 "ALU_END_FROM_BE 32: 0xfedcba9876543210 -> 0x76543210", 7624 .u.insns_int = { 7625 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7626 BPF_ENDIAN(BPF_FROM_BE, R0, 32), 7627 BPF_ALU64_REG(BPF_MOV, R1, R0), 7628 BPF_ALU64_IMM(BPF_RSH, R1, 32), 7629 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */ 7630 BPF_EXIT_INSN(), 7631 }, 7632 INTERNAL, 7633 { }, 7634 { { 0, cpu_to_be32(0x76543210) } }, 7635 }, 7636 { 7637 "ALU_END_FROM_BE 64: 0xfedcba9876543210 -> 0x76543210", 7638 .u.insns_int = { 7639 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7640 BPF_ENDIAN(BPF_FROM_BE, R0, 64), 7641 BPF_EXIT_INSN(), 7642 }, 7643 INTERNAL, 7644 { }, 7645 { { 0, (u32) cpu_to_be64(0xfedcba9876543210ULL) } }, 7646 }, 7647 { 7648 "ALU_END_FROM_BE 64: 0xfedcba9876543210 >> 32 -> 0xfedcba98", 7649 .u.insns_int = { 7650 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7651 BPF_ENDIAN(BPF_FROM_BE, R0, 64), 7652 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7653 BPF_EXIT_INSN(), 7654 }, 7655 INTERNAL, 7656 { }, 7657 { { 0, (u32) (cpu_to_be64(0xfedcba9876543210ULL) >> 32) } }, 7658 }, 7659 /* BPF_ALU | BPF_END | BPF_FROM_LE */ 7660 { 7661 "ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd", 7662 .u.insns_int = { 7663 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7664 BPF_ENDIAN(BPF_FROM_LE, R0, 16), 7665 BPF_EXIT_INSN(), 7666 }, 7667 INTERNAL, 7668 { }, 7669 { { 0, cpu_to_le16(0xcdef) } }, 7670 }, 7671 { 7672 "ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89", 7673 .u.insns_int = { 7674 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7675 BPF_ENDIAN(BPF_FROM_LE, R0, 32), 7676 BPF_ALU64_REG(BPF_MOV, R1, R0), 7677 BPF_ALU64_IMM(BPF_RSH, R1, 32), 7678 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */ 7679 BPF_EXIT_INSN(), 7680 }, 7681 INTERNAL, 7682 { }, 7683 { { 0, cpu_to_le32(0x89abcdef) } }, 7684 }, 7685 { 7686 "ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301", 7687 .u.insns_int = { 7688 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7689 BPF_ENDIAN(BPF_FROM_LE, R0, 64), 7690 BPF_EXIT_INSN(), 7691 }, 7692 INTERNAL, 7693 { }, 7694 { { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } }, 7695 }, 7696 { 7697 "ALU_END_FROM_LE 64: 0x0123456789abcdef >> 32 -> 0xefcdab89", 7698 .u.insns_int = { 7699 BPF_LD_IMM64(R0, 0x0123456789abcdefLL), 7700 BPF_ENDIAN(BPF_FROM_LE, R0, 64), 7701 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7702 BPF_EXIT_INSN(), 7703 }, 7704 INTERNAL, 7705 { }, 7706 { { 0, (u32) (cpu_to_le64(0x0123456789abcdefLL) >> 32) } }, 7707 }, 7708 /* BPF_ALU | BPF_END | BPF_FROM_LE, reversed */ 7709 { 7710 "ALU_END_FROM_LE 16: 0xfedcba9876543210 -> 0x1032", 7711 .u.insns_int = { 7712 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7713 BPF_ENDIAN(BPF_FROM_LE, R0, 16), 7714 BPF_EXIT_INSN(), 7715 }, 7716 INTERNAL, 7717 { }, 7718 { { 0, cpu_to_le16(0x3210) } }, 7719 }, 7720 { 7721 "ALU_END_FROM_LE 32: 0xfedcba9876543210 -> 0x10325476", 7722 .u.insns_int = { 7723 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7724 BPF_ENDIAN(BPF_FROM_LE, R0, 32), 7725 BPF_ALU64_REG(BPF_MOV, R1, R0), 7726 BPF_ALU64_IMM(BPF_RSH, R1, 32), 7727 BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */ 7728 BPF_EXIT_INSN(), 7729 }, 7730 INTERNAL, 7731 { }, 7732 { { 0, cpu_to_le32(0x76543210) } }, 7733 }, 7734 { 7735 "ALU_END_FROM_LE 64: 0xfedcba9876543210 -> 0x10325476", 7736 .u.insns_int = { 7737 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7738 BPF_ENDIAN(BPF_FROM_LE, R0, 64), 7739 BPF_EXIT_INSN(), 7740 }, 7741 INTERNAL, 7742 { }, 7743 { { 0, (u32) cpu_to_le64(0xfedcba9876543210ULL) } }, 7744 }, 7745 { 7746 "ALU_END_FROM_LE 64: 0xfedcba9876543210 >> 32 -> 0x98badcfe", 7747 .u.insns_int = { 7748 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 7749 BPF_ENDIAN(BPF_FROM_LE, R0, 64), 7750 BPF_ALU64_IMM(BPF_RSH, R0, 32), 7751 BPF_EXIT_INSN(), 7752 }, 7753 INTERNAL, 7754 { }, 7755 { { 0, (u32) (cpu_to_le64(0xfedcba9876543210ULL) >> 32) } }, 7756 }, 7757 /* BPF_LDX_MEM B/H/W/DW */ 7758 { 7759 "BPF_LDX_MEM | BPF_B", 7760 .u.insns_int = { 7761 BPF_LD_IMM64(R1, 0x0102030405060708ULL), 7762 BPF_LD_IMM64(R2, 0x0000000000000008ULL), 7763 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7764 #ifdef __BIG_ENDIAN 7765 BPF_LDX_MEM(BPF_B, R0, R10, -1), 7766 #else 7767 BPF_LDX_MEM(BPF_B, R0, R10, -8), 7768 #endif 7769 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7770 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7771 BPF_EXIT_INSN(), 7772 }, 7773 INTERNAL, 7774 { }, 7775 { { 0, 0 } }, 7776 .stack_depth = 8, 7777 }, 7778 { 7779 "BPF_LDX_MEM | BPF_B, MSB set", 7780 .u.insns_int = { 7781 BPF_LD_IMM64(R1, 0x8182838485868788ULL), 7782 BPF_LD_IMM64(R2, 0x0000000000000088ULL), 7783 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7784 #ifdef __BIG_ENDIAN 7785 BPF_LDX_MEM(BPF_B, R0, R10, -1), 7786 #else 7787 BPF_LDX_MEM(BPF_B, R0, R10, -8), 7788 #endif 7789 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7790 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7791 BPF_EXIT_INSN(), 7792 }, 7793 INTERNAL, 7794 { }, 7795 { { 0, 0 } }, 7796 .stack_depth = 8, 7797 }, 7798 { 7799 "BPF_LDX_MEM | BPF_H", 7800 .u.insns_int = { 7801 BPF_LD_IMM64(R1, 0x0102030405060708ULL), 7802 BPF_LD_IMM64(R2, 0x0000000000000708ULL), 7803 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7804 #ifdef __BIG_ENDIAN 7805 BPF_LDX_MEM(BPF_H, R0, R10, -2), 7806 #else 7807 BPF_LDX_MEM(BPF_H, R0, R10, -8), 7808 #endif 7809 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7810 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7811 BPF_EXIT_INSN(), 7812 }, 7813 INTERNAL, 7814 { }, 7815 { { 0, 0 } }, 7816 .stack_depth = 8, 7817 }, 7818 { 7819 "BPF_LDX_MEM | BPF_H, MSB set", 7820 .u.insns_int = { 7821 BPF_LD_IMM64(R1, 0x8182838485868788ULL), 7822 BPF_LD_IMM64(R2, 0x0000000000008788ULL), 7823 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7824 #ifdef __BIG_ENDIAN 7825 BPF_LDX_MEM(BPF_H, R0, R10, -2), 7826 #else 7827 BPF_LDX_MEM(BPF_H, R0, R10, -8), 7828 #endif 7829 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7830 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7831 BPF_EXIT_INSN(), 7832 }, 7833 INTERNAL, 7834 { }, 7835 { { 0, 0 } }, 7836 .stack_depth = 8, 7837 }, 7838 { 7839 "BPF_LDX_MEM | BPF_W", 7840 .u.insns_int = { 7841 BPF_LD_IMM64(R1, 0x0102030405060708ULL), 7842 BPF_LD_IMM64(R2, 0x0000000005060708ULL), 7843 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7844 #ifdef __BIG_ENDIAN 7845 BPF_LDX_MEM(BPF_W, R0, R10, -4), 7846 #else 7847 BPF_LDX_MEM(BPF_W, R0, R10, -8), 7848 #endif 7849 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7850 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7851 BPF_EXIT_INSN(), 7852 }, 7853 INTERNAL, 7854 { }, 7855 { { 0, 0 } }, 7856 .stack_depth = 8, 7857 }, 7858 { 7859 "BPF_LDX_MEM | BPF_W, MSB set", 7860 .u.insns_int = { 7861 BPF_LD_IMM64(R1, 0x8182838485868788ULL), 7862 BPF_LD_IMM64(R2, 0x0000000085868788ULL), 7863 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7864 #ifdef __BIG_ENDIAN 7865 BPF_LDX_MEM(BPF_W, R0, R10, -4), 7866 #else 7867 BPF_LDX_MEM(BPF_W, R0, R10, -8), 7868 #endif 7869 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 7870 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7871 BPF_EXIT_INSN(), 7872 }, 7873 INTERNAL, 7874 { }, 7875 { { 0, 0 } }, 7876 .stack_depth = 8, 7877 }, 7878 /* BPF_STX_MEM B/H/W/DW */ 7879 { 7880 "BPF_STX_MEM | BPF_B", 7881 .u.insns_int = { 7882 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7883 BPF_LD_IMM64(R2, 0x0102030405060708ULL), 7884 BPF_LD_IMM64(R3, 0x8090a0b0c0d0e008ULL), 7885 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7886 #ifdef __BIG_ENDIAN 7887 BPF_STX_MEM(BPF_B, R10, R2, -1), 7888 #else 7889 BPF_STX_MEM(BPF_B, R10, R2, -8), 7890 #endif 7891 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 7892 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 7893 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7894 BPF_EXIT_INSN(), 7895 }, 7896 INTERNAL, 7897 { }, 7898 { { 0, 0 } }, 7899 .stack_depth = 8, 7900 }, 7901 { 7902 "BPF_STX_MEM | BPF_B, MSB set", 7903 .u.insns_int = { 7904 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7905 BPF_LD_IMM64(R2, 0x8182838485868788ULL), 7906 BPF_LD_IMM64(R3, 0x8090a0b0c0d0e088ULL), 7907 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7908 #ifdef __BIG_ENDIAN 7909 BPF_STX_MEM(BPF_B, R10, R2, -1), 7910 #else 7911 BPF_STX_MEM(BPF_B, R10, R2, -8), 7912 #endif 7913 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 7914 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 7915 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7916 BPF_EXIT_INSN(), 7917 }, 7918 INTERNAL, 7919 { }, 7920 { { 0, 0 } }, 7921 .stack_depth = 8, 7922 }, 7923 { 7924 "BPF_STX_MEM | BPF_H", 7925 .u.insns_int = { 7926 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7927 BPF_LD_IMM64(R2, 0x0102030405060708ULL), 7928 BPF_LD_IMM64(R3, 0x8090a0b0c0d00708ULL), 7929 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7930 #ifdef __BIG_ENDIAN 7931 BPF_STX_MEM(BPF_H, R10, R2, -2), 7932 #else 7933 BPF_STX_MEM(BPF_H, R10, R2, -8), 7934 #endif 7935 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 7936 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 7937 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7938 BPF_EXIT_INSN(), 7939 }, 7940 INTERNAL, 7941 { }, 7942 { { 0, 0 } }, 7943 .stack_depth = 8, 7944 }, 7945 { 7946 "BPF_STX_MEM | BPF_H, MSB set", 7947 .u.insns_int = { 7948 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7949 BPF_LD_IMM64(R2, 0x8182838485868788ULL), 7950 BPF_LD_IMM64(R3, 0x8090a0b0c0d08788ULL), 7951 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7952 #ifdef __BIG_ENDIAN 7953 BPF_STX_MEM(BPF_H, R10, R2, -2), 7954 #else 7955 BPF_STX_MEM(BPF_H, R10, R2, -8), 7956 #endif 7957 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 7958 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 7959 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7960 BPF_EXIT_INSN(), 7961 }, 7962 INTERNAL, 7963 { }, 7964 { { 0, 0 } }, 7965 .stack_depth = 8, 7966 }, 7967 { 7968 "BPF_STX_MEM | BPF_W", 7969 .u.insns_int = { 7970 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7971 BPF_LD_IMM64(R2, 0x0102030405060708ULL), 7972 BPF_LD_IMM64(R3, 0x8090a0b005060708ULL), 7973 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7974 #ifdef __BIG_ENDIAN 7975 BPF_STX_MEM(BPF_W, R10, R2, -4), 7976 #else 7977 BPF_STX_MEM(BPF_W, R10, R2, -8), 7978 #endif 7979 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 7980 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 7981 BPF_ALU64_IMM(BPF_MOV, R0, 0), 7982 BPF_EXIT_INSN(), 7983 }, 7984 INTERNAL, 7985 { }, 7986 { { 0, 0 } }, 7987 .stack_depth = 8, 7988 }, 7989 { 7990 "BPF_STX_MEM | BPF_W, MSB set", 7991 .u.insns_int = { 7992 BPF_LD_IMM64(R1, 0x8090a0b0c0d0e0f0ULL), 7993 BPF_LD_IMM64(R2, 0x8182838485868788ULL), 7994 BPF_LD_IMM64(R3, 0x8090a0b085868788ULL), 7995 BPF_STX_MEM(BPF_DW, R10, R1, -8), 7996 #ifdef __BIG_ENDIAN 7997 BPF_STX_MEM(BPF_W, R10, R2, -4), 7998 #else 7999 BPF_STX_MEM(BPF_W, R10, R2, -8), 8000 #endif 8001 BPF_LDX_MEM(BPF_DW, R0, R10, -8), 8002 BPF_JMP_REG(BPF_JNE, R0, R3, 1), 8003 BPF_ALU64_IMM(BPF_MOV, R0, 0), 8004 BPF_EXIT_INSN(), 8005 }, 8006 INTERNAL, 8007 { }, 8008 { { 0, 0 } }, 8009 .stack_depth = 8, 8010 }, 8011 /* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */ 8012 { 8013 "ST_MEM_B: Store/Load byte: max negative", 8014 .u.insns_int = { 8015 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8016 BPF_ST_MEM(BPF_B, R10, -40, 0xff), 8017 BPF_LDX_MEM(BPF_B, R0, R10, -40), 8018 BPF_EXIT_INSN(), 8019 }, 8020 INTERNAL, 8021 { }, 8022 { { 0, 0xff } }, 8023 .stack_depth = 40, 8024 }, 8025 { 8026 "ST_MEM_B: Store/Load byte: max positive", 8027 .u.insns_int = { 8028 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8029 BPF_ST_MEM(BPF_H, R10, -40, 0x7f), 8030 BPF_LDX_MEM(BPF_H, R0, R10, -40), 8031 BPF_EXIT_INSN(), 8032 }, 8033 INTERNAL, 8034 { }, 8035 { { 0, 0x7f } }, 8036 .stack_depth = 40, 8037 }, 8038 { 8039 "STX_MEM_B: Store/Load byte: max negative", 8040 .u.insns_int = { 8041 BPF_LD_IMM64(R0, 0), 8042 BPF_LD_IMM64(R1, 0xffLL), 8043 BPF_STX_MEM(BPF_B, R10, R1, -40), 8044 BPF_LDX_MEM(BPF_B, R0, R10, -40), 8045 BPF_EXIT_INSN(), 8046 }, 8047 INTERNAL, 8048 { }, 8049 { { 0, 0xff } }, 8050 .stack_depth = 40, 8051 }, 8052 { 8053 "ST_MEM_H: Store/Load half word: max negative", 8054 .u.insns_int = { 8055 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8056 BPF_ST_MEM(BPF_H, R10, -40, 0xffff), 8057 BPF_LDX_MEM(BPF_H, R0, R10, -40), 8058 BPF_EXIT_INSN(), 8059 }, 8060 INTERNAL, 8061 { }, 8062 { { 0, 0xffff } }, 8063 .stack_depth = 40, 8064 }, 8065 { 8066 "ST_MEM_H: Store/Load half word: max positive", 8067 .u.insns_int = { 8068 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8069 BPF_ST_MEM(BPF_H, R10, -40, 0x7fff), 8070 BPF_LDX_MEM(BPF_H, R0, R10, -40), 8071 BPF_EXIT_INSN(), 8072 }, 8073 INTERNAL, 8074 { }, 8075 { { 0, 0x7fff } }, 8076 .stack_depth = 40, 8077 }, 8078 { 8079 "STX_MEM_H: Store/Load half word: max negative", 8080 .u.insns_int = { 8081 BPF_LD_IMM64(R0, 0), 8082 BPF_LD_IMM64(R1, 0xffffLL), 8083 BPF_STX_MEM(BPF_H, R10, R1, -40), 8084 BPF_LDX_MEM(BPF_H, R0, R10, -40), 8085 BPF_EXIT_INSN(), 8086 }, 8087 INTERNAL, 8088 { }, 8089 { { 0, 0xffff } }, 8090 .stack_depth = 40, 8091 }, 8092 { 8093 "ST_MEM_W: Store/Load word: max negative", 8094 .u.insns_int = { 8095 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8096 BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff), 8097 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8098 BPF_EXIT_INSN(), 8099 }, 8100 INTERNAL, 8101 { }, 8102 { { 0, 0xffffffff } }, 8103 .stack_depth = 40, 8104 }, 8105 { 8106 "ST_MEM_W: Store/Load word: max positive", 8107 .u.insns_int = { 8108 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8109 BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff), 8110 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8111 BPF_EXIT_INSN(), 8112 }, 8113 INTERNAL, 8114 { }, 8115 { { 0, 0x7fffffff } }, 8116 .stack_depth = 40, 8117 }, 8118 { 8119 "STX_MEM_W: Store/Load word: max negative", 8120 .u.insns_int = { 8121 BPF_LD_IMM64(R0, 0), 8122 BPF_LD_IMM64(R1, 0xffffffffLL), 8123 BPF_STX_MEM(BPF_W, R10, R1, -40), 8124 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8125 BPF_EXIT_INSN(), 8126 }, 8127 INTERNAL, 8128 { }, 8129 { { 0, 0xffffffff } }, 8130 .stack_depth = 40, 8131 }, 8132 { 8133 "ST_MEM_DW: Store/Load double word: max negative", 8134 .u.insns_int = { 8135 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8136 BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff), 8137 BPF_LDX_MEM(BPF_DW, R0, R10, -40), 8138 BPF_EXIT_INSN(), 8139 }, 8140 INTERNAL, 8141 { }, 8142 { { 0, 0xffffffff } }, 8143 .stack_depth = 40, 8144 }, 8145 { 8146 "ST_MEM_DW: Store/Load double word: max negative 2", 8147 .u.insns_int = { 8148 BPF_LD_IMM64(R2, 0xffff00000000ffffLL), 8149 BPF_LD_IMM64(R3, 0xffffffffffffffffLL), 8150 BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff), 8151 BPF_LDX_MEM(BPF_DW, R2, R10, -40), 8152 BPF_JMP_REG(BPF_JEQ, R2, R3, 2), 8153 BPF_MOV32_IMM(R0, 2), 8154 BPF_EXIT_INSN(), 8155 BPF_MOV32_IMM(R0, 1), 8156 BPF_EXIT_INSN(), 8157 }, 8158 INTERNAL, 8159 { }, 8160 { { 0, 0x1 } }, 8161 .stack_depth = 40, 8162 }, 8163 { 8164 "ST_MEM_DW: Store/Load double word: max positive", 8165 .u.insns_int = { 8166 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8167 BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff), 8168 BPF_LDX_MEM(BPF_DW, R0, R10, -40), 8169 BPF_EXIT_INSN(), 8170 }, 8171 INTERNAL, 8172 { }, 8173 { { 0, 0x7fffffff } }, 8174 .stack_depth = 40, 8175 }, 8176 { 8177 "STX_MEM_DW: Store/Load double word: max negative", 8178 .u.insns_int = { 8179 BPF_LD_IMM64(R0, 0), 8180 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 8181 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8182 BPF_LDX_MEM(BPF_DW, R0, R10, -40), 8183 BPF_EXIT_INSN(), 8184 }, 8185 INTERNAL, 8186 { }, 8187 { { 0, 0xffffffff } }, 8188 .stack_depth = 40, 8189 }, 8190 { 8191 "STX_MEM_DW: Store double word: first word in memory", 8192 .u.insns_int = { 8193 BPF_LD_IMM64(R0, 0), 8194 BPF_LD_IMM64(R1, 0x0123456789abcdefLL), 8195 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8196 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8197 BPF_EXIT_INSN(), 8198 }, 8199 INTERNAL, 8200 { }, 8201 #ifdef __BIG_ENDIAN 8202 { { 0, 0x01234567 } }, 8203 #else 8204 { { 0, 0x89abcdef } }, 8205 #endif 8206 .stack_depth = 40, 8207 }, 8208 { 8209 "STX_MEM_DW: Store double word: second word in memory", 8210 .u.insns_int = { 8211 BPF_LD_IMM64(R0, 0), 8212 BPF_LD_IMM64(R1, 0x0123456789abcdefLL), 8213 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8214 BPF_LDX_MEM(BPF_W, R0, R10, -36), 8215 BPF_EXIT_INSN(), 8216 }, 8217 INTERNAL, 8218 { }, 8219 #ifdef __BIG_ENDIAN 8220 { { 0, 0x89abcdef } }, 8221 #else 8222 { { 0, 0x01234567 } }, 8223 #endif 8224 .stack_depth = 40, 8225 }, 8226 /* BPF_STX | BPF_ATOMIC | BPF_W/DW */ 8227 { 8228 "STX_XADD_W: X + 1 + 1 + 1 + ...", 8229 { }, 8230 INTERNAL, 8231 { }, 8232 { { 0, 4134 } }, 8233 .fill_helper = bpf_fill_stxw, 8234 }, 8235 { 8236 "STX_XADD_DW: X + 1 + 1 + 1 + ...", 8237 { }, 8238 INTERNAL, 8239 { }, 8240 { { 0, 4134 } }, 8241 .fill_helper = bpf_fill_stxdw, 8242 }, 8243 /* 8244 * Exhaustive tests of atomic operation variants. 8245 * Individual tests are expanded from template macros for all 8246 * combinations of ALU operation, word size and fetching. 8247 */ 8248 #define BPF_ATOMIC_POISON(width) ((width) == BPF_W ? (0xbaadf00dULL << 32) : 0) 8249 8250 #define BPF_ATOMIC_OP_TEST1(width, op, logic, old, update, result) \ 8251 { \ 8252 "BPF_ATOMIC | " #width ", " #op ": Test: " \ 8253 #old " " #logic " " #update " = " #result, \ 8254 .u.insns_int = { \ 8255 BPF_LD_IMM64(R5, (update) | BPF_ATOMIC_POISON(width)), \ 8256 BPF_ST_MEM(width, R10, -40, old), \ 8257 BPF_ATOMIC_OP(width, op, R10, R5, -40), \ 8258 BPF_LDX_MEM(width, R0, R10, -40), \ 8259 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 8260 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 8261 BPF_ALU64_REG(BPF_OR, R0, R1), \ 8262 BPF_EXIT_INSN(), \ 8263 }, \ 8264 INTERNAL, \ 8265 { }, \ 8266 { { 0, result } }, \ 8267 .stack_depth = 40, \ 8268 } 8269 #define BPF_ATOMIC_OP_TEST2(width, op, logic, old, update, result) \ 8270 { \ 8271 "BPF_ATOMIC | " #width ", " #op ": Test side effects, r10: " \ 8272 #old " " #logic " " #update " = " #result, \ 8273 .u.insns_int = { \ 8274 BPF_ALU64_REG(BPF_MOV, R1, R10), \ 8275 BPF_LD_IMM64(R0, (update) | BPF_ATOMIC_POISON(width)), \ 8276 BPF_ST_MEM(BPF_W, R10, -40, old), \ 8277 BPF_ATOMIC_OP(width, op, R10, R0, -40), \ 8278 BPF_ALU64_REG(BPF_MOV, R0, R10), \ 8279 BPF_ALU64_REG(BPF_SUB, R0, R1), \ 8280 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 8281 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 8282 BPF_ALU64_REG(BPF_OR, R0, R1), \ 8283 BPF_EXIT_INSN(), \ 8284 }, \ 8285 INTERNAL, \ 8286 { }, \ 8287 { { 0, 0 } }, \ 8288 .stack_depth = 40, \ 8289 } 8290 #define BPF_ATOMIC_OP_TEST3(width, op, logic, old, update, result) \ 8291 { \ 8292 "BPF_ATOMIC | " #width ", " #op ": Test side effects, r0: " \ 8293 #old " " #logic " " #update " = " #result, \ 8294 .u.insns_int = { \ 8295 BPF_ALU64_REG(BPF_MOV, R0, R10), \ 8296 BPF_LD_IMM64(R1, (update) | BPF_ATOMIC_POISON(width)), \ 8297 BPF_ST_MEM(width, R10, -40, old), \ 8298 BPF_ATOMIC_OP(width, op, R10, R1, -40), \ 8299 BPF_ALU64_REG(BPF_SUB, R0, R10), \ 8300 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 8301 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 8302 BPF_ALU64_REG(BPF_OR, R0, R1), \ 8303 BPF_EXIT_INSN(), \ 8304 }, \ 8305 INTERNAL, \ 8306 { }, \ 8307 { { 0, 0 } }, \ 8308 .stack_depth = 40, \ 8309 } 8310 #define BPF_ATOMIC_OP_TEST4(width, op, logic, old, update, result) \ 8311 { \ 8312 "BPF_ATOMIC | " #width ", " #op ": Test fetch: " \ 8313 #old " " #logic " " #update " = " #result, \ 8314 .u.insns_int = { \ 8315 BPF_LD_IMM64(R3, (update) | BPF_ATOMIC_POISON(width)), \ 8316 BPF_ST_MEM(width, R10, -40, old), \ 8317 BPF_ATOMIC_OP(width, op, R10, R3, -40), \ 8318 BPF_ALU32_REG(BPF_MOV, R0, R3), \ 8319 BPF_EXIT_INSN(), \ 8320 }, \ 8321 INTERNAL, \ 8322 { }, \ 8323 { { 0, (op) & BPF_FETCH ? old : update } }, \ 8324 .stack_depth = 40, \ 8325 } 8326 /* BPF_ATOMIC | BPF_W: BPF_ADD */ 8327 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd), 8328 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd), 8329 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd), 8330 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD, +, 0x12, 0xab, 0xbd), 8331 /* BPF_ATOMIC | BPF_W: BPF_ADD | BPF_FETCH */ 8332 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8333 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8334 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8335 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8336 /* BPF_ATOMIC | BPF_DW: BPF_ADD */ 8337 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd), 8338 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd), 8339 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd), 8340 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD, +, 0x12, 0xab, 0xbd), 8341 /* BPF_ATOMIC | BPF_DW: BPF_ADD | BPF_FETCH */ 8342 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8343 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8344 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8345 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_ADD | BPF_FETCH, +, 0x12, 0xab, 0xbd), 8346 /* BPF_ATOMIC | BPF_W: BPF_AND */ 8347 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02), 8348 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02), 8349 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02), 8350 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND, &, 0x12, 0xab, 0x02), 8351 /* BPF_ATOMIC | BPF_W: BPF_AND | BPF_FETCH */ 8352 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8353 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8354 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8355 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8356 /* BPF_ATOMIC | BPF_DW: BPF_AND */ 8357 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02), 8358 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02), 8359 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02), 8360 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND, &, 0x12, 0xab, 0x02), 8361 /* BPF_ATOMIC | BPF_DW: BPF_AND | BPF_FETCH */ 8362 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8363 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8364 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8365 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_AND | BPF_FETCH, &, 0x12, 0xab, 0x02), 8366 /* BPF_ATOMIC | BPF_W: BPF_OR */ 8367 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb), 8368 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb), 8369 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb), 8370 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR, |, 0x12, 0xab, 0xbb), 8371 /* BPF_ATOMIC | BPF_W: BPF_OR | BPF_FETCH */ 8372 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8373 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8374 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8375 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8376 /* BPF_ATOMIC | BPF_DW: BPF_OR */ 8377 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb), 8378 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb), 8379 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb), 8380 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR, |, 0x12, 0xab, 0xbb), 8381 /* BPF_ATOMIC | BPF_DW: BPF_OR | BPF_FETCH */ 8382 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8383 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8384 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8385 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_OR | BPF_FETCH, |, 0x12, 0xab, 0xbb), 8386 /* BPF_ATOMIC | BPF_W: BPF_XOR */ 8387 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8388 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8389 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8390 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8391 /* BPF_ATOMIC | BPF_W: BPF_XOR | BPF_FETCH */ 8392 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8393 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8394 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8395 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8396 /* BPF_ATOMIC | BPF_DW: BPF_XOR */ 8397 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8398 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8399 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8400 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR, ^, 0x12, 0xab, 0xb9), 8401 /* BPF_ATOMIC | BPF_DW: BPF_XOR | BPF_FETCH */ 8402 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8403 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8404 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8405 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XOR | BPF_FETCH, ^, 0x12, 0xab, 0xb9), 8406 /* BPF_ATOMIC | BPF_W: BPF_XCHG */ 8407 BPF_ATOMIC_OP_TEST1(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8408 BPF_ATOMIC_OP_TEST2(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8409 BPF_ATOMIC_OP_TEST3(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8410 BPF_ATOMIC_OP_TEST4(BPF_W, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8411 /* BPF_ATOMIC | BPF_DW: BPF_XCHG */ 8412 BPF_ATOMIC_OP_TEST1(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8413 BPF_ATOMIC_OP_TEST2(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8414 BPF_ATOMIC_OP_TEST3(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8415 BPF_ATOMIC_OP_TEST4(BPF_DW, BPF_XCHG, xchg, 0x12, 0xab, 0xab), 8416 #undef BPF_ATOMIC_POISON 8417 #undef BPF_ATOMIC_OP_TEST1 8418 #undef BPF_ATOMIC_OP_TEST2 8419 #undef BPF_ATOMIC_OP_TEST3 8420 #undef BPF_ATOMIC_OP_TEST4 8421 /* BPF_ATOMIC | BPF_W, BPF_CMPXCHG */ 8422 { 8423 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful return", 8424 .u.insns_int = { 8425 BPF_ST_MEM(BPF_W, R10, -40, 0x01234567), 8426 BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567), 8427 BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef), 8428 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8429 BPF_EXIT_INSN(), 8430 }, 8431 INTERNAL, 8432 { }, 8433 { { 0, 0x01234567 } }, 8434 .stack_depth = 40, 8435 }, 8436 { 8437 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test successful store", 8438 .u.insns_int = { 8439 BPF_ST_MEM(BPF_W, R10, -40, 0x01234567), 8440 BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567), 8441 BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef), 8442 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8443 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8444 BPF_EXIT_INSN(), 8445 }, 8446 INTERNAL, 8447 { }, 8448 { { 0, 0x89abcdef } }, 8449 .stack_depth = 40, 8450 }, 8451 { 8452 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure return", 8453 .u.insns_int = { 8454 BPF_ST_MEM(BPF_W, R10, -40, 0x01234567), 8455 BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210), 8456 BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef), 8457 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8458 BPF_EXIT_INSN(), 8459 }, 8460 INTERNAL, 8461 { }, 8462 { { 0, 0x01234567 } }, 8463 .stack_depth = 40, 8464 }, 8465 { 8466 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test failure store", 8467 .u.insns_int = { 8468 BPF_ST_MEM(BPF_W, R10, -40, 0x01234567), 8469 BPF_ALU32_IMM(BPF_MOV, R0, 0x76543210), 8470 BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef), 8471 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8472 BPF_LDX_MEM(BPF_W, R0, R10, -40), 8473 BPF_EXIT_INSN(), 8474 }, 8475 INTERNAL, 8476 { }, 8477 { { 0, 0x01234567 } }, 8478 .stack_depth = 40, 8479 }, 8480 { 8481 "BPF_ATOMIC | BPF_W, BPF_CMPXCHG: Test side effects", 8482 .u.insns_int = { 8483 BPF_ST_MEM(BPF_W, R10, -40, 0x01234567), 8484 BPF_ALU32_IMM(BPF_MOV, R0, 0x01234567), 8485 BPF_ALU32_IMM(BPF_MOV, R3, 0x89abcdef), 8486 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8487 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R3, -40), 8488 BPF_ALU32_REG(BPF_MOV, R0, R3), 8489 BPF_EXIT_INSN(), 8490 }, 8491 INTERNAL, 8492 { }, 8493 { { 0, 0x89abcdef } }, 8494 .stack_depth = 40, 8495 }, 8496 /* BPF_ATOMIC | BPF_DW, BPF_CMPXCHG */ 8497 { 8498 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful return", 8499 .u.insns_int = { 8500 BPF_LD_IMM64(R1, 0x0123456789abcdefULL), 8501 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL), 8502 BPF_ALU64_REG(BPF_MOV, R0, R1), 8503 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8504 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40), 8505 BPF_JMP_REG(BPF_JNE, R0, R1, 1), 8506 BPF_ALU64_REG(BPF_SUB, R0, R1), 8507 BPF_EXIT_INSN(), 8508 }, 8509 INTERNAL, 8510 { }, 8511 { { 0, 0 } }, 8512 .stack_depth = 40, 8513 }, 8514 { 8515 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test successful store", 8516 .u.insns_int = { 8517 BPF_LD_IMM64(R1, 0x0123456789abcdefULL), 8518 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL), 8519 BPF_ALU64_REG(BPF_MOV, R0, R1), 8520 BPF_STX_MEM(BPF_DW, R10, R0, -40), 8521 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40), 8522 BPF_LDX_MEM(BPF_DW, R0, R10, -40), 8523 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 8524 BPF_ALU64_REG(BPF_SUB, R0, R2), 8525 BPF_EXIT_INSN(), 8526 }, 8527 INTERNAL, 8528 { }, 8529 { { 0, 0 } }, 8530 .stack_depth = 40, 8531 }, 8532 { 8533 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure return", 8534 .u.insns_int = { 8535 BPF_LD_IMM64(R1, 0x0123456789abcdefULL), 8536 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL), 8537 BPF_ALU64_REG(BPF_MOV, R0, R1), 8538 BPF_ALU64_IMM(BPF_ADD, R0, 1), 8539 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8540 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40), 8541 BPF_JMP_REG(BPF_JNE, R0, R1, 1), 8542 BPF_ALU64_REG(BPF_SUB, R0, R1), 8543 BPF_EXIT_INSN(), 8544 }, 8545 INTERNAL, 8546 { }, 8547 { { 0, 0 } }, 8548 .stack_depth = 40, 8549 }, 8550 { 8551 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test failure store", 8552 .u.insns_int = { 8553 BPF_LD_IMM64(R1, 0x0123456789abcdefULL), 8554 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL), 8555 BPF_ALU64_REG(BPF_MOV, R0, R1), 8556 BPF_ALU64_IMM(BPF_ADD, R0, 1), 8557 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8558 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40), 8559 BPF_LDX_MEM(BPF_DW, R0, R10, -40), 8560 BPF_JMP_REG(BPF_JNE, R0, R1, 1), 8561 BPF_ALU64_REG(BPF_SUB, R0, R1), 8562 BPF_EXIT_INSN(), 8563 }, 8564 INTERNAL, 8565 { }, 8566 { { 0, 0 } }, 8567 .stack_depth = 40, 8568 }, 8569 { 8570 "BPF_ATOMIC | BPF_DW, BPF_CMPXCHG: Test side effects", 8571 .u.insns_int = { 8572 BPF_LD_IMM64(R1, 0x0123456789abcdefULL), 8573 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL), 8574 BPF_ALU64_REG(BPF_MOV, R0, R1), 8575 BPF_STX_MEM(BPF_DW, R10, R1, -40), 8576 BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, R10, R2, -40), 8577 BPF_LD_IMM64(R0, 0xfedcba9876543210ULL), 8578 BPF_JMP_REG(BPF_JNE, R0, R2, 1), 8579 BPF_ALU64_REG(BPF_SUB, R0, R2), 8580 BPF_EXIT_INSN(), 8581 }, 8582 INTERNAL, 8583 { }, 8584 { { 0, 0 } }, 8585 .stack_depth = 40, 8586 }, 8587 /* BPF_JMP32 | BPF_JEQ | BPF_K */ 8588 { 8589 "JMP32_JEQ_K: Small immediate", 8590 .u.insns_int = { 8591 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8592 BPF_JMP32_IMM(BPF_JEQ, R0, 321, 1), 8593 BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1), 8594 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8595 BPF_EXIT_INSN(), 8596 }, 8597 INTERNAL, 8598 { }, 8599 { { 0, 123 } } 8600 }, 8601 { 8602 "JMP32_JEQ_K: Large immediate", 8603 .u.insns_int = { 8604 BPF_ALU32_IMM(BPF_MOV, R0, 12345678), 8605 BPF_JMP32_IMM(BPF_JEQ, R0, 12345678 & 0xffff, 1), 8606 BPF_JMP32_IMM(BPF_JEQ, R0, 12345678, 1), 8607 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8608 BPF_EXIT_INSN(), 8609 }, 8610 INTERNAL, 8611 { }, 8612 { { 0, 12345678 } } 8613 }, 8614 { 8615 "JMP32_JEQ_K: negative immediate", 8616 .u.insns_int = { 8617 BPF_ALU32_IMM(BPF_MOV, R0, -123), 8618 BPF_JMP32_IMM(BPF_JEQ, R0, 123, 1), 8619 BPF_JMP32_IMM(BPF_JEQ, R0, -123, 1), 8620 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8621 BPF_EXIT_INSN(), 8622 }, 8623 INTERNAL, 8624 { }, 8625 { { 0, -123 } } 8626 }, 8627 /* BPF_JMP32 | BPF_JEQ | BPF_X */ 8628 { 8629 "JMP32_JEQ_X", 8630 .u.insns_int = { 8631 BPF_ALU32_IMM(BPF_MOV, R0, 1234), 8632 BPF_ALU32_IMM(BPF_MOV, R1, 4321), 8633 BPF_JMP32_REG(BPF_JEQ, R0, R1, 2), 8634 BPF_ALU32_IMM(BPF_MOV, R1, 1234), 8635 BPF_JMP32_REG(BPF_JEQ, R0, R1, 1), 8636 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8637 BPF_EXIT_INSN(), 8638 }, 8639 INTERNAL, 8640 { }, 8641 { { 0, 1234 } } 8642 }, 8643 /* BPF_JMP32 | BPF_JNE | BPF_K */ 8644 { 8645 "JMP32_JNE_K: Small immediate", 8646 .u.insns_int = { 8647 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8648 BPF_JMP32_IMM(BPF_JNE, R0, 123, 1), 8649 BPF_JMP32_IMM(BPF_JNE, R0, 321, 1), 8650 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8651 BPF_EXIT_INSN(), 8652 }, 8653 INTERNAL, 8654 { }, 8655 { { 0, 123 } } 8656 }, 8657 { 8658 "JMP32_JNE_K: Large immediate", 8659 .u.insns_int = { 8660 BPF_ALU32_IMM(BPF_MOV, R0, 12345678), 8661 BPF_JMP32_IMM(BPF_JNE, R0, 12345678, 1), 8662 BPF_JMP32_IMM(BPF_JNE, R0, 12345678 & 0xffff, 1), 8663 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8664 BPF_EXIT_INSN(), 8665 }, 8666 INTERNAL, 8667 { }, 8668 { { 0, 12345678 } } 8669 }, 8670 { 8671 "JMP32_JNE_K: negative immediate", 8672 .u.insns_int = { 8673 BPF_ALU32_IMM(BPF_MOV, R0, -123), 8674 BPF_JMP32_IMM(BPF_JNE, R0, -123, 1), 8675 BPF_JMP32_IMM(BPF_JNE, R0, 123, 1), 8676 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8677 BPF_EXIT_INSN(), 8678 }, 8679 INTERNAL, 8680 { }, 8681 { { 0, -123 } } 8682 }, 8683 /* BPF_JMP32 | BPF_JNE | BPF_X */ 8684 { 8685 "JMP32_JNE_X", 8686 .u.insns_int = { 8687 BPF_ALU32_IMM(BPF_MOV, R0, 1234), 8688 BPF_ALU32_IMM(BPF_MOV, R1, 1234), 8689 BPF_JMP32_REG(BPF_JNE, R0, R1, 2), 8690 BPF_ALU32_IMM(BPF_MOV, R1, 4321), 8691 BPF_JMP32_REG(BPF_JNE, R0, R1, 1), 8692 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8693 BPF_EXIT_INSN(), 8694 }, 8695 INTERNAL, 8696 { }, 8697 { { 0, 1234 } } 8698 }, 8699 /* BPF_JMP32 | BPF_JSET | BPF_K */ 8700 { 8701 "JMP32_JSET_K: Small immediate", 8702 .u.insns_int = { 8703 BPF_ALU32_IMM(BPF_MOV, R0, 1), 8704 BPF_JMP32_IMM(BPF_JSET, R0, 2, 1), 8705 BPF_JMP32_IMM(BPF_JSET, R0, 3, 1), 8706 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8707 BPF_EXIT_INSN(), 8708 }, 8709 INTERNAL, 8710 { }, 8711 { { 0, 1 } } 8712 }, 8713 { 8714 "JMP32_JSET_K: Large immediate", 8715 .u.insns_int = { 8716 BPF_ALU32_IMM(BPF_MOV, R0, 0x40000000), 8717 BPF_JMP32_IMM(BPF_JSET, R0, 0x3fffffff, 1), 8718 BPF_JMP32_IMM(BPF_JSET, R0, 0x60000000, 1), 8719 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8720 BPF_EXIT_INSN(), 8721 }, 8722 INTERNAL, 8723 { }, 8724 { { 0, 0x40000000 } } 8725 }, 8726 { 8727 "JMP32_JSET_K: negative immediate", 8728 .u.insns_int = { 8729 BPF_ALU32_IMM(BPF_MOV, R0, -123), 8730 BPF_JMP32_IMM(BPF_JSET, R0, -1, 1), 8731 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8732 BPF_EXIT_INSN(), 8733 }, 8734 INTERNAL, 8735 { }, 8736 { { 0, -123 } } 8737 }, 8738 /* BPF_JMP32 | BPF_JSET | BPF_X */ 8739 { 8740 "JMP32_JSET_X", 8741 .u.insns_int = { 8742 BPF_ALU32_IMM(BPF_MOV, R0, 8), 8743 BPF_ALU32_IMM(BPF_MOV, R1, 7), 8744 BPF_JMP32_REG(BPF_JSET, R0, R1, 2), 8745 BPF_ALU32_IMM(BPF_MOV, R1, 8 | 2), 8746 BPF_JMP32_REG(BPF_JNE, R0, R1, 1), 8747 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8748 BPF_EXIT_INSN(), 8749 }, 8750 INTERNAL, 8751 { }, 8752 { { 0, 8 } } 8753 }, 8754 /* BPF_JMP32 | BPF_JGT | BPF_K */ 8755 { 8756 "JMP32_JGT_K: Small immediate", 8757 .u.insns_int = { 8758 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8759 BPF_JMP32_IMM(BPF_JGT, R0, 123, 1), 8760 BPF_JMP32_IMM(BPF_JGT, R0, 122, 1), 8761 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8762 BPF_EXIT_INSN(), 8763 }, 8764 INTERNAL, 8765 { }, 8766 { { 0, 123 } } 8767 }, 8768 { 8769 "JMP32_JGT_K: Large immediate", 8770 .u.insns_int = { 8771 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8772 BPF_JMP32_IMM(BPF_JGT, R0, 0xffffffff, 1), 8773 BPF_JMP32_IMM(BPF_JGT, R0, 0xfffffffd, 1), 8774 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8775 BPF_EXIT_INSN(), 8776 }, 8777 INTERNAL, 8778 { }, 8779 { { 0, 0xfffffffe } } 8780 }, 8781 /* BPF_JMP32 | BPF_JGT | BPF_X */ 8782 { 8783 "JMP32_JGT_X", 8784 .u.insns_int = { 8785 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8786 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 8787 BPF_JMP32_REG(BPF_JGT, R0, R1, 2), 8788 BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd), 8789 BPF_JMP32_REG(BPF_JGT, R0, R1, 1), 8790 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8791 BPF_EXIT_INSN(), 8792 }, 8793 INTERNAL, 8794 { }, 8795 { { 0, 0xfffffffe } } 8796 }, 8797 /* BPF_JMP32 | BPF_JGE | BPF_K */ 8798 { 8799 "JMP32_JGE_K: Small immediate", 8800 .u.insns_int = { 8801 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8802 BPF_JMP32_IMM(BPF_JGE, R0, 124, 1), 8803 BPF_JMP32_IMM(BPF_JGE, R0, 123, 1), 8804 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8805 BPF_EXIT_INSN(), 8806 }, 8807 INTERNAL, 8808 { }, 8809 { { 0, 123 } } 8810 }, 8811 { 8812 "JMP32_JGE_K: Large immediate", 8813 .u.insns_int = { 8814 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8815 BPF_JMP32_IMM(BPF_JGE, R0, 0xffffffff, 1), 8816 BPF_JMP32_IMM(BPF_JGE, R0, 0xfffffffe, 1), 8817 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8818 BPF_EXIT_INSN(), 8819 }, 8820 INTERNAL, 8821 { }, 8822 { { 0, 0xfffffffe } } 8823 }, 8824 /* BPF_JMP32 | BPF_JGE | BPF_X */ 8825 { 8826 "JMP32_JGE_X", 8827 .u.insns_int = { 8828 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8829 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 8830 BPF_JMP32_REG(BPF_JGE, R0, R1, 2), 8831 BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe), 8832 BPF_JMP32_REG(BPF_JGE, R0, R1, 1), 8833 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8834 BPF_EXIT_INSN(), 8835 }, 8836 INTERNAL, 8837 { }, 8838 { { 0, 0xfffffffe } } 8839 }, 8840 /* BPF_JMP32 | BPF_JLT | BPF_K */ 8841 { 8842 "JMP32_JLT_K: Small immediate", 8843 .u.insns_int = { 8844 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8845 BPF_JMP32_IMM(BPF_JLT, R0, 123, 1), 8846 BPF_JMP32_IMM(BPF_JLT, R0, 124, 1), 8847 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8848 BPF_EXIT_INSN(), 8849 }, 8850 INTERNAL, 8851 { }, 8852 { { 0, 123 } } 8853 }, 8854 { 8855 "JMP32_JLT_K: Large immediate", 8856 .u.insns_int = { 8857 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8858 BPF_JMP32_IMM(BPF_JLT, R0, 0xfffffffd, 1), 8859 BPF_JMP32_IMM(BPF_JLT, R0, 0xffffffff, 1), 8860 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8861 BPF_EXIT_INSN(), 8862 }, 8863 INTERNAL, 8864 { }, 8865 { { 0, 0xfffffffe } } 8866 }, 8867 /* BPF_JMP32 | BPF_JLT | BPF_X */ 8868 { 8869 "JMP32_JLT_X", 8870 .u.insns_int = { 8871 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8872 BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd), 8873 BPF_JMP32_REG(BPF_JLT, R0, R1, 2), 8874 BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff), 8875 BPF_JMP32_REG(BPF_JLT, R0, R1, 1), 8876 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8877 BPF_EXIT_INSN(), 8878 }, 8879 INTERNAL, 8880 { }, 8881 { { 0, 0xfffffffe } } 8882 }, 8883 /* BPF_JMP32 | BPF_JLE | BPF_K */ 8884 { 8885 "JMP32_JLE_K: Small immediate", 8886 .u.insns_int = { 8887 BPF_ALU32_IMM(BPF_MOV, R0, 123), 8888 BPF_JMP32_IMM(BPF_JLE, R0, 122, 1), 8889 BPF_JMP32_IMM(BPF_JLE, R0, 123, 1), 8890 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8891 BPF_EXIT_INSN(), 8892 }, 8893 INTERNAL, 8894 { }, 8895 { { 0, 123 } } 8896 }, 8897 { 8898 "JMP32_JLE_K: Large immediate", 8899 .u.insns_int = { 8900 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8901 BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffd, 1), 8902 BPF_JMP32_IMM(BPF_JLE, R0, 0xfffffffe, 1), 8903 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8904 BPF_EXIT_INSN(), 8905 }, 8906 INTERNAL, 8907 { }, 8908 { { 0, 0xfffffffe } } 8909 }, 8910 /* BPF_JMP32 | BPF_JLE | BPF_X */ 8911 { 8912 "JMP32_JLE_X", 8913 .u.insns_int = { 8914 BPF_ALU32_IMM(BPF_MOV, R0, 0xfffffffe), 8915 BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffd), 8916 BPF_JMP32_REG(BPF_JLE, R0, R1, 2), 8917 BPF_ALU32_IMM(BPF_MOV, R1, 0xfffffffe), 8918 BPF_JMP32_REG(BPF_JLE, R0, R1, 1), 8919 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8920 BPF_EXIT_INSN(), 8921 }, 8922 INTERNAL, 8923 { }, 8924 { { 0, 0xfffffffe } } 8925 }, 8926 /* BPF_JMP32 | BPF_JSGT | BPF_K */ 8927 { 8928 "JMP32_JSGT_K: Small immediate", 8929 .u.insns_int = { 8930 BPF_ALU32_IMM(BPF_MOV, R0, -123), 8931 BPF_JMP32_IMM(BPF_JSGT, R0, -123, 1), 8932 BPF_JMP32_IMM(BPF_JSGT, R0, -124, 1), 8933 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8934 BPF_EXIT_INSN(), 8935 }, 8936 INTERNAL, 8937 { }, 8938 { { 0, -123 } } 8939 }, 8940 { 8941 "JMP32_JSGT_K: Large immediate", 8942 .u.insns_int = { 8943 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 8944 BPF_JMP32_IMM(BPF_JSGT, R0, -12345678, 1), 8945 BPF_JMP32_IMM(BPF_JSGT, R0, -12345679, 1), 8946 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8947 BPF_EXIT_INSN(), 8948 }, 8949 INTERNAL, 8950 { }, 8951 { { 0, -12345678 } } 8952 }, 8953 /* BPF_JMP32 | BPF_JSGT | BPF_X */ 8954 { 8955 "JMP32_JSGT_X", 8956 .u.insns_int = { 8957 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 8958 BPF_ALU32_IMM(BPF_MOV, R1, -12345678), 8959 BPF_JMP32_REG(BPF_JSGT, R0, R1, 2), 8960 BPF_ALU32_IMM(BPF_MOV, R1, -12345679), 8961 BPF_JMP32_REG(BPF_JSGT, R0, R1, 1), 8962 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8963 BPF_EXIT_INSN(), 8964 }, 8965 INTERNAL, 8966 { }, 8967 { { 0, -12345678 } } 8968 }, 8969 /* BPF_JMP32 | BPF_JSGE | BPF_K */ 8970 { 8971 "JMP32_JSGE_K: Small immediate", 8972 .u.insns_int = { 8973 BPF_ALU32_IMM(BPF_MOV, R0, -123), 8974 BPF_JMP32_IMM(BPF_JSGE, R0, -122, 1), 8975 BPF_JMP32_IMM(BPF_JSGE, R0, -123, 1), 8976 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8977 BPF_EXIT_INSN(), 8978 }, 8979 INTERNAL, 8980 { }, 8981 { { 0, -123 } } 8982 }, 8983 { 8984 "JMP32_JSGE_K: Large immediate", 8985 .u.insns_int = { 8986 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 8987 BPF_JMP32_IMM(BPF_JSGE, R0, -12345677, 1), 8988 BPF_JMP32_IMM(BPF_JSGE, R0, -12345678, 1), 8989 BPF_ALU32_IMM(BPF_MOV, R0, 0), 8990 BPF_EXIT_INSN(), 8991 }, 8992 INTERNAL, 8993 { }, 8994 { { 0, -12345678 } } 8995 }, 8996 /* BPF_JMP32 | BPF_JSGE | BPF_X */ 8997 { 8998 "JMP32_JSGE_X", 8999 .u.insns_int = { 9000 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 9001 BPF_ALU32_IMM(BPF_MOV, R1, -12345677), 9002 BPF_JMP32_REG(BPF_JSGE, R0, R1, 2), 9003 BPF_ALU32_IMM(BPF_MOV, R1, -12345678), 9004 BPF_JMP32_REG(BPF_JSGE, R0, R1, 1), 9005 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9006 BPF_EXIT_INSN(), 9007 }, 9008 INTERNAL, 9009 { }, 9010 { { 0, -12345678 } } 9011 }, 9012 /* BPF_JMP32 | BPF_JSLT | BPF_K */ 9013 { 9014 "JMP32_JSLT_K: Small immediate", 9015 .u.insns_int = { 9016 BPF_ALU32_IMM(BPF_MOV, R0, -123), 9017 BPF_JMP32_IMM(BPF_JSLT, R0, -123, 1), 9018 BPF_JMP32_IMM(BPF_JSLT, R0, -122, 1), 9019 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9020 BPF_EXIT_INSN(), 9021 }, 9022 INTERNAL, 9023 { }, 9024 { { 0, -123 } } 9025 }, 9026 { 9027 "JMP32_JSLT_K: Large immediate", 9028 .u.insns_int = { 9029 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 9030 BPF_JMP32_IMM(BPF_JSLT, R0, -12345678, 1), 9031 BPF_JMP32_IMM(BPF_JSLT, R0, -12345677, 1), 9032 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9033 BPF_EXIT_INSN(), 9034 }, 9035 INTERNAL, 9036 { }, 9037 { { 0, -12345678 } } 9038 }, 9039 /* BPF_JMP32 | BPF_JSLT | BPF_X */ 9040 { 9041 "JMP32_JSLT_X", 9042 .u.insns_int = { 9043 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 9044 BPF_ALU32_IMM(BPF_MOV, R1, -12345678), 9045 BPF_JMP32_REG(BPF_JSLT, R0, R1, 2), 9046 BPF_ALU32_IMM(BPF_MOV, R1, -12345677), 9047 BPF_JMP32_REG(BPF_JSLT, R0, R1, 1), 9048 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9049 BPF_EXIT_INSN(), 9050 }, 9051 INTERNAL, 9052 { }, 9053 { { 0, -12345678 } } 9054 }, 9055 /* BPF_JMP32 | BPF_JSLE | BPF_K */ 9056 { 9057 "JMP32_JSLE_K: Small immediate", 9058 .u.insns_int = { 9059 BPF_ALU32_IMM(BPF_MOV, R0, -123), 9060 BPF_JMP32_IMM(BPF_JSLE, R0, -124, 1), 9061 BPF_JMP32_IMM(BPF_JSLE, R0, -123, 1), 9062 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9063 BPF_EXIT_INSN(), 9064 }, 9065 INTERNAL, 9066 { }, 9067 { { 0, -123 } } 9068 }, 9069 { 9070 "JMP32_JSLE_K: Large immediate", 9071 .u.insns_int = { 9072 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 9073 BPF_JMP32_IMM(BPF_JSLE, R0, -12345679, 1), 9074 BPF_JMP32_IMM(BPF_JSLE, R0, -12345678, 1), 9075 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9076 BPF_EXIT_INSN(), 9077 }, 9078 INTERNAL, 9079 { }, 9080 { { 0, -12345678 } } 9081 }, 9082 /* BPF_JMP32 | BPF_JSLE | BPF_K */ 9083 { 9084 "JMP32_JSLE_X", 9085 .u.insns_int = { 9086 BPF_ALU32_IMM(BPF_MOV, R0, -12345678), 9087 BPF_ALU32_IMM(BPF_MOV, R1, -12345679), 9088 BPF_JMP32_REG(BPF_JSLE, R0, R1, 2), 9089 BPF_ALU32_IMM(BPF_MOV, R1, -12345678), 9090 BPF_JMP32_REG(BPF_JSLE, R0, R1, 1), 9091 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9092 BPF_EXIT_INSN(), 9093 }, 9094 INTERNAL, 9095 { }, 9096 { { 0, -12345678 } } 9097 }, 9098 /* BPF_JMP | BPF_EXIT */ 9099 { 9100 "JMP_EXIT", 9101 .u.insns_int = { 9102 BPF_ALU32_IMM(BPF_MOV, R0, 0x4711), 9103 BPF_EXIT_INSN(), 9104 BPF_ALU32_IMM(BPF_MOV, R0, 0x4712), 9105 }, 9106 INTERNAL, 9107 { }, 9108 { { 0, 0x4711 } }, 9109 }, 9110 /* BPF_JMP | BPF_JA */ 9111 { 9112 "JMP_JA: Unconditional jump: if (true) return 1", 9113 .u.insns_int = { 9114 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9115 BPF_JMP_IMM(BPF_JA, 0, 0, 1), 9116 BPF_EXIT_INSN(), 9117 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9118 BPF_EXIT_INSN(), 9119 }, 9120 INTERNAL, 9121 { }, 9122 { { 0, 1 } }, 9123 }, 9124 /* BPF_JMP | BPF_JSLT | BPF_K */ 9125 { 9126 "JMP_JSLT_K: Signed jump: if (-2 < -1) return 1", 9127 .u.insns_int = { 9128 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9129 BPF_LD_IMM64(R1, 0xfffffffffffffffeLL), 9130 BPF_JMP_IMM(BPF_JSLT, R1, -1, 1), 9131 BPF_EXIT_INSN(), 9132 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9133 BPF_EXIT_INSN(), 9134 }, 9135 INTERNAL, 9136 { }, 9137 { { 0, 1 } }, 9138 }, 9139 { 9140 "JMP_JSLT_K: Signed jump: if (-1 < -1) return 0", 9141 .u.insns_int = { 9142 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9143 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9144 BPF_JMP_IMM(BPF_JSLT, R1, -1, 1), 9145 BPF_EXIT_INSN(), 9146 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9147 BPF_EXIT_INSN(), 9148 }, 9149 INTERNAL, 9150 { }, 9151 { { 0, 1 } }, 9152 }, 9153 /* BPF_JMP | BPF_JSGT | BPF_K */ 9154 { 9155 "JMP_JSGT_K: Signed jump: if (-1 > -2) return 1", 9156 .u.insns_int = { 9157 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9158 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9159 BPF_JMP_IMM(BPF_JSGT, R1, -2, 1), 9160 BPF_EXIT_INSN(), 9161 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9162 BPF_EXIT_INSN(), 9163 }, 9164 INTERNAL, 9165 { }, 9166 { { 0, 1 } }, 9167 }, 9168 { 9169 "JMP_JSGT_K: Signed jump: if (-1 > -1) return 0", 9170 .u.insns_int = { 9171 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9172 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9173 BPF_JMP_IMM(BPF_JSGT, R1, -1, 1), 9174 BPF_EXIT_INSN(), 9175 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9176 BPF_EXIT_INSN(), 9177 }, 9178 INTERNAL, 9179 { }, 9180 { { 0, 1 } }, 9181 }, 9182 /* BPF_JMP | BPF_JSLE | BPF_K */ 9183 { 9184 "JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1", 9185 .u.insns_int = { 9186 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9187 BPF_LD_IMM64(R1, 0xfffffffffffffffeLL), 9188 BPF_JMP_IMM(BPF_JSLE, R1, -1, 1), 9189 BPF_EXIT_INSN(), 9190 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9191 BPF_EXIT_INSN(), 9192 }, 9193 INTERNAL, 9194 { }, 9195 { { 0, 1 } }, 9196 }, 9197 { 9198 "JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1", 9199 .u.insns_int = { 9200 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9201 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9202 BPF_JMP_IMM(BPF_JSLE, R1, -1, 1), 9203 BPF_EXIT_INSN(), 9204 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9205 BPF_EXIT_INSN(), 9206 }, 9207 INTERNAL, 9208 { }, 9209 { { 0, 1 } }, 9210 }, 9211 { 9212 "JMP_JSLE_K: Signed jump: value walk 1", 9213 .u.insns_int = { 9214 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9215 BPF_LD_IMM64(R1, 3), 9216 BPF_JMP_IMM(BPF_JSLE, R1, 0, 6), 9217 BPF_ALU64_IMM(BPF_SUB, R1, 1), 9218 BPF_JMP_IMM(BPF_JSLE, R1, 0, 4), 9219 BPF_ALU64_IMM(BPF_SUB, R1, 1), 9220 BPF_JMP_IMM(BPF_JSLE, R1, 0, 2), 9221 BPF_ALU64_IMM(BPF_SUB, R1, 1), 9222 BPF_JMP_IMM(BPF_JSLE, R1, 0, 1), 9223 BPF_EXIT_INSN(), /* bad exit */ 9224 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */ 9225 BPF_EXIT_INSN(), 9226 }, 9227 INTERNAL, 9228 { }, 9229 { { 0, 1 } }, 9230 }, 9231 { 9232 "JMP_JSLE_K: Signed jump: value walk 2", 9233 .u.insns_int = { 9234 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9235 BPF_LD_IMM64(R1, 3), 9236 BPF_JMP_IMM(BPF_JSLE, R1, 0, 4), 9237 BPF_ALU64_IMM(BPF_SUB, R1, 2), 9238 BPF_JMP_IMM(BPF_JSLE, R1, 0, 2), 9239 BPF_ALU64_IMM(BPF_SUB, R1, 2), 9240 BPF_JMP_IMM(BPF_JSLE, R1, 0, 1), 9241 BPF_EXIT_INSN(), /* bad exit */ 9242 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */ 9243 BPF_EXIT_INSN(), 9244 }, 9245 INTERNAL, 9246 { }, 9247 { { 0, 1 } }, 9248 }, 9249 /* BPF_JMP | BPF_JSGE | BPF_K */ 9250 { 9251 "JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1", 9252 .u.insns_int = { 9253 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9254 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9255 BPF_JMP_IMM(BPF_JSGE, R1, -2, 1), 9256 BPF_EXIT_INSN(), 9257 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9258 BPF_EXIT_INSN(), 9259 }, 9260 INTERNAL, 9261 { }, 9262 { { 0, 1 } }, 9263 }, 9264 { 9265 "JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1", 9266 .u.insns_int = { 9267 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9268 BPF_LD_IMM64(R1, 0xffffffffffffffffLL), 9269 BPF_JMP_IMM(BPF_JSGE, R1, -1, 1), 9270 BPF_EXIT_INSN(), 9271 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9272 BPF_EXIT_INSN(), 9273 }, 9274 INTERNAL, 9275 { }, 9276 { { 0, 1 } }, 9277 }, 9278 { 9279 "JMP_JSGE_K: Signed jump: value walk 1", 9280 .u.insns_int = { 9281 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9282 BPF_LD_IMM64(R1, -3), 9283 BPF_JMP_IMM(BPF_JSGE, R1, 0, 6), 9284 BPF_ALU64_IMM(BPF_ADD, R1, 1), 9285 BPF_JMP_IMM(BPF_JSGE, R1, 0, 4), 9286 BPF_ALU64_IMM(BPF_ADD, R1, 1), 9287 BPF_JMP_IMM(BPF_JSGE, R1, 0, 2), 9288 BPF_ALU64_IMM(BPF_ADD, R1, 1), 9289 BPF_JMP_IMM(BPF_JSGE, R1, 0, 1), 9290 BPF_EXIT_INSN(), /* bad exit */ 9291 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */ 9292 BPF_EXIT_INSN(), 9293 }, 9294 INTERNAL, 9295 { }, 9296 { { 0, 1 } }, 9297 }, 9298 { 9299 "JMP_JSGE_K: Signed jump: value walk 2", 9300 .u.insns_int = { 9301 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9302 BPF_LD_IMM64(R1, -3), 9303 BPF_JMP_IMM(BPF_JSGE, R1, 0, 4), 9304 BPF_ALU64_IMM(BPF_ADD, R1, 2), 9305 BPF_JMP_IMM(BPF_JSGE, R1, 0, 2), 9306 BPF_ALU64_IMM(BPF_ADD, R1, 2), 9307 BPF_JMP_IMM(BPF_JSGE, R1, 0, 1), 9308 BPF_EXIT_INSN(), /* bad exit */ 9309 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* good exit */ 9310 BPF_EXIT_INSN(), 9311 }, 9312 INTERNAL, 9313 { }, 9314 { { 0, 1 } }, 9315 }, 9316 /* BPF_JMP | BPF_JGT | BPF_K */ 9317 { 9318 "JMP_JGT_K: if (3 > 2) return 1", 9319 .u.insns_int = { 9320 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9321 BPF_LD_IMM64(R1, 3), 9322 BPF_JMP_IMM(BPF_JGT, R1, 2, 1), 9323 BPF_EXIT_INSN(), 9324 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9325 BPF_EXIT_INSN(), 9326 }, 9327 INTERNAL, 9328 { }, 9329 { { 0, 1 } }, 9330 }, 9331 { 9332 "JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1", 9333 .u.insns_int = { 9334 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9335 BPF_LD_IMM64(R1, -1), 9336 BPF_JMP_IMM(BPF_JGT, R1, 1, 1), 9337 BPF_EXIT_INSN(), 9338 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9339 BPF_EXIT_INSN(), 9340 }, 9341 INTERNAL, 9342 { }, 9343 { { 0, 1 } }, 9344 }, 9345 /* BPF_JMP | BPF_JLT | BPF_K */ 9346 { 9347 "JMP_JLT_K: if (2 < 3) return 1", 9348 .u.insns_int = { 9349 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9350 BPF_LD_IMM64(R1, 2), 9351 BPF_JMP_IMM(BPF_JLT, R1, 3, 1), 9352 BPF_EXIT_INSN(), 9353 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9354 BPF_EXIT_INSN(), 9355 }, 9356 INTERNAL, 9357 { }, 9358 { { 0, 1 } }, 9359 }, 9360 { 9361 "JMP_JGT_K: Unsigned jump: if (1 < -1) return 1", 9362 .u.insns_int = { 9363 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9364 BPF_LD_IMM64(R1, 1), 9365 BPF_JMP_IMM(BPF_JLT, R1, -1, 1), 9366 BPF_EXIT_INSN(), 9367 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9368 BPF_EXIT_INSN(), 9369 }, 9370 INTERNAL, 9371 { }, 9372 { { 0, 1 } }, 9373 }, 9374 /* BPF_JMP | BPF_JGE | BPF_K */ 9375 { 9376 "JMP_JGE_K: if (3 >= 2) return 1", 9377 .u.insns_int = { 9378 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9379 BPF_LD_IMM64(R1, 3), 9380 BPF_JMP_IMM(BPF_JGE, R1, 2, 1), 9381 BPF_EXIT_INSN(), 9382 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9383 BPF_EXIT_INSN(), 9384 }, 9385 INTERNAL, 9386 { }, 9387 { { 0, 1 } }, 9388 }, 9389 /* BPF_JMP | BPF_JLE | BPF_K */ 9390 { 9391 "JMP_JLE_K: if (2 <= 3) return 1", 9392 .u.insns_int = { 9393 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9394 BPF_LD_IMM64(R1, 2), 9395 BPF_JMP_IMM(BPF_JLE, R1, 3, 1), 9396 BPF_EXIT_INSN(), 9397 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9398 BPF_EXIT_INSN(), 9399 }, 9400 INTERNAL, 9401 { }, 9402 { { 0, 1 } }, 9403 }, 9404 /* BPF_JMP | BPF_JGT | BPF_K jump backwards */ 9405 { 9406 "JMP_JGT_K: if (3 > 2) return 1 (jump backwards)", 9407 .u.insns_int = { 9408 BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */ 9409 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */ 9410 BPF_EXIT_INSN(), 9411 BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */ 9412 BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */ 9413 BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */ 9414 BPF_EXIT_INSN(), 9415 }, 9416 INTERNAL, 9417 { }, 9418 { { 0, 1 } }, 9419 }, 9420 { 9421 "JMP_JGE_K: if (3 >= 3) return 1", 9422 .u.insns_int = { 9423 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9424 BPF_LD_IMM64(R1, 3), 9425 BPF_JMP_IMM(BPF_JGE, R1, 3, 1), 9426 BPF_EXIT_INSN(), 9427 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9428 BPF_EXIT_INSN(), 9429 }, 9430 INTERNAL, 9431 { }, 9432 { { 0, 1 } }, 9433 }, 9434 /* BPF_JMP | BPF_JLT | BPF_K jump backwards */ 9435 { 9436 "JMP_JGT_K: if (2 < 3) return 1 (jump backwards)", 9437 .u.insns_int = { 9438 BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */ 9439 BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */ 9440 BPF_EXIT_INSN(), 9441 BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */ 9442 BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */ 9443 BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */ 9444 BPF_EXIT_INSN(), 9445 }, 9446 INTERNAL, 9447 { }, 9448 { { 0, 1 } }, 9449 }, 9450 { 9451 "JMP_JLE_K: if (3 <= 3) return 1", 9452 .u.insns_int = { 9453 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9454 BPF_LD_IMM64(R1, 3), 9455 BPF_JMP_IMM(BPF_JLE, R1, 3, 1), 9456 BPF_EXIT_INSN(), 9457 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9458 BPF_EXIT_INSN(), 9459 }, 9460 INTERNAL, 9461 { }, 9462 { { 0, 1 } }, 9463 }, 9464 /* BPF_JMP | BPF_JNE | BPF_K */ 9465 { 9466 "JMP_JNE_K: if (3 != 2) return 1", 9467 .u.insns_int = { 9468 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9469 BPF_LD_IMM64(R1, 3), 9470 BPF_JMP_IMM(BPF_JNE, R1, 2, 1), 9471 BPF_EXIT_INSN(), 9472 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9473 BPF_EXIT_INSN(), 9474 }, 9475 INTERNAL, 9476 { }, 9477 { { 0, 1 } }, 9478 }, 9479 /* BPF_JMP | BPF_JEQ | BPF_K */ 9480 { 9481 "JMP_JEQ_K: if (3 == 3) return 1", 9482 .u.insns_int = { 9483 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9484 BPF_LD_IMM64(R1, 3), 9485 BPF_JMP_IMM(BPF_JEQ, R1, 3, 1), 9486 BPF_EXIT_INSN(), 9487 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9488 BPF_EXIT_INSN(), 9489 }, 9490 INTERNAL, 9491 { }, 9492 { { 0, 1 } }, 9493 }, 9494 /* BPF_JMP | BPF_JSET | BPF_K */ 9495 { 9496 "JMP_JSET_K: if (0x3 & 0x2) return 1", 9497 .u.insns_int = { 9498 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9499 BPF_LD_IMM64(R1, 3), 9500 BPF_JMP_IMM(BPF_JSET, R1, 2, 1), 9501 BPF_EXIT_INSN(), 9502 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9503 BPF_EXIT_INSN(), 9504 }, 9505 INTERNAL, 9506 { }, 9507 { { 0, 1 } }, 9508 }, 9509 { 9510 "JMP_JSET_K: if (0x3 & 0xffffffff) return 1", 9511 .u.insns_int = { 9512 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9513 BPF_LD_IMM64(R1, 3), 9514 BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1), 9515 BPF_EXIT_INSN(), 9516 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9517 BPF_EXIT_INSN(), 9518 }, 9519 INTERNAL, 9520 { }, 9521 { { 0, 1 } }, 9522 }, 9523 /* BPF_JMP | BPF_JSGT | BPF_X */ 9524 { 9525 "JMP_JSGT_X: Signed jump: if (-1 > -2) return 1", 9526 .u.insns_int = { 9527 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9528 BPF_LD_IMM64(R1, -1), 9529 BPF_LD_IMM64(R2, -2), 9530 BPF_JMP_REG(BPF_JSGT, R1, R2, 1), 9531 BPF_EXIT_INSN(), 9532 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9533 BPF_EXIT_INSN(), 9534 }, 9535 INTERNAL, 9536 { }, 9537 { { 0, 1 } }, 9538 }, 9539 { 9540 "JMP_JSGT_X: Signed jump: if (-1 > -1) return 0", 9541 .u.insns_int = { 9542 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9543 BPF_LD_IMM64(R1, -1), 9544 BPF_LD_IMM64(R2, -1), 9545 BPF_JMP_REG(BPF_JSGT, R1, R2, 1), 9546 BPF_EXIT_INSN(), 9547 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9548 BPF_EXIT_INSN(), 9549 }, 9550 INTERNAL, 9551 { }, 9552 { { 0, 1 } }, 9553 }, 9554 /* BPF_JMP | BPF_JSLT | BPF_X */ 9555 { 9556 "JMP_JSLT_X: Signed jump: if (-2 < -1) return 1", 9557 .u.insns_int = { 9558 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9559 BPF_LD_IMM64(R1, -1), 9560 BPF_LD_IMM64(R2, -2), 9561 BPF_JMP_REG(BPF_JSLT, R2, R1, 1), 9562 BPF_EXIT_INSN(), 9563 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9564 BPF_EXIT_INSN(), 9565 }, 9566 INTERNAL, 9567 { }, 9568 { { 0, 1 } }, 9569 }, 9570 { 9571 "JMP_JSLT_X: Signed jump: if (-1 < -1) return 0", 9572 .u.insns_int = { 9573 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9574 BPF_LD_IMM64(R1, -1), 9575 BPF_LD_IMM64(R2, -1), 9576 BPF_JMP_REG(BPF_JSLT, R1, R2, 1), 9577 BPF_EXIT_INSN(), 9578 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9579 BPF_EXIT_INSN(), 9580 }, 9581 INTERNAL, 9582 { }, 9583 { { 0, 1 } }, 9584 }, 9585 /* BPF_JMP | BPF_JSGE | BPF_X */ 9586 { 9587 "JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1", 9588 .u.insns_int = { 9589 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9590 BPF_LD_IMM64(R1, -1), 9591 BPF_LD_IMM64(R2, -2), 9592 BPF_JMP_REG(BPF_JSGE, R1, R2, 1), 9593 BPF_EXIT_INSN(), 9594 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9595 BPF_EXIT_INSN(), 9596 }, 9597 INTERNAL, 9598 { }, 9599 { { 0, 1 } }, 9600 }, 9601 { 9602 "JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1", 9603 .u.insns_int = { 9604 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9605 BPF_LD_IMM64(R1, -1), 9606 BPF_LD_IMM64(R2, -1), 9607 BPF_JMP_REG(BPF_JSGE, R1, R2, 1), 9608 BPF_EXIT_INSN(), 9609 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9610 BPF_EXIT_INSN(), 9611 }, 9612 INTERNAL, 9613 { }, 9614 { { 0, 1 } }, 9615 }, 9616 /* BPF_JMP | BPF_JSLE | BPF_X */ 9617 { 9618 "JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1", 9619 .u.insns_int = { 9620 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9621 BPF_LD_IMM64(R1, -1), 9622 BPF_LD_IMM64(R2, -2), 9623 BPF_JMP_REG(BPF_JSLE, R2, R1, 1), 9624 BPF_EXIT_INSN(), 9625 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9626 BPF_EXIT_INSN(), 9627 }, 9628 INTERNAL, 9629 { }, 9630 { { 0, 1 } }, 9631 }, 9632 { 9633 "JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1", 9634 .u.insns_int = { 9635 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9636 BPF_LD_IMM64(R1, -1), 9637 BPF_LD_IMM64(R2, -1), 9638 BPF_JMP_REG(BPF_JSLE, R1, R2, 1), 9639 BPF_EXIT_INSN(), 9640 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9641 BPF_EXIT_INSN(), 9642 }, 9643 INTERNAL, 9644 { }, 9645 { { 0, 1 } }, 9646 }, 9647 /* BPF_JMP | BPF_JGT | BPF_X */ 9648 { 9649 "JMP_JGT_X: if (3 > 2) return 1", 9650 .u.insns_int = { 9651 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9652 BPF_LD_IMM64(R1, 3), 9653 BPF_LD_IMM64(R2, 2), 9654 BPF_JMP_REG(BPF_JGT, R1, R2, 1), 9655 BPF_EXIT_INSN(), 9656 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9657 BPF_EXIT_INSN(), 9658 }, 9659 INTERNAL, 9660 { }, 9661 { { 0, 1 } }, 9662 }, 9663 { 9664 "JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1", 9665 .u.insns_int = { 9666 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9667 BPF_LD_IMM64(R1, -1), 9668 BPF_LD_IMM64(R2, 1), 9669 BPF_JMP_REG(BPF_JGT, R1, R2, 1), 9670 BPF_EXIT_INSN(), 9671 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9672 BPF_EXIT_INSN(), 9673 }, 9674 INTERNAL, 9675 { }, 9676 { { 0, 1 } }, 9677 }, 9678 /* BPF_JMP | BPF_JLT | BPF_X */ 9679 { 9680 "JMP_JLT_X: if (2 < 3) return 1", 9681 .u.insns_int = { 9682 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9683 BPF_LD_IMM64(R1, 3), 9684 BPF_LD_IMM64(R2, 2), 9685 BPF_JMP_REG(BPF_JLT, R2, R1, 1), 9686 BPF_EXIT_INSN(), 9687 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9688 BPF_EXIT_INSN(), 9689 }, 9690 INTERNAL, 9691 { }, 9692 { { 0, 1 } }, 9693 }, 9694 { 9695 "JMP_JLT_X: Unsigned jump: if (1 < -1) return 1", 9696 .u.insns_int = { 9697 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9698 BPF_LD_IMM64(R1, -1), 9699 BPF_LD_IMM64(R2, 1), 9700 BPF_JMP_REG(BPF_JLT, R2, R1, 1), 9701 BPF_EXIT_INSN(), 9702 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9703 BPF_EXIT_INSN(), 9704 }, 9705 INTERNAL, 9706 { }, 9707 { { 0, 1 } }, 9708 }, 9709 /* BPF_JMP | BPF_JGE | BPF_X */ 9710 { 9711 "JMP_JGE_X: if (3 >= 2) return 1", 9712 .u.insns_int = { 9713 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9714 BPF_LD_IMM64(R1, 3), 9715 BPF_LD_IMM64(R2, 2), 9716 BPF_JMP_REG(BPF_JGE, R1, R2, 1), 9717 BPF_EXIT_INSN(), 9718 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9719 BPF_EXIT_INSN(), 9720 }, 9721 INTERNAL, 9722 { }, 9723 { { 0, 1 } }, 9724 }, 9725 { 9726 "JMP_JGE_X: if (3 >= 3) return 1", 9727 .u.insns_int = { 9728 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9729 BPF_LD_IMM64(R1, 3), 9730 BPF_LD_IMM64(R2, 3), 9731 BPF_JMP_REG(BPF_JGE, R1, R2, 1), 9732 BPF_EXIT_INSN(), 9733 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9734 BPF_EXIT_INSN(), 9735 }, 9736 INTERNAL, 9737 { }, 9738 { { 0, 1 } }, 9739 }, 9740 /* BPF_JMP | BPF_JLE | BPF_X */ 9741 { 9742 "JMP_JLE_X: if (2 <= 3) return 1", 9743 .u.insns_int = { 9744 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9745 BPF_LD_IMM64(R1, 3), 9746 BPF_LD_IMM64(R2, 2), 9747 BPF_JMP_REG(BPF_JLE, R2, R1, 1), 9748 BPF_EXIT_INSN(), 9749 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9750 BPF_EXIT_INSN(), 9751 }, 9752 INTERNAL, 9753 { }, 9754 { { 0, 1 } }, 9755 }, 9756 { 9757 "JMP_JLE_X: if (3 <= 3) return 1", 9758 .u.insns_int = { 9759 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9760 BPF_LD_IMM64(R1, 3), 9761 BPF_LD_IMM64(R2, 3), 9762 BPF_JMP_REG(BPF_JLE, R1, R2, 1), 9763 BPF_EXIT_INSN(), 9764 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9765 BPF_EXIT_INSN(), 9766 }, 9767 INTERNAL, 9768 { }, 9769 { { 0, 1 } }, 9770 }, 9771 { 9772 /* Mainly testing JIT + imm64 here. */ 9773 "JMP_JGE_X: ldimm64 test 1", 9774 .u.insns_int = { 9775 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9776 BPF_LD_IMM64(R1, 3), 9777 BPF_LD_IMM64(R2, 2), 9778 BPF_JMP_REG(BPF_JGE, R1, R2, 2), 9779 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9780 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL), 9781 BPF_EXIT_INSN(), 9782 }, 9783 INTERNAL, 9784 { }, 9785 { { 0, 0xeeeeeeeeU } }, 9786 }, 9787 { 9788 "JMP_JGE_X: ldimm64 test 2", 9789 .u.insns_int = { 9790 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9791 BPF_LD_IMM64(R1, 3), 9792 BPF_LD_IMM64(R2, 2), 9793 BPF_JMP_REG(BPF_JGE, R1, R2, 0), 9794 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9795 BPF_EXIT_INSN(), 9796 }, 9797 INTERNAL, 9798 { }, 9799 { { 0, 0xffffffffU } }, 9800 }, 9801 { 9802 "JMP_JGE_X: ldimm64 test 3", 9803 .u.insns_int = { 9804 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9805 BPF_LD_IMM64(R1, 3), 9806 BPF_LD_IMM64(R2, 2), 9807 BPF_JMP_REG(BPF_JGE, R1, R2, 4), 9808 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9809 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL), 9810 BPF_EXIT_INSN(), 9811 }, 9812 INTERNAL, 9813 { }, 9814 { { 0, 1 } }, 9815 }, 9816 { 9817 "JMP_JLE_X: ldimm64 test 1", 9818 .u.insns_int = { 9819 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9820 BPF_LD_IMM64(R1, 3), 9821 BPF_LD_IMM64(R2, 2), 9822 BPF_JMP_REG(BPF_JLE, R2, R1, 2), 9823 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9824 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL), 9825 BPF_EXIT_INSN(), 9826 }, 9827 INTERNAL, 9828 { }, 9829 { { 0, 0xeeeeeeeeU } }, 9830 }, 9831 { 9832 "JMP_JLE_X: ldimm64 test 2", 9833 .u.insns_int = { 9834 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9835 BPF_LD_IMM64(R1, 3), 9836 BPF_LD_IMM64(R2, 2), 9837 BPF_JMP_REG(BPF_JLE, R2, R1, 0), 9838 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9839 BPF_EXIT_INSN(), 9840 }, 9841 INTERNAL, 9842 { }, 9843 { { 0, 0xffffffffU } }, 9844 }, 9845 { 9846 "JMP_JLE_X: ldimm64 test 3", 9847 .u.insns_int = { 9848 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9849 BPF_LD_IMM64(R1, 3), 9850 BPF_LD_IMM64(R2, 2), 9851 BPF_JMP_REG(BPF_JLE, R2, R1, 4), 9852 BPF_LD_IMM64(R0, 0xffffffffffffffffULL), 9853 BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL), 9854 BPF_EXIT_INSN(), 9855 }, 9856 INTERNAL, 9857 { }, 9858 { { 0, 1 } }, 9859 }, 9860 /* BPF_JMP | BPF_JNE | BPF_X */ 9861 { 9862 "JMP_JNE_X: if (3 != 2) return 1", 9863 .u.insns_int = { 9864 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9865 BPF_LD_IMM64(R1, 3), 9866 BPF_LD_IMM64(R2, 2), 9867 BPF_JMP_REG(BPF_JNE, R1, R2, 1), 9868 BPF_EXIT_INSN(), 9869 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9870 BPF_EXIT_INSN(), 9871 }, 9872 INTERNAL, 9873 { }, 9874 { { 0, 1 } }, 9875 }, 9876 /* BPF_JMP | BPF_JEQ | BPF_X */ 9877 { 9878 "JMP_JEQ_X: if (3 == 3) return 1", 9879 .u.insns_int = { 9880 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9881 BPF_LD_IMM64(R1, 3), 9882 BPF_LD_IMM64(R2, 3), 9883 BPF_JMP_REG(BPF_JEQ, R1, R2, 1), 9884 BPF_EXIT_INSN(), 9885 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9886 BPF_EXIT_INSN(), 9887 }, 9888 INTERNAL, 9889 { }, 9890 { { 0, 1 } }, 9891 }, 9892 /* BPF_JMP | BPF_JSET | BPF_X */ 9893 { 9894 "JMP_JSET_X: if (0x3 & 0x2) return 1", 9895 .u.insns_int = { 9896 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9897 BPF_LD_IMM64(R1, 3), 9898 BPF_LD_IMM64(R2, 2), 9899 BPF_JMP_REG(BPF_JSET, R1, R2, 1), 9900 BPF_EXIT_INSN(), 9901 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9902 BPF_EXIT_INSN(), 9903 }, 9904 INTERNAL, 9905 { }, 9906 { { 0, 1 } }, 9907 }, 9908 { 9909 "JMP_JSET_X: if (0x3 & 0xffffffff) return 1", 9910 .u.insns_int = { 9911 BPF_ALU32_IMM(BPF_MOV, R0, 0), 9912 BPF_LD_IMM64(R1, 3), 9913 BPF_LD_IMM64(R2, 0xffffffff), 9914 BPF_JMP_REG(BPF_JSET, R1, R2, 1), 9915 BPF_EXIT_INSN(), 9916 BPF_ALU32_IMM(BPF_MOV, R0, 1), 9917 BPF_EXIT_INSN(), 9918 }, 9919 INTERNAL, 9920 { }, 9921 { { 0, 1 } }, 9922 }, 9923 { 9924 "JMP_JA: Jump, gap, jump, ...", 9925 { }, 9926 CLASSIC | FLAG_NO_DATA, 9927 { }, 9928 { { 0, 0xababcbac } }, 9929 .fill_helper = bpf_fill_ja, 9930 }, 9931 { /* Mainly checking JIT here. */ 9932 "BPF_MAXINSNS: Maximum possible literals", 9933 { }, 9934 CLASSIC | FLAG_NO_DATA, 9935 { }, 9936 { { 0, 0xffffffff } }, 9937 .fill_helper = bpf_fill_maxinsns1, 9938 }, 9939 { /* Mainly checking JIT here. */ 9940 "BPF_MAXINSNS: Single literal", 9941 { }, 9942 CLASSIC | FLAG_NO_DATA, 9943 { }, 9944 { { 0, 0xfefefefe } }, 9945 .fill_helper = bpf_fill_maxinsns2, 9946 }, 9947 { /* Mainly checking JIT here. */ 9948 "BPF_MAXINSNS: Run/add until end", 9949 { }, 9950 CLASSIC | FLAG_NO_DATA, 9951 { }, 9952 { { 0, 0x947bf368 } }, 9953 .fill_helper = bpf_fill_maxinsns3, 9954 }, 9955 { 9956 "BPF_MAXINSNS: Too many instructions", 9957 { }, 9958 CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL, 9959 { }, 9960 { }, 9961 .fill_helper = bpf_fill_maxinsns4, 9962 .expected_errcode = -EINVAL, 9963 }, 9964 { /* Mainly checking JIT here. */ 9965 "BPF_MAXINSNS: Very long jump", 9966 { }, 9967 CLASSIC | FLAG_NO_DATA, 9968 { }, 9969 { { 0, 0xabababab } }, 9970 .fill_helper = bpf_fill_maxinsns5, 9971 }, 9972 { /* Mainly checking JIT here. */ 9973 "BPF_MAXINSNS: Ctx heavy transformations", 9974 { }, 9975 CLASSIC, 9976 { }, 9977 { 9978 { 1, SKB_VLAN_PRESENT }, 9979 { 10, SKB_VLAN_PRESENT } 9980 }, 9981 .fill_helper = bpf_fill_maxinsns6, 9982 }, 9983 { /* Mainly checking JIT here. */ 9984 "BPF_MAXINSNS: Call heavy transformations", 9985 { }, 9986 CLASSIC | FLAG_NO_DATA, 9987 { }, 9988 { { 1, 0 }, { 10, 0 } }, 9989 .fill_helper = bpf_fill_maxinsns7, 9990 }, 9991 { /* Mainly checking JIT here. */ 9992 "BPF_MAXINSNS: Jump heavy test", 9993 { }, 9994 CLASSIC | FLAG_NO_DATA, 9995 { }, 9996 { { 0, 0xffffffff } }, 9997 .fill_helper = bpf_fill_maxinsns8, 9998 }, 9999 { /* Mainly checking JIT here. */ 10000 "BPF_MAXINSNS: Very long jump backwards", 10001 { }, 10002 INTERNAL | FLAG_NO_DATA, 10003 { }, 10004 { { 0, 0xcbababab } }, 10005 .fill_helper = bpf_fill_maxinsns9, 10006 }, 10007 { /* Mainly checking JIT here. */ 10008 "BPF_MAXINSNS: Edge hopping nuthouse", 10009 { }, 10010 INTERNAL | FLAG_NO_DATA, 10011 { }, 10012 { { 0, 0xabababac } }, 10013 .fill_helper = bpf_fill_maxinsns10, 10014 }, 10015 { 10016 "BPF_MAXINSNS: Jump, gap, jump, ...", 10017 { }, 10018 CLASSIC | FLAG_NO_DATA, 10019 { }, 10020 { { 0, 0xababcbac } }, 10021 .fill_helper = bpf_fill_maxinsns11, 10022 }, 10023 { 10024 "BPF_MAXINSNS: jump over MSH", 10025 { }, 10026 CLASSIC | FLAG_EXPECTED_FAIL, 10027 { 0xfa, 0xfb, 0xfc, 0xfd, }, 10028 { { 4, 0xabababab } }, 10029 .fill_helper = bpf_fill_maxinsns12, 10030 .expected_errcode = -EINVAL, 10031 }, 10032 { 10033 "BPF_MAXINSNS: exec all MSH", 10034 { }, 10035 CLASSIC, 10036 { 0xfa, 0xfb, 0xfc, 0xfd, }, 10037 { { 4, 0xababab83 } }, 10038 .fill_helper = bpf_fill_maxinsns13, 10039 }, 10040 { 10041 "BPF_MAXINSNS: ld_abs+get_processor_id", 10042 { }, 10043 CLASSIC, 10044 { }, 10045 { { 1, 0xbee } }, 10046 .fill_helper = bpf_fill_ld_abs_get_processor_id, 10047 }, 10048 /* 10049 * LD_IND / LD_ABS on fragmented SKBs 10050 */ 10051 { 10052 "LD_IND byte frag", 10053 .u.insns = { 10054 BPF_STMT(BPF_LDX | BPF_IMM, 0x40), 10055 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0), 10056 BPF_STMT(BPF_RET | BPF_A, 0x0), 10057 }, 10058 CLASSIC | FLAG_SKB_FRAG, 10059 { }, 10060 { {0x40, 0x42} }, 10061 .frag_data = { 10062 0x42, 0x00, 0x00, 0x00, 10063 0x43, 0x44, 0x00, 0x00, 10064 0x21, 0x07, 0x19, 0x83, 10065 }, 10066 }, 10067 { 10068 "LD_IND halfword frag", 10069 .u.insns = { 10070 BPF_STMT(BPF_LDX | BPF_IMM, 0x40), 10071 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4), 10072 BPF_STMT(BPF_RET | BPF_A, 0x0), 10073 }, 10074 CLASSIC | FLAG_SKB_FRAG, 10075 { }, 10076 { {0x40, 0x4344} }, 10077 .frag_data = { 10078 0x42, 0x00, 0x00, 0x00, 10079 0x43, 0x44, 0x00, 0x00, 10080 0x21, 0x07, 0x19, 0x83, 10081 }, 10082 }, 10083 { 10084 "LD_IND word frag", 10085 .u.insns = { 10086 BPF_STMT(BPF_LDX | BPF_IMM, 0x40), 10087 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8), 10088 BPF_STMT(BPF_RET | BPF_A, 0x0), 10089 }, 10090 CLASSIC | FLAG_SKB_FRAG, 10091 { }, 10092 { {0x40, 0x21071983} }, 10093 .frag_data = { 10094 0x42, 0x00, 0x00, 0x00, 10095 0x43, 0x44, 0x00, 0x00, 10096 0x21, 0x07, 0x19, 0x83, 10097 }, 10098 }, 10099 { 10100 "LD_IND halfword mixed head/frag", 10101 .u.insns = { 10102 BPF_STMT(BPF_LDX | BPF_IMM, 0x40), 10103 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1), 10104 BPF_STMT(BPF_RET | BPF_A, 0x0), 10105 }, 10106 CLASSIC | FLAG_SKB_FRAG, 10107 { [0x3e] = 0x25, [0x3f] = 0x05, }, 10108 { {0x40, 0x0519} }, 10109 .frag_data = { 0x19, 0x82 }, 10110 }, 10111 { 10112 "LD_IND word mixed head/frag", 10113 .u.insns = { 10114 BPF_STMT(BPF_LDX | BPF_IMM, 0x40), 10115 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2), 10116 BPF_STMT(BPF_RET | BPF_A, 0x0), 10117 }, 10118 CLASSIC | FLAG_SKB_FRAG, 10119 { [0x3e] = 0x25, [0x3f] = 0x05, }, 10120 { {0x40, 0x25051982} }, 10121 .frag_data = { 0x19, 0x82 }, 10122 }, 10123 { 10124 "LD_ABS byte frag", 10125 .u.insns = { 10126 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40), 10127 BPF_STMT(BPF_RET | BPF_A, 0x0), 10128 }, 10129 CLASSIC | FLAG_SKB_FRAG, 10130 { }, 10131 { {0x40, 0x42} }, 10132 .frag_data = { 10133 0x42, 0x00, 0x00, 0x00, 10134 0x43, 0x44, 0x00, 0x00, 10135 0x21, 0x07, 0x19, 0x83, 10136 }, 10137 }, 10138 { 10139 "LD_ABS halfword frag", 10140 .u.insns = { 10141 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44), 10142 BPF_STMT(BPF_RET | BPF_A, 0x0), 10143 }, 10144 CLASSIC | FLAG_SKB_FRAG, 10145 { }, 10146 { {0x40, 0x4344} }, 10147 .frag_data = { 10148 0x42, 0x00, 0x00, 0x00, 10149 0x43, 0x44, 0x00, 0x00, 10150 0x21, 0x07, 0x19, 0x83, 10151 }, 10152 }, 10153 { 10154 "LD_ABS word frag", 10155 .u.insns = { 10156 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48), 10157 BPF_STMT(BPF_RET | BPF_A, 0x0), 10158 }, 10159 CLASSIC | FLAG_SKB_FRAG, 10160 { }, 10161 { {0x40, 0x21071983} }, 10162 .frag_data = { 10163 0x42, 0x00, 0x00, 0x00, 10164 0x43, 0x44, 0x00, 0x00, 10165 0x21, 0x07, 0x19, 0x83, 10166 }, 10167 }, 10168 { 10169 "LD_ABS halfword mixed head/frag", 10170 .u.insns = { 10171 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f), 10172 BPF_STMT(BPF_RET | BPF_A, 0x0), 10173 }, 10174 CLASSIC | FLAG_SKB_FRAG, 10175 { [0x3e] = 0x25, [0x3f] = 0x05, }, 10176 { {0x40, 0x0519} }, 10177 .frag_data = { 0x19, 0x82 }, 10178 }, 10179 { 10180 "LD_ABS word mixed head/frag", 10181 .u.insns = { 10182 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e), 10183 BPF_STMT(BPF_RET | BPF_A, 0x0), 10184 }, 10185 CLASSIC | FLAG_SKB_FRAG, 10186 { [0x3e] = 0x25, [0x3f] = 0x05, }, 10187 { {0x40, 0x25051982} }, 10188 .frag_data = { 0x19, 0x82 }, 10189 }, 10190 /* 10191 * LD_IND / LD_ABS on non fragmented SKBs 10192 */ 10193 { 10194 /* 10195 * this tests that the JIT/interpreter correctly resets X 10196 * before using it in an LD_IND instruction. 10197 */ 10198 "LD_IND byte default X", 10199 .u.insns = { 10200 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1), 10201 BPF_STMT(BPF_RET | BPF_A, 0x0), 10202 }, 10203 CLASSIC, 10204 { [0x1] = 0x42 }, 10205 { {0x40, 0x42 } }, 10206 }, 10207 { 10208 "LD_IND byte positive offset", 10209 .u.insns = { 10210 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10211 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1), 10212 BPF_STMT(BPF_RET | BPF_A, 0x0), 10213 }, 10214 CLASSIC, 10215 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10216 { {0x40, 0x82 } }, 10217 }, 10218 { 10219 "LD_IND byte negative offset", 10220 .u.insns = { 10221 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10222 BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1), 10223 BPF_STMT(BPF_RET | BPF_A, 0x0), 10224 }, 10225 CLASSIC, 10226 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10227 { {0x40, 0x05 } }, 10228 }, 10229 { 10230 "LD_IND byte positive offset, all ff", 10231 .u.insns = { 10232 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10233 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1), 10234 BPF_STMT(BPF_RET | BPF_A, 0x0), 10235 }, 10236 CLASSIC, 10237 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10238 { {0x40, 0xff } }, 10239 }, 10240 { 10241 "LD_IND byte positive offset, out of bounds", 10242 .u.insns = { 10243 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10244 BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1), 10245 BPF_STMT(BPF_RET | BPF_A, 0x0), 10246 }, 10247 CLASSIC, 10248 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10249 { {0x3f, 0 }, }, 10250 }, 10251 { 10252 "LD_IND byte negative offset, out of bounds", 10253 .u.insns = { 10254 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10255 BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f), 10256 BPF_STMT(BPF_RET | BPF_A, 0x0), 10257 }, 10258 CLASSIC, 10259 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10260 { {0x3f, 0 } }, 10261 }, 10262 { 10263 "LD_IND byte negative offset, multiple calls", 10264 .u.insns = { 10265 BPF_STMT(BPF_LDX | BPF_IMM, 0x3b), 10266 BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1), 10267 BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2), 10268 BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3), 10269 BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4), 10270 BPF_STMT(BPF_RET | BPF_A, 0x0), 10271 }, 10272 CLASSIC, 10273 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10274 { {0x40, 0x82 }, }, 10275 }, 10276 { 10277 "LD_IND halfword positive offset", 10278 .u.insns = { 10279 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10280 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2), 10281 BPF_STMT(BPF_RET | BPF_A, 0x0), 10282 }, 10283 CLASSIC, 10284 { 10285 [0x1c] = 0xaa, [0x1d] = 0x55, 10286 [0x1e] = 0xbb, [0x1f] = 0x66, 10287 [0x20] = 0xcc, [0x21] = 0x77, 10288 [0x22] = 0xdd, [0x23] = 0x88, 10289 }, 10290 { {0x40, 0xdd88 } }, 10291 }, 10292 { 10293 "LD_IND halfword negative offset", 10294 .u.insns = { 10295 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10296 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2), 10297 BPF_STMT(BPF_RET | BPF_A, 0x0), 10298 }, 10299 CLASSIC, 10300 { 10301 [0x1c] = 0xaa, [0x1d] = 0x55, 10302 [0x1e] = 0xbb, [0x1f] = 0x66, 10303 [0x20] = 0xcc, [0x21] = 0x77, 10304 [0x22] = 0xdd, [0x23] = 0x88, 10305 }, 10306 { {0x40, 0xbb66 } }, 10307 }, 10308 { 10309 "LD_IND halfword unaligned", 10310 .u.insns = { 10311 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10312 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1), 10313 BPF_STMT(BPF_RET | BPF_A, 0x0), 10314 }, 10315 CLASSIC, 10316 { 10317 [0x1c] = 0xaa, [0x1d] = 0x55, 10318 [0x1e] = 0xbb, [0x1f] = 0x66, 10319 [0x20] = 0xcc, [0x21] = 0x77, 10320 [0x22] = 0xdd, [0x23] = 0x88, 10321 }, 10322 { {0x40, 0x66cc } }, 10323 }, 10324 { 10325 "LD_IND halfword positive offset, all ff", 10326 .u.insns = { 10327 BPF_STMT(BPF_LDX | BPF_IMM, 0x3d), 10328 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1), 10329 BPF_STMT(BPF_RET | BPF_A, 0x0), 10330 }, 10331 CLASSIC, 10332 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10333 { {0x40, 0xffff } }, 10334 }, 10335 { 10336 "LD_IND halfword positive offset, out of bounds", 10337 .u.insns = { 10338 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10339 BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1), 10340 BPF_STMT(BPF_RET | BPF_A, 0x0), 10341 }, 10342 CLASSIC, 10343 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10344 { {0x3f, 0 }, }, 10345 }, 10346 { 10347 "LD_IND halfword negative offset, out of bounds", 10348 .u.insns = { 10349 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10350 BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f), 10351 BPF_STMT(BPF_RET | BPF_A, 0x0), 10352 }, 10353 CLASSIC, 10354 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10355 { {0x3f, 0 } }, 10356 }, 10357 { 10358 "LD_IND word positive offset", 10359 .u.insns = { 10360 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10361 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4), 10362 BPF_STMT(BPF_RET | BPF_A, 0x0), 10363 }, 10364 CLASSIC, 10365 { 10366 [0x1c] = 0xaa, [0x1d] = 0x55, 10367 [0x1e] = 0xbb, [0x1f] = 0x66, 10368 [0x20] = 0xcc, [0x21] = 0x77, 10369 [0x22] = 0xdd, [0x23] = 0x88, 10370 [0x24] = 0xee, [0x25] = 0x99, 10371 [0x26] = 0xff, [0x27] = 0xaa, 10372 }, 10373 { {0x40, 0xee99ffaa } }, 10374 }, 10375 { 10376 "LD_IND word negative offset", 10377 .u.insns = { 10378 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10379 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4), 10380 BPF_STMT(BPF_RET | BPF_A, 0x0), 10381 }, 10382 CLASSIC, 10383 { 10384 [0x1c] = 0xaa, [0x1d] = 0x55, 10385 [0x1e] = 0xbb, [0x1f] = 0x66, 10386 [0x20] = 0xcc, [0x21] = 0x77, 10387 [0x22] = 0xdd, [0x23] = 0x88, 10388 [0x24] = 0xee, [0x25] = 0x99, 10389 [0x26] = 0xff, [0x27] = 0xaa, 10390 }, 10391 { {0x40, 0xaa55bb66 } }, 10392 }, 10393 { 10394 "LD_IND word unaligned (addr & 3 == 2)", 10395 .u.insns = { 10396 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10397 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2), 10398 BPF_STMT(BPF_RET | BPF_A, 0x0), 10399 }, 10400 CLASSIC, 10401 { 10402 [0x1c] = 0xaa, [0x1d] = 0x55, 10403 [0x1e] = 0xbb, [0x1f] = 0x66, 10404 [0x20] = 0xcc, [0x21] = 0x77, 10405 [0x22] = 0xdd, [0x23] = 0x88, 10406 [0x24] = 0xee, [0x25] = 0x99, 10407 [0x26] = 0xff, [0x27] = 0xaa, 10408 }, 10409 { {0x40, 0xbb66cc77 } }, 10410 }, 10411 { 10412 "LD_IND word unaligned (addr & 3 == 1)", 10413 .u.insns = { 10414 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10415 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3), 10416 BPF_STMT(BPF_RET | BPF_A, 0x0), 10417 }, 10418 CLASSIC, 10419 { 10420 [0x1c] = 0xaa, [0x1d] = 0x55, 10421 [0x1e] = 0xbb, [0x1f] = 0x66, 10422 [0x20] = 0xcc, [0x21] = 0x77, 10423 [0x22] = 0xdd, [0x23] = 0x88, 10424 [0x24] = 0xee, [0x25] = 0x99, 10425 [0x26] = 0xff, [0x27] = 0xaa, 10426 }, 10427 { {0x40, 0x55bb66cc } }, 10428 }, 10429 { 10430 "LD_IND word unaligned (addr & 3 == 3)", 10431 .u.insns = { 10432 BPF_STMT(BPF_LDX | BPF_IMM, 0x20), 10433 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1), 10434 BPF_STMT(BPF_RET | BPF_A, 0x0), 10435 }, 10436 CLASSIC, 10437 { 10438 [0x1c] = 0xaa, [0x1d] = 0x55, 10439 [0x1e] = 0xbb, [0x1f] = 0x66, 10440 [0x20] = 0xcc, [0x21] = 0x77, 10441 [0x22] = 0xdd, [0x23] = 0x88, 10442 [0x24] = 0xee, [0x25] = 0x99, 10443 [0x26] = 0xff, [0x27] = 0xaa, 10444 }, 10445 { {0x40, 0x66cc77dd } }, 10446 }, 10447 { 10448 "LD_IND word positive offset, all ff", 10449 .u.insns = { 10450 BPF_STMT(BPF_LDX | BPF_IMM, 0x3b), 10451 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1), 10452 BPF_STMT(BPF_RET | BPF_A, 0x0), 10453 }, 10454 CLASSIC, 10455 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10456 { {0x40, 0xffffffff } }, 10457 }, 10458 { 10459 "LD_IND word positive offset, out of bounds", 10460 .u.insns = { 10461 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10462 BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1), 10463 BPF_STMT(BPF_RET | BPF_A, 0x0), 10464 }, 10465 CLASSIC, 10466 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10467 { {0x3f, 0 }, }, 10468 }, 10469 { 10470 "LD_IND word negative offset, out of bounds", 10471 .u.insns = { 10472 BPF_STMT(BPF_LDX | BPF_IMM, 0x3e), 10473 BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f), 10474 BPF_STMT(BPF_RET | BPF_A, 0x0), 10475 }, 10476 CLASSIC, 10477 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10478 { {0x3f, 0 } }, 10479 }, 10480 { 10481 "LD_ABS byte", 10482 .u.insns = { 10483 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20), 10484 BPF_STMT(BPF_RET | BPF_A, 0x0), 10485 }, 10486 CLASSIC, 10487 { 10488 [0x1c] = 0xaa, [0x1d] = 0x55, 10489 [0x1e] = 0xbb, [0x1f] = 0x66, 10490 [0x20] = 0xcc, [0x21] = 0x77, 10491 [0x22] = 0xdd, [0x23] = 0x88, 10492 [0x24] = 0xee, [0x25] = 0x99, 10493 [0x26] = 0xff, [0x27] = 0xaa, 10494 }, 10495 { {0x40, 0xcc } }, 10496 }, 10497 { 10498 "LD_ABS byte positive offset, all ff", 10499 .u.insns = { 10500 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f), 10501 BPF_STMT(BPF_RET | BPF_A, 0x0), 10502 }, 10503 CLASSIC, 10504 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10505 { {0x40, 0xff } }, 10506 }, 10507 { 10508 "LD_ABS byte positive offset, out of bounds", 10509 .u.insns = { 10510 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f), 10511 BPF_STMT(BPF_RET | BPF_A, 0x0), 10512 }, 10513 CLASSIC, 10514 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10515 { {0x3f, 0 }, }, 10516 }, 10517 { 10518 "LD_ABS byte negative offset, out of bounds load", 10519 .u.insns = { 10520 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1), 10521 BPF_STMT(BPF_RET | BPF_A, 0x0), 10522 }, 10523 CLASSIC | FLAG_EXPECTED_FAIL, 10524 .expected_errcode = -EINVAL, 10525 }, 10526 { 10527 "LD_ABS byte negative offset, in bounds", 10528 .u.insns = { 10529 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f), 10530 BPF_STMT(BPF_RET | BPF_A, 0x0), 10531 }, 10532 CLASSIC, 10533 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10534 { {0x40, 0x82 }, }, 10535 }, 10536 { 10537 "LD_ABS byte negative offset, out of bounds", 10538 .u.insns = { 10539 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f), 10540 BPF_STMT(BPF_RET | BPF_A, 0x0), 10541 }, 10542 CLASSIC, 10543 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10544 { {0x3f, 0 }, }, 10545 }, 10546 { 10547 "LD_ABS byte negative offset, multiple calls", 10548 .u.insns = { 10549 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c), 10550 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d), 10551 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e), 10552 BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f), 10553 BPF_STMT(BPF_RET | BPF_A, 0x0), 10554 }, 10555 CLASSIC, 10556 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10557 { {0x40, 0x82 }, }, 10558 }, 10559 { 10560 "LD_ABS halfword", 10561 .u.insns = { 10562 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22), 10563 BPF_STMT(BPF_RET | BPF_A, 0x0), 10564 }, 10565 CLASSIC, 10566 { 10567 [0x1c] = 0xaa, [0x1d] = 0x55, 10568 [0x1e] = 0xbb, [0x1f] = 0x66, 10569 [0x20] = 0xcc, [0x21] = 0x77, 10570 [0x22] = 0xdd, [0x23] = 0x88, 10571 [0x24] = 0xee, [0x25] = 0x99, 10572 [0x26] = 0xff, [0x27] = 0xaa, 10573 }, 10574 { {0x40, 0xdd88 } }, 10575 }, 10576 { 10577 "LD_ABS halfword unaligned", 10578 .u.insns = { 10579 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25), 10580 BPF_STMT(BPF_RET | BPF_A, 0x0), 10581 }, 10582 CLASSIC, 10583 { 10584 [0x1c] = 0xaa, [0x1d] = 0x55, 10585 [0x1e] = 0xbb, [0x1f] = 0x66, 10586 [0x20] = 0xcc, [0x21] = 0x77, 10587 [0x22] = 0xdd, [0x23] = 0x88, 10588 [0x24] = 0xee, [0x25] = 0x99, 10589 [0x26] = 0xff, [0x27] = 0xaa, 10590 }, 10591 { {0x40, 0x99ff } }, 10592 }, 10593 { 10594 "LD_ABS halfword positive offset, all ff", 10595 .u.insns = { 10596 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e), 10597 BPF_STMT(BPF_RET | BPF_A, 0x0), 10598 }, 10599 CLASSIC, 10600 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10601 { {0x40, 0xffff } }, 10602 }, 10603 { 10604 "LD_ABS halfword positive offset, out of bounds", 10605 .u.insns = { 10606 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f), 10607 BPF_STMT(BPF_RET | BPF_A, 0x0), 10608 }, 10609 CLASSIC, 10610 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10611 { {0x3f, 0 }, }, 10612 }, 10613 { 10614 "LD_ABS halfword negative offset, out of bounds load", 10615 .u.insns = { 10616 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1), 10617 BPF_STMT(BPF_RET | BPF_A, 0x0), 10618 }, 10619 CLASSIC | FLAG_EXPECTED_FAIL, 10620 .expected_errcode = -EINVAL, 10621 }, 10622 { 10623 "LD_ABS halfword negative offset, in bounds", 10624 .u.insns = { 10625 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e), 10626 BPF_STMT(BPF_RET | BPF_A, 0x0), 10627 }, 10628 CLASSIC, 10629 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10630 { {0x40, 0x1982 }, }, 10631 }, 10632 { 10633 "LD_ABS halfword negative offset, out of bounds", 10634 .u.insns = { 10635 BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e), 10636 BPF_STMT(BPF_RET | BPF_A, 0x0), 10637 }, 10638 CLASSIC, 10639 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10640 { {0x3f, 0 }, }, 10641 }, 10642 { 10643 "LD_ABS word", 10644 .u.insns = { 10645 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c), 10646 BPF_STMT(BPF_RET | BPF_A, 0x0), 10647 }, 10648 CLASSIC, 10649 { 10650 [0x1c] = 0xaa, [0x1d] = 0x55, 10651 [0x1e] = 0xbb, [0x1f] = 0x66, 10652 [0x20] = 0xcc, [0x21] = 0x77, 10653 [0x22] = 0xdd, [0x23] = 0x88, 10654 [0x24] = 0xee, [0x25] = 0x99, 10655 [0x26] = 0xff, [0x27] = 0xaa, 10656 }, 10657 { {0x40, 0xaa55bb66 } }, 10658 }, 10659 { 10660 "LD_ABS word unaligned (addr & 3 == 2)", 10661 .u.insns = { 10662 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22), 10663 BPF_STMT(BPF_RET | BPF_A, 0x0), 10664 }, 10665 CLASSIC, 10666 { 10667 [0x1c] = 0xaa, [0x1d] = 0x55, 10668 [0x1e] = 0xbb, [0x1f] = 0x66, 10669 [0x20] = 0xcc, [0x21] = 0x77, 10670 [0x22] = 0xdd, [0x23] = 0x88, 10671 [0x24] = 0xee, [0x25] = 0x99, 10672 [0x26] = 0xff, [0x27] = 0xaa, 10673 }, 10674 { {0x40, 0xdd88ee99 } }, 10675 }, 10676 { 10677 "LD_ABS word unaligned (addr & 3 == 1)", 10678 .u.insns = { 10679 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21), 10680 BPF_STMT(BPF_RET | BPF_A, 0x0), 10681 }, 10682 CLASSIC, 10683 { 10684 [0x1c] = 0xaa, [0x1d] = 0x55, 10685 [0x1e] = 0xbb, [0x1f] = 0x66, 10686 [0x20] = 0xcc, [0x21] = 0x77, 10687 [0x22] = 0xdd, [0x23] = 0x88, 10688 [0x24] = 0xee, [0x25] = 0x99, 10689 [0x26] = 0xff, [0x27] = 0xaa, 10690 }, 10691 { {0x40, 0x77dd88ee } }, 10692 }, 10693 { 10694 "LD_ABS word unaligned (addr & 3 == 3)", 10695 .u.insns = { 10696 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23), 10697 BPF_STMT(BPF_RET | BPF_A, 0x0), 10698 }, 10699 CLASSIC, 10700 { 10701 [0x1c] = 0xaa, [0x1d] = 0x55, 10702 [0x1e] = 0xbb, [0x1f] = 0x66, 10703 [0x20] = 0xcc, [0x21] = 0x77, 10704 [0x22] = 0xdd, [0x23] = 0x88, 10705 [0x24] = 0xee, [0x25] = 0x99, 10706 [0x26] = 0xff, [0x27] = 0xaa, 10707 }, 10708 { {0x40, 0x88ee99ff } }, 10709 }, 10710 { 10711 "LD_ABS word positive offset, all ff", 10712 .u.insns = { 10713 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c), 10714 BPF_STMT(BPF_RET | BPF_A, 0x0), 10715 }, 10716 CLASSIC, 10717 { [0x3c] = 0xff, [0x3d] = 0xff, [0x3e] = 0xff, [0x3f] = 0xff }, 10718 { {0x40, 0xffffffff } }, 10719 }, 10720 { 10721 "LD_ABS word positive offset, out of bounds", 10722 .u.insns = { 10723 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f), 10724 BPF_STMT(BPF_RET | BPF_A, 0x0), 10725 }, 10726 CLASSIC, 10727 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10728 { {0x3f, 0 }, }, 10729 }, 10730 { 10731 "LD_ABS word negative offset, out of bounds load", 10732 .u.insns = { 10733 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1), 10734 BPF_STMT(BPF_RET | BPF_A, 0x0), 10735 }, 10736 CLASSIC | FLAG_EXPECTED_FAIL, 10737 .expected_errcode = -EINVAL, 10738 }, 10739 { 10740 "LD_ABS word negative offset, in bounds", 10741 .u.insns = { 10742 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c), 10743 BPF_STMT(BPF_RET | BPF_A, 0x0), 10744 }, 10745 CLASSIC, 10746 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10747 { {0x40, 0x25051982 }, }, 10748 }, 10749 { 10750 "LD_ABS word negative offset, out of bounds", 10751 .u.insns = { 10752 BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c), 10753 BPF_STMT(BPF_RET | BPF_A, 0x0), 10754 }, 10755 CLASSIC, 10756 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10757 { {0x3f, 0 }, }, 10758 }, 10759 { 10760 "LDX_MSH standalone, preserved A", 10761 .u.insns = { 10762 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10763 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c), 10764 BPF_STMT(BPF_RET | BPF_A, 0x0), 10765 }, 10766 CLASSIC, 10767 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10768 { {0x40, 0xffeebbaa }, }, 10769 }, 10770 { 10771 "LDX_MSH standalone, preserved A 2", 10772 .u.insns = { 10773 BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63), 10774 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c), 10775 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d), 10776 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e), 10777 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f), 10778 BPF_STMT(BPF_RET | BPF_A, 0x0), 10779 }, 10780 CLASSIC, 10781 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10782 { {0x40, 0x175e9d63 }, }, 10783 }, 10784 { 10785 "LDX_MSH standalone, test result 1", 10786 .u.insns = { 10787 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10788 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c), 10789 BPF_STMT(BPF_MISC | BPF_TXA, 0), 10790 BPF_STMT(BPF_RET | BPF_A, 0x0), 10791 }, 10792 CLASSIC, 10793 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10794 { {0x40, 0x14 }, }, 10795 }, 10796 { 10797 "LDX_MSH standalone, test result 2", 10798 .u.insns = { 10799 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10800 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e), 10801 BPF_STMT(BPF_MISC | BPF_TXA, 0), 10802 BPF_STMT(BPF_RET | BPF_A, 0x0), 10803 }, 10804 CLASSIC, 10805 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10806 { {0x40, 0x24 }, }, 10807 }, 10808 { 10809 "LDX_MSH standalone, negative offset", 10810 .u.insns = { 10811 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10812 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1), 10813 BPF_STMT(BPF_MISC | BPF_TXA, 0), 10814 BPF_STMT(BPF_RET | BPF_A, 0x0), 10815 }, 10816 CLASSIC, 10817 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10818 { {0x40, 0 }, }, 10819 }, 10820 { 10821 "LDX_MSH standalone, negative offset 2", 10822 .u.insns = { 10823 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10824 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e), 10825 BPF_STMT(BPF_MISC | BPF_TXA, 0), 10826 BPF_STMT(BPF_RET | BPF_A, 0x0), 10827 }, 10828 CLASSIC, 10829 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10830 { {0x40, 0x24 }, }, 10831 }, 10832 { 10833 "LDX_MSH standalone, out of bounds", 10834 .u.insns = { 10835 BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa), 10836 BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40), 10837 BPF_STMT(BPF_MISC | BPF_TXA, 0), 10838 BPF_STMT(BPF_RET | BPF_A, 0x0), 10839 }, 10840 CLASSIC, 10841 { [0x3c] = 0x25, [0x3d] = 0x05, [0x3e] = 0x19, [0x3f] = 0x82 }, 10842 { {0x40, 0 }, }, 10843 }, 10844 /* 10845 * verify that the interpreter or JIT correctly sets A and X 10846 * to 0. 10847 */ 10848 { 10849 "ADD default X", 10850 .u.insns = { 10851 /* 10852 * A = 0x42 10853 * A = A + X 10854 * ret A 10855 */ 10856 BPF_STMT(BPF_LD | BPF_IMM, 0x42), 10857 BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0), 10858 BPF_STMT(BPF_RET | BPF_A, 0x0), 10859 }, 10860 CLASSIC | FLAG_NO_DATA, 10861 {}, 10862 { {0x1, 0x42 } }, 10863 }, 10864 { 10865 "ADD default A", 10866 .u.insns = { 10867 /* 10868 * A = A + 0x42 10869 * ret A 10870 */ 10871 BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42), 10872 BPF_STMT(BPF_RET | BPF_A, 0x0), 10873 }, 10874 CLASSIC | FLAG_NO_DATA, 10875 {}, 10876 { {0x1, 0x42 } }, 10877 }, 10878 { 10879 "SUB default X", 10880 .u.insns = { 10881 /* 10882 * A = 0x66 10883 * A = A - X 10884 * ret A 10885 */ 10886 BPF_STMT(BPF_LD | BPF_IMM, 0x66), 10887 BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0), 10888 BPF_STMT(BPF_RET | BPF_A, 0x0), 10889 }, 10890 CLASSIC | FLAG_NO_DATA, 10891 {}, 10892 { {0x1, 0x66 } }, 10893 }, 10894 { 10895 "SUB default A", 10896 .u.insns = { 10897 /* 10898 * A = A - -0x66 10899 * ret A 10900 */ 10901 BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66), 10902 BPF_STMT(BPF_RET | BPF_A, 0x0), 10903 }, 10904 CLASSIC | FLAG_NO_DATA, 10905 {}, 10906 { {0x1, 0x66 } }, 10907 }, 10908 { 10909 "MUL default X", 10910 .u.insns = { 10911 /* 10912 * A = 0x42 10913 * A = A * X 10914 * ret A 10915 */ 10916 BPF_STMT(BPF_LD | BPF_IMM, 0x42), 10917 BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0), 10918 BPF_STMT(BPF_RET | BPF_A, 0x0), 10919 }, 10920 CLASSIC | FLAG_NO_DATA, 10921 {}, 10922 { {0x1, 0x0 } }, 10923 }, 10924 { 10925 "MUL default A", 10926 .u.insns = { 10927 /* 10928 * A = A * 0x66 10929 * ret A 10930 */ 10931 BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66), 10932 BPF_STMT(BPF_RET | BPF_A, 0x0), 10933 }, 10934 CLASSIC | FLAG_NO_DATA, 10935 {}, 10936 { {0x1, 0x0 } }, 10937 }, 10938 { 10939 "DIV default X", 10940 .u.insns = { 10941 /* 10942 * A = 0x42 10943 * A = A / X ; this halt the filter execution if X is 0 10944 * ret 0x42 10945 */ 10946 BPF_STMT(BPF_LD | BPF_IMM, 0x42), 10947 BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0), 10948 BPF_STMT(BPF_RET | BPF_K, 0x42), 10949 }, 10950 CLASSIC | FLAG_NO_DATA, 10951 {}, 10952 { {0x1, 0x0 } }, 10953 }, 10954 { 10955 "DIV default A", 10956 .u.insns = { 10957 /* 10958 * A = A / 1 10959 * ret A 10960 */ 10961 BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1), 10962 BPF_STMT(BPF_RET | BPF_A, 0x0), 10963 }, 10964 CLASSIC | FLAG_NO_DATA, 10965 {}, 10966 { {0x1, 0x0 } }, 10967 }, 10968 { 10969 "MOD default X", 10970 .u.insns = { 10971 /* 10972 * A = 0x42 10973 * A = A mod X ; this halt the filter execution if X is 0 10974 * ret 0x42 10975 */ 10976 BPF_STMT(BPF_LD | BPF_IMM, 0x42), 10977 BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0), 10978 BPF_STMT(BPF_RET | BPF_K, 0x42), 10979 }, 10980 CLASSIC | FLAG_NO_DATA, 10981 {}, 10982 { {0x1, 0x0 } }, 10983 }, 10984 { 10985 "MOD default A", 10986 .u.insns = { 10987 /* 10988 * A = A mod 1 10989 * ret A 10990 */ 10991 BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1), 10992 BPF_STMT(BPF_RET | BPF_A, 0x0), 10993 }, 10994 CLASSIC | FLAG_NO_DATA, 10995 {}, 10996 { {0x1, 0x0 } }, 10997 }, 10998 { 10999 "JMP EQ default A", 11000 .u.insns = { 11001 /* 11002 * cmp A, 0x0, 0, 1 11003 * ret 0x42 11004 * ret 0x66 11005 */ 11006 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1), 11007 BPF_STMT(BPF_RET | BPF_K, 0x42), 11008 BPF_STMT(BPF_RET | BPF_K, 0x66), 11009 }, 11010 CLASSIC | FLAG_NO_DATA, 11011 {}, 11012 { {0x1, 0x42 } }, 11013 }, 11014 { 11015 "JMP EQ default X", 11016 .u.insns = { 11017 /* 11018 * A = 0x0 11019 * cmp A, X, 0, 1 11020 * ret 0x42 11021 * ret 0x66 11022 */ 11023 BPF_STMT(BPF_LD | BPF_IMM, 0x0), 11024 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1), 11025 BPF_STMT(BPF_RET | BPF_K, 0x42), 11026 BPF_STMT(BPF_RET | BPF_K, 0x66), 11027 }, 11028 CLASSIC | FLAG_NO_DATA, 11029 {}, 11030 { {0x1, 0x42 } }, 11031 }, 11032 /* Checking interpreter vs JIT wrt signed extended imms. */ 11033 { 11034 "JNE signed compare, test 1", 11035 .u.insns_int = { 11036 BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12), 11037 BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000), 11038 BPF_MOV64_REG(R2, R1), 11039 BPF_ALU64_REG(BPF_AND, R2, R3), 11040 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11041 BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1), 11042 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11043 BPF_EXIT_INSN(), 11044 }, 11045 INTERNAL, 11046 { }, 11047 { { 0, 1 } }, 11048 }, 11049 { 11050 "JNE signed compare, test 2", 11051 .u.insns_int = { 11052 BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12), 11053 BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000), 11054 BPF_MOV64_REG(R2, R1), 11055 BPF_ALU64_REG(BPF_AND, R2, R3), 11056 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11057 BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1), 11058 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11059 BPF_EXIT_INSN(), 11060 }, 11061 INTERNAL, 11062 { }, 11063 { { 0, 1 } }, 11064 }, 11065 { 11066 "JNE signed compare, test 3", 11067 .u.insns_int = { 11068 BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12), 11069 BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000), 11070 BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000), 11071 BPF_MOV64_REG(R2, R1), 11072 BPF_ALU64_REG(BPF_AND, R2, R3), 11073 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11074 BPF_JMP_REG(BPF_JNE, R2, R4, 1), 11075 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11076 BPF_EXIT_INSN(), 11077 }, 11078 INTERNAL, 11079 { }, 11080 { { 0, 2 } }, 11081 }, 11082 { 11083 "JNE signed compare, test 4", 11084 .u.insns_int = { 11085 BPF_LD_IMM64(R1, -17104896), 11086 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11087 BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1), 11088 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11089 BPF_EXIT_INSN(), 11090 }, 11091 INTERNAL, 11092 { }, 11093 { { 0, 2 } }, 11094 }, 11095 { 11096 "JNE signed compare, test 5", 11097 .u.insns_int = { 11098 BPF_LD_IMM64(R1, 0xfefb0000), 11099 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11100 BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1), 11101 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11102 BPF_EXIT_INSN(), 11103 }, 11104 INTERNAL, 11105 { }, 11106 { { 0, 1 } }, 11107 }, 11108 { 11109 "JNE signed compare, test 6", 11110 .u.insns_int = { 11111 BPF_LD_IMM64(R1, 0x7efb0000), 11112 BPF_ALU32_IMM(BPF_MOV, R0, 1), 11113 BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1), 11114 BPF_ALU32_IMM(BPF_MOV, R0, 2), 11115 BPF_EXIT_INSN(), 11116 }, 11117 INTERNAL, 11118 { }, 11119 { { 0, 2 } }, 11120 }, 11121 { 11122 "JNE signed compare, test 7", 11123 .u.insns = { 11124 BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000), 11125 BPF_STMT(BPF_MISC | BPF_TAX, 0), 11126 BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12), 11127 BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0), 11128 BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0), 11129 BPF_STMT(BPF_RET | BPF_K, 1), 11130 BPF_STMT(BPF_RET | BPF_K, 2), 11131 }, 11132 CLASSIC | FLAG_NO_DATA, 11133 {}, 11134 { { 0, 2 } }, 11135 }, 11136 /* BPF_LDX_MEM with operand aliasing */ 11137 { 11138 "LDX_MEM_B: operand register aliasing", 11139 .u.insns_int = { 11140 BPF_ST_MEM(BPF_B, R10, -8, 123), 11141 BPF_MOV64_REG(R0, R10), 11142 BPF_LDX_MEM(BPF_B, R0, R0, -8), 11143 BPF_EXIT_INSN(), 11144 }, 11145 INTERNAL, 11146 { }, 11147 { { 0, 123 } }, 11148 .stack_depth = 8, 11149 }, 11150 { 11151 "LDX_MEM_H: operand register aliasing", 11152 .u.insns_int = { 11153 BPF_ST_MEM(BPF_H, R10, -8, 12345), 11154 BPF_MOV64_REG(R0, R10), 11155 BPF_LDX_MEM(BPF_H, R0, R0, -8), 11156 BPF_EXIT_INSN(), 11157 }, 11158 INTERNAL, 11159 { }, 11160 { { 0, 12345 } }, 11161 .stack_depth = 8, 11162 }, 11163 { 11164 "LDX_MEM_W: operand register aliasing", 11165 .u.insns_int = { 11166 BPF_ST_MEM(BPF_W, R10, -8, 123456789), 11167 BPF_MOV64_REG(R0, R10), 11168 BPF_LDX_MEM(BPF_W, R0, R0, -8), 11169 BPF_EXIT_INSN(), 11170 }, 11171 INTERNAL, 11172 { }, 11173 { { 0, 123456789 } }, 11174 .stack_depth = 8, 11175 }, 11176 { 11177 "LDX_MEM_DW: operand register aliasing", 11178 .u.insns_int = { 11179 BPF_LD_IMM64(R1, 0x123456789abcdefULL), 11180 BPF_STX_MEM(BPF_DW, R10, R1, -8), 11181 BPF_MOV64_REG(R0, R10), 11182 BPF_LDX_MEM(BPF_DW, R0, R0, -8), 11183 BPF_ALU64_REG(BPF_SUB, R0, R1), 11184 BPF_MOV64_REG(R1, R0), 11185 BPF_ALU64_IMM(BPF_RSH, R1, 32), 11186 BPF_ALU64_REG(BPF_OR, R0, R1), 11187 BPF_EXIT_INSN(), 11188 }, 11189 INTERNAL, 11190 { }, 11191 { { 0, 0 } }, 11192 .stack_depth = 8, 11193 }, 11194 /* 11195 * Register (non-)clobbering tests for the case where a JIT implements 11196 * complex ALU or ATOMIC operations via function calls. If so, the 11197 * function call must be transparent to the eBPF registers. The JIT 11198 * must therefore save and restore relevant registers across the call. 11199 * The following tests check that the eBPF registers retain their 11200 * values after such an operation. Mainly intended for complex ALU 11201 * and atomic operation, but we run it for all. You never know... 11202 * 11203 * Note that each operations should be tested twice with different 11204 * destinations, to check preservation for all registers. 11205 */ 11206 #define BPF_TEST_CLOBBER_ALU(alu, op, dst, src) \ 11207 { \ 11208 #alu "_" #op " to " #dst ": no clobbering", \ 11209 .u.insns_int = { \ 11210 BPF_ALU64_IMM(BPF_MOV, R0, R0), \ 11211 BPF_ALU64_IMM(BPF_MOV, R1, R1), \ 11212 BPF_ALU64_IMM(BPF_MOV, R2, R2), \ 11213 BPF_ALU64_IMM(BPF_MOV, R3, R3), \ 11214 BPF_ALU64_IMM(BPF_MOV, R4, R4), \ 11215 BPF_ALU64_IMM(BPF_MOV, R5, R5), \ 11216 BPF_ALU64_IMM(BPF_MOV, R6, R6), \ 11217 BPF_ALU64_IMM(BPF_MOV, R7, R7), \ 11218 BPF_ALU64_IMM(BPF_MOV, R8, R8), \ 11219 BPF_ALU64_IMM(BPF_MOV, R9, R9), \ 11220 BPF_##alu(BPF_ ##op, dst, src), \ 11221 BPF_ALU32_IMM(BPF_MOV, dst, dst), \ 11222 BPF_JMP_IMM(BPF_JNE, R0, R0, 10), \ 11223 BPF_JMP_IMM(BPF_JNE, R1, R1, 9), \ 11224 BPF_JMP_IMM(BPF_JNE, R2, R2, 8), \ 11225 BPF_JMP_IMM(BPF_JNE, R3, R3, 7), \ 11226 BPF_JMP_IMM(BPF_JNE, R4, R4, 6), \ 11227 BPF_JMP_IMM(BPF_JNE, R5, R5, 5), \ 11228 BPF_JMP_IMM(BPF_JNE, R6, R6, 4), \ 11229 BPF_JMP_IMM(BPF_JNE, R7, R7, 3), \ 11230 BPF_JMP_IMM(BPF_JNE, R8, R8, 2), \ 11231 BPF_JMP_IMM(BPF_JNE, R9, R9, 1), \ 11232 BPF_ALU64_IMM(BPF_MOV, R0, 1), \ 11233 BPF_EXIT_INSN(), \ 11234 }, \ 11235 INTERNAL, \ 11236 { }, \ 11237 { { 0, 1 } } \ 11238 } 11239 /* ALU64 operations, register clobbering */ 11240 BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R8, 123456789), 11241 BPF_TEST_CLOBBER_ALU(ALU64_IMM, AND, R9, 123456789), 11242 BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R8, 123456789), 11243 BPF_TEST_CLOBBER_ALU(ALU64_IMM, OR, R9, 123456789), 11244 BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R8, 123456789), 11245 BPF_TEST_CLOBBER_ALU(ALU64_IMM, XOR, R9, 123456789), 11246 BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R8, 12), 11247 BPF_TEST_CLOBBER_ALU(ALU64_IMM, LSH, R9, 12), 11248 BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R8, 12), 11249 BPF_TEST_CLOBBER_ALU(ALU64_IMM, RSH, R9, 12), 11250 BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R8, 12), 11251 BPF_TEST_CLOBBER_ALU(ALU64_IMM, ARSH, R9, 12), 11252 BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R8, 123456789), 11253 BPF_TEST_CLOBBER_ALU(ALU64_IMM, ADD, R9, 123456789), 11254 BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R8, 123456789), 11255 BPF_TEST_CLOBBER_ALU(ALU64_IMM, SUB, R9, 123456789), 11256 BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R8, 123456789), 11257 BPF_TEST_CLOBBER_ALU(ALU64_IMM, MUL, R9, 123456789), 11258 BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R8, 123456789), 11259 BPF_TEST_CLOBBER_ALU(ALU64_IMM, DIV, R9, 123456789), 11260 BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R8, 123456789), 11261 BPF_TEST_CLOBBER_ALU(ALU64_IMM, MOD, R9, 123456789), 11262 /* ALU32 immediate operations, register clobbering */ 11263 BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R8, 123456789), 11264 BPF_TEST_CLOBBER_ALU(ALU32_IMM, AND, R9, 123456789), 11265 BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R8, 123456789), 11266 BPF_TEST_CLOBBER_ALU(ALU32_IMM, OR, R9, 123456789), 11267 BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R8, 123456789), 11268 BPF_TEST_CLOBBER_ALU(ALU32_IMM, XOR, R9, 123456789), 11269 BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R8, 12), 11270 BPF_TEST_CLOBBER_ALU(ALU32_IMM, LSH, R9, 12), 11271 BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R8, 12), 11272 BPF_TEST_CLOBBER_ALU(ALU32_IMM, RSH, R9, 12), 11273 BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R8, 12), 11274 BPF_TEST_CLOBBER_ALU(ALU32_IMM, ARSH, R9, 12), 11275 BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R8, 123456789), 11276 BPF_TEST_CLOBBER_ALU(ALU32_IMM, ADD, R9, 123456789), 11277 BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R8, 123456789), 11278 BPF_TEST_CLOBBER_ALU(ALU32_IMM, SUB, R9, 123456789), 11279 BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R8, 123456789), 11280 BPF_TEST_CLOBBER_ALU(ALU32_IMM, MUL, R9, 123456789), 11281 BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R8, 123456789), 11282 BPF_TEST_CLOBBER_ALU(ALU32_IMM, DIV, R9, 123456789), 11283 BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R8, 123456789), 11284 BPF_TEST_CLOBBER_ALU(ALU32_IMM, MOD, R9, 123456789), 11285 /* ALU64 register operations, register clobbering */ 11286 BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R8, R1), 11287 BPF_TEST_CLOBBER_ALU(ALU64_REG, AND, R9, R1), 11288 BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R8, R1), 11289 BPF_TEST_CLOBBER_ALU(ALU64_REG, OR, R9, R1), 11290 BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R8, R1), 11291 BPF_TEST_CLOBBER_ALU(ALU64_REG, XOR, R9, R1), 11292 BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R8, R1), 11293 BPF_TEST_CLOBBER_ALU(ALU64_REG, LSH, R9, R1), 11294 BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R8, R1), 11295 BPF_TEST_CLOBBER_ALU(ALU64_REG, RSH, R9, R1), 11296 BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R8, R1), 11297 BPF_TEST_CLOBBER_ALU(ALU64_REG, ARSH, R9, R1), 11298 BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R8, R1), 11299 BPF_TEST_CLOBBER_ALU(ALU64_REG, ADD, R9, R1), 11300 BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R8, R1), 11301 BPF_TEST_CLOBBER_ALU(ALU64_REG, SUB, R9, R1), 11302 BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R8, R1), 11303 BPF_TEST_CLOBBER_ALU(ALU64_REG, MUL, R9, R1), 11304 BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R8, R1), 11305 BPF_TEST_CLOBBER_ALU(ALU64_REG, DIV, R9, R1), 11306 BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R8, R1), 11307 BPF_TEST_CLOBBER_ALU(ALU64_REG, MOD, R9, R1), 11308 /* ALU32 register operations, register clobbering */ 11309 BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R8, R1), 11310 BPF_TEST_CLOBBER_ALU(ALU32_REG, AND, R9, R1), 11311 BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R8, R1), 11312 BPF_TEST_CLOBBER_ALU(ALU32_REG, OR, R9, R1), 11313 BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R8, R1), 11314 BPF_TEST_CLOBBER_ALU(ALU32_REG, XOR, R9, R1), 11315 BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R8, R1), 11316 BPF_TEST_CLOBBER_ALU(ALU32_REG, LSH, R9, R1), 11317 BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R8, R1), 11318 BPF_TEST_CLOBBER_ALU(ALU32_REG, RSH, R9, R1), 11319 BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R8, R1), 11320 BPF_TEST_CLOBBER_ALU(ALU32_REG, ARSH, R9, R1), 11321 BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R8, R1), 11322 BPF_TEST_CLOBBER_ALU(ALU32_REG, ADD, R9, R1), 11323 BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R8, R1), 11324 BPF_TEST_CLOBBER_ALU(ALU32_REG, SUB, R9, R1), 11325 BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R8, R1), 11326 BPF_TEST_CLOBBER_ALU(ALU32_REG, MUL, R9, R1), 11327 BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R8, R1), 11328 BPF_TEST_CLOBBER_ALU(ALU32_REG, DIV, R9, R1), 11329 BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R8, R1), 11330 BPF_TEST_CLOBBER_ALU(ALU32_REG, MOD, R9, R1), 11331 #undef BPF_TEST_CLOBBER_ALU 11332 #define BPF_TEST_CLOBBER_ATOMIC(width, op) \ 11333 { \ 11334 "Atomic_" #width " " #op ": no clobbering", \ 11335 .u.insns_int = { \ 11336 BPF_ALU64_IMM(BPF_MOV, R0, 0), \ 11337 BPF_ALU64_IMM(BPF_MOV, R1, 1), \ 11338 BPF_ALU64_IMM(BPF_MOV, R2, 2), \ 11339 BPF_ALU64_IMM(BPF_MOV, R3, 3), \ 11340 BPF_ALU64_IMM(BPF_MOV, R4, 4), \ 11341 BPF_ALU64_IMM(BPF_MOV, R5, 5), \ 11342 BPF_ALU64_IMM(BPF_MOV, R6, 6), \ 11343 BPF_ALU64_IMM(BPF_MOV, R7, 7), \ 11344 BPF_ALU64_IMM(BPF_MOV, R8, 8), \ 11345 BPF_ALU64_IMM(BPF_MOV, R9, 9), \ 11346 BPF_ST_MEM(width, R10, -8, \ 11347 (op) == BPF_CMPXCHG ? 0 : \ 11348 (op) & BPF_FETCH ? 1 : 0), \ 11349 BPF_ATOMIC_OP(width, op, R10, R1, -8), \ 11350 BPF_JMP_IMM(BPF_JNE, R0, 0, 10), \ 11351 BPF_JMP_IMM(BPF_JNE, R1, 1, 9), \ 11352 BPF_JMP_IMM(BPF_JNE, R2, 2, 8), \ 11353 BPF_JMP_IMM(BPF_JNE, R3, 3, 7), \ 11354 BPF_JMP_IMM(BPF_JNE, R4, 4, 6), \ 11355 BPF_JMP_IMM(BPF_JNE, R5, 5, 5), \ 11356 BPF_JMP_IMM(BPF_JNE, R6, 6, 4), \ 11357 BPF_JMP_IMM(BPF_JNE, R7, 7, 3), \ 11358 BPF_JMP_IMM(BPF_JNE, R8, 8, 2), \ 11359 BPF_JMP_IMM(BPF_JNE, R9, 9, 1), \ 11360 BPF_ALU64_IMM(BPF_MOV, R0, 1), \ 11361 BPF_EXIT_INSN(), \ 11362 }, \ 11363 INTERNAL, \ 11364 { }, \ 11365 { { 0, 1 } }, \ 11366 .stack_depth = 8, \ 11367 } 11368 /* 64-bit atomic operations, register clobbering */ 11369 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD), 11370 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND), 11371 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR), 11372 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR), 11373 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_ADD | BPF_FETCH), 11374 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_AND | BPF_FETCH), 11375 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_OR | BPF_FETCH), 11376 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XOR | BPF_FETCH), 11377 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_XCHG), 11378 BPF_TEST_CLOBBER_ATOMIC(BPF_DW, BPF_CMPXCHG), 11379 /* 32-bit atomic operations, register clobbering */ 11380 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD), 11381 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND), 11382 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR), 11383 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR), 11384 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_ADD | BPF_FETCH), 11385 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_AND | BPF_FETCH), 11386 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_OR | BPF_FETCH), 11387 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XOR | BPF_FETCH), 11388 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_XCHG), 11389 BPF_TEST_CLOBBER_ATOMIC(BPF_W, BPF_CMPXCHG), 11390 #undef BPF_TEST_CLOBBER_ATOMIC 11391 /* Checking that ALU32 src is not zero extended in place */ 11392 #define BPF_ALU32_SRC_ZEXT(op) \ 11393 { \ 11394 "ALU32_" #op "_X: src preserved in zext", \ 11395 .u.insns_int = { \ 11396 BPF_LD_IMM64(R1, 0x0123456789acbdefULL),\ 11397 BPF_LD_IMM64(R2, 0xfedcba9876543210ULL),\ 11398 BPF_ALU64_REG(BPF_MOV, R0, R1), \ 11399 BPF_ALU32_REG(BPF_##op, R2, R1), \ 11400 BPF_ALU64_REG(BPF_SUB, R0, R1), \ 11401 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11402 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 11403 BPF_ALU64_REG(BPF_OR, R0, R1), \ 11404 BPF_EXIT_INSN(), \ 11405 }, \ 11406 INTERNAL, \ 11407 { }, \ 11408 { { 0, 0 } }, \ 11409 } 11410 BPF_ALU32_SRC_ZEXT(MOV), 11411 BPF_ALU32_SRC_ZEXT(AND), 11412 BPF_ALU32_SRC_ZEXT(OR), 11413 BPF_ALU32_SRC_ZEXT(XOR), 11414 BPF_ALU32_SRC_ZEXT(ADD), 11415 BPF_ALU32_SRC_ZEXT(SUB), 11416 BPF_ALU32_SRC_ZEXT(MUL), 11417 BPF_ALU32_SRC_ZEXT(DIV), 11418 BPF_ALU32_SRC_ZEXT(MOD), 11419 #undef BPF_ALU32_SRC_ZEXT 11420 /* Checking that ATOMIC32 src is not zero extended in place */ 11421 #define BPF_ATOMIC32_SRC_ZEXT(op) \ 11422 { \ 11423 "ATOMIC_W_" #op ": src preserved in zext", \ 11424 .u.insns_int = { \ 11425 BPF_LD_IMM64(R0, 0x0123456789acbdefULL), \ 11426 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11427 BPF_ST_MEM(BPF_W, R10, -4, 0), \ 11428 BPF_ATOMIC_OP(BPF_W, BPF_##op, R10, R1, -4), \ 11429 BPF_ALU64_REG(BPF_SUB, R0, R1), \ 11430 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11431 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 11432 BPF_ALU64_REG(BPF_OR, R0, R1), \ 11433 BPF_EXIT_INSN(), \ 11434 }, \ 11435 INTERNAL, \ 11436 { }, \ 11437 { { 0, 0 } }, \ 11438 .stack_depth = 8, \ 11439 } 11440 BPF_ATOMIC32_SRC_ZEXT(ADD), 11441 BPF_ATOMIC32_SRC_ZEXT(AND), 11442 BPF_ATOMIC32_SRC_ZEXT(OR), 11443 BPF_ATOMIC32_SRC_ZEXT(XOR), 11444 #undef BPF_ATOMIC32_SRC_ZEXT 11445 /* Checking that CMPXCHG32 src is not zero extended in place */ 11446 { 11447 "ATOMIC_W_CMPXCHG: src preserved in zext", 11448 .u.insns_int = { 11449 BPF_LD_IMM64(R1, 0x0123456789acbdefULL), 11450 BPF_ALU64_REG(BPF_MOV, R2, R1), 11451 BPF_ALU64_REG(BPF_MOV, R0, 0), 11452 BPF_ST_MEM(BPF_W, R10, -4, 0), 11453 BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, R10, R1, -4), 11454 BPF_ALU64_REG(BPF_SUB, R1, R2), 11455 BPF_ALU64_REG(BPF_MOV, R2, R1), 11456 BPF_ALU64_IMM(BPF_RSH, R2, 32), 11457 BPF_ALU64_REG(BPF_OR, R1, R2), 11458 BPF_ALU64_REG(BPF_MOV, R0, R1), 11459 BPF_EXIT_INSN(), 11460 }, 11461 INTERNAL, 11462 { }, 11463 { { 0, 0 } }, 11464 .stack_depth = 8, 11465 }, 11466 /* Checking that JMP32 immediate src is not zero extended in place */ 11467 #define BPF_JMP32_IMM_ZEXT(op) \ 11468 { \ 11469 "JMP32_" #op "_K: operand preserved in zext", \ 11470 .u.insns_int = { \ 11471 BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\ 11472 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11473 BPF_JMP32_IMM(BPF_##op, R0, 1234, 1), \ 11474 BPF_JMP_A(0), /* Nop */ \ 11475 BPF_ALU64_REG(BPF_SUB, R0, R1), \ 11476 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11477 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 11478 BPF_ALU64_REG(BPF_OR, R0, R1), \ 11479 BPF_EXIT_INSN(), \ 11480 }, \ 11481 INTERNAL, \ 11482 { }, \ 11483 { { 0, 0 } }, \ 11484 } 11485 BPF_JMP32_IMM_ZEXT(JEQ), 11486 BPF_JMP32_IMM_ZEXT(JNE), 11487 BPF_JMP32_IMM_ZEXT(JSET), 11488 BPF_JMP32_IMM_ZEXT(JGT), 11489 BPF_JMP32_IMM_ZEXT(JGE), 11490 BPF_JMP32_IMM_ZEXT(JLT), 11491 BPF_JMP32_IMM_ZEXT(JLE), 11492 BPF_JMP32_IMM_ZEXT(JSGT), 11493 BPF_JMP32_IMM_ZEXT(JSGE), 11494 BPF_JMP32_IMM_ZEXT(JSGT), 11495 BPF_JMP32_IMM_ZEXT(JSLT), 11496 BPF_JMP32_IMM_ZEXT(JSLE), 11497 #undef BPF_JMP2_IMM_ZEXT 11498 /* Checking that JMP32 dst & src are not zero extended in place */ 11499 #define BPF_JMP32_REG_ZEXT(op) \ 11500 { \ 11501 "JMP32_" #op "_X: operands preserved in zext", \ 11502 .u.insns_int = { \ 11503 BPF_LD_IMM64(R0, 0x0123456789acbdefULL),\ 11504 BPF_LD_IMM64(R1, 0xfedcba9876543210ULL),\ 11505 BPF_ALU64_REG(BPF_MOV, R2, R0), \ 11506 BPF_ALU64_REG(BPF_MOV, R3, R1), \ 11507 BPF_JMP32_IMM(BPF_##op, R0, R1, 1), \ 11508 BPF_JMP_A(0), /* Nop */ \ 11509 BPF_ALU64_REG(BPF_SUB, R0, R2), \ 11510 BPF_ALU64_REG(BPF_SUB, R1, R3), \ 11511 BPF_ALU64_REG(BPF_OR, R0, R1), \ 11512 BPF_ALU64_REG(BPF_MOV, R1, R0), \ 11513 BPF_ALU64_IMM(BPF_RSH, R1, 32), \ 11514 BPF_ALU64_REG(BPF_OR, R0, R1), \ 11515 BPF_EXIT_INSN(), \ 11516 }, \ 11517 INTERNAL, \ 11518 { }, \ 11519 { { 0, 0 } }, \ 11520 } 11521 BPF_JMP32_REG_ZEXT(JEQ), 11522 BPF_JMP32_REG_ZEXT(JNE), 11523 BPF_JMP32_REG_ZEXT(JSET), 11524 BPF_JMP32_REG_ZEXT(JGT), 11525 BPF_JMP32_REG_ZEXT(JGE), 11526 BPF_JMP32_REG_ZEXT(JLT), 11527 BPF_JMP32_REG_ZEXT(JLE), 11528 BPF_JMP32_REG_ZEXT(JSGT), 11529 BPF_JMP32_REG_ZEXT(JSGE), 11530 BPF_JMP32_REG_ZEXT(JSGT), 11531 BPF_JMP32_REG_ZEXT(JSLT), 11532 BPF_JMP32_REG_ZEXT(JSLE), 11533 #undef BPF_JMP2_REG_ZEXT 11534 /* ALU64 K register combinations */ 11535 { 11536 "ALU64_MOV_K: registers", 11537 { }, 11538 INTERNAL, 11539 { }, 11540 { { 0, 1 } }, 11541 .fill_helper = bpf_fill_alu64_mov_imm_regs, 11542 }, 11543 { 11544 "ALU64_AND_K: registers", 11545 { }, 11546 INTERNAL, 11547 { }, 11548 { { 0, 1 } }, 11549 .fill_helper = bpf_fill_alu64_and_imm_regs, 11550 }, 11551 { 11552 "ALU64_OR_K: registers", 11553 { }, 11554 INTERNAL, 11555 { }, 11556 { { 0, 1 } }, 11557 .fill_helper = bpf_fill_alu64_or_imm_regs, 11558 }, 11559 { 11560 "ALU64_XOR_K: registers", 11561 { }, 11562 INTERNAL, 11563 { }, 11564 { { 0, 1 } }, 11565 .fill_helper = bpf_fill_alu64_xor_imm_regs, 11566 }, 11567 { 11568 "ALU64_LSH_K: registers", 11569 { }, 11570 INTERNAL, 11571 { }, 11572 { { 0, 1 } }, 11573 .fill_helper = bpf_fill_alu64_lsh_imm_regs, 11574 }, 11575 { 11576 "ALU64_RSH_K: registers", 11577 { }, 11578 INTERNAL, 11579 { }, 11580 { { 0, 1 } }, 11581 .fill_helper = bpf_fill_alu64_rsh_imm_regs, 11582 }, 11583 { 11584 "ALU64_ARSH_K: registers", 11585 { }, 11586 INTERNAL, 11587 { }, 11588 { { 0, 1 } }, 11589 .fill_helper = bpf_fill_alu64_arsh_imm_regs, 11590 }, 11591 { 11592 "ALU64_ADD_K: registers", 11593 { }, 11594 INTERNAL, 11595 { }, 11596 { { 0, 1 } }, 11597 .fill_helper = bpf_fill_alu64_add_imm_regs, 11598 }, 11599 { 11600 "ALU64_SUB_K: registers", 11601 { }, 11602 INTERNAL, 11603 { }, 11604 { { 0, 1 } }, 11605 .fill_helper = bpf_fill_alu64_sub_imm_regs, 11606 }, 11607 { 11608 "ALU64_MUL_K: registers", 11609 { }, 11610 INTERNAL, 11611 { }, 11612 { { 0, 1 } }, 11613 .fill_helper = bpf_fill_alu64_mul_imm_regs, 11614 }, 11615 { 11616 "ALU64_DIV_K: registers", 11617 { }, 11618 INTERNAL, 11619 { }, 11620 { { 0, 1 } }, 11621 .fill_helper = bpf_fill_alu64_div_imm_regs, 11622 }, 11623 { 11624 "ALU64_MOD_K: registers", 11625 { }, 11626 INTERNAL, 11627 { }, 11628 { { 0, 1 } }, 11629 .fill_helper = bpf_fill_alu64_mod_imm_regs, 11630 }, 11631 /* ALU32 K registers */ 11632 { 11633 "ALU32_MOV_K: registers", 11634 { }, 11635 INTERNAL, 11636 { }, 11637 { { 0, 1 } }, 11638 .fill_helper = bpf_fill_alu32_mov_imm_regs, 11639 }, 11640 { 11641 "ALU32_AND_K: registers", 11642 { }, 11643 INTERNAL, 11644 { }, 11645 { { 0, 1 } }, 11646 .fill_helper = bpf_fill_alu32_and_imm_regs, 11647 }, 11648 { 11649 "ALU32_OR_K: registers", 11650 { }, 11651 INTERNAL, 11652 { }, 11653 { { 0, 1 } }, 11654 .fill_helper = bpf_fill_alu32_or_imm_regs, 11655 }, 11656 { 11657 "ALU32_XOR_K: registers", 11658 { }, 11659 INTERNAL, 11660 { }, 11661 { { 0, 1 } }, 11662 .fill_helper = bpf_fill_alu32_xor_imm_regs, 11663 }, 11664 { 11665 "ALU32_LSH_K: registers", 11666 { }, 11667 INTERNAL, 11668 { }, 11669 { { 0, 1 } }, 11670 .fill_helper = bpf_fill_alu32_lsh_imm_regs, 11671 }, 11672 { 11673 "ALU32_RSH_K: registers", 11674 { }, 11675 INTERNAL, 11676 { }, 11677 { { 0, 1 } }, 11678 .fill_helper = bpf_fill_alu32_rsh_imm_regs, 11679 }, 11680 { 11681 "ALU32_ARSH_K: registers", 11682 { }, 11683 INTERNAL, 11684 { }, 11685 { { 0, 1 } }, 11686 .fill_helper = bpf_fill_alu32_arsh_imm_regs, 11687 }, 11688 { 11689 "ALU32_ADD_K: registers", 11690 { }, 11691 INTERNAL, 11692 { }, 11693 { { 0, 1 } }, 11694 .fill_helper = bpf_fill_alu32_add_imm_regs, 11695 }, 11696 { 11697 "ALU32_SUB_K: registers", 11698 { }, 11699 INTERNAL, 11700 { }, 11701 { { 0, 1 } }, 11702 .fill_helper = bpf_fill_alu32_sub_imm_regs, 11703 }, 11704 { 11705 "ALU32_MUL_K: registers", 11706 { }, 11707 INTERNAL, 11708 { }, 11709 { { 0, 1 } }, 11710 .fill_helper = bpf_fill_alu32_mul_imm_regs, 11711 }, 11712 { 11713 "ALU32_DIV_K: registers", 11714 { }, 11715 INTERNAL, 11716 { }, 11717 { { 0, 1 } }, 11718 .fill_helper = bpf_fill_alu32_div_imm_regs, 11719 }, 11720 { 11721 "ALU32_MOD_K: registers", 11722 { }, 11723 INTERNAL, 11724 { }, 11725 { { 0, 1 } }, 11726 .fill_helper = bpf_fill_alu32_mod_imm_regs, 11727 }, 11728 /* ALU64 X register combinations */ 11729 { 11730 "ALU64_MOV_X: register combinations", 11731 { }, 11732 INTERNAL, 11733 { }, 11734 { { 0, 1 } }, 11735 .fill_helper = bpf_fill_alu64_mov_reg_pairs, 11736 }, 11737 { 11738 "ALU64_AND_X: register combinations", 11739 { }, 11740 INTERNAL, 11741 { }, 11742 { { 0, 1 } }, 11743 .fill_helper = bpf_fill_alu64_and_reg_pairs, 11744 }, 11745 { 11746 "ALU64_OR_X: register combinations", 11747 { }, 11748 INTERNAL, 11749 { }, 11750 { { 0, 1 } }, 11751 .fill_helper = bpf_fill_alu64_or_reg_pairs, 11752 }, 11753 { 11754 "ALU64_XOR_X: register combinations", 11755 { }, 11756 INTERNAL, 11757 { }, 11758 { { 0, 1 } }, 11759 .fill_helper = bpf_fill_alu64_xor_reg_pairs, 11760 }, 11761 { 11762 "ALU64_LSH_X: register combinations", 11763 { }, 11764 INTERNAL, 11765 { }, 11766 { { 0, 1 } }, 11767 .fill_helper = bpf_fill_alu64_lsh_reg_pairs, 11768 }, 11769 { 11770 "ALU64_RSH_X: register combinations", 11771 { }, 11772 INTERNAL, 11773 { }, 11774 { { 0, 1 } }, 11775 .fill_helper = bpf_fill_alu64_rsh_reg_pairs, 11776 }, 11777 { 11778 "ALU64_ARSH_X: register combinations", 11779 { }, 11780 INTERNAL, 11781 { }, 11782 { { 0, 1 } }, 11783 .fill_helper = bpf_fill_alu64_arsh_reg_pairs, 11784 }, 11785 { 11786 "ALU64_ADD_X: register combinations", 11787 { }, 11788 INTERNAL, 11789 { }, 11790 { { 0, 1 } }, 11791 .fill_helper = bpf_fill_alu64_add_reg_pairs, 11792 }, 11793 { 11794 "ALU64_SUB_X: register combinations", 11795 { }, 11796 INTERNAL, 11797 { }, 11798 { { 0, 1 } }, 11799 .fill_helper = bpf_fill_alu64_sub_reg_pairs, 11800 }, 11801 { 11802 "ALU64_MUL_X: register combinations", 11803 { }, 11804 INTERNAL, 11805 { }, 11806 { { 0, 1 } }, 11807 .fill_helper = bpf_fill_alu64_mul_reg_pairs, 11808 }, 11809 { 11810 "ALU64_DIV_X: register combinations", 11811 { }, 11812 INTERNAL, 11813 { }, 11814 { { 0, 1 } }, 11815 .fill_helper = bpf_fill_alu64_div_reg_pairs, 11816 }, 11817 { 11818 "ALU64_MOD_X: register combinations", 11819 { }, 11820 INTERNAL, 11821 { }, 11822 { { 0, 1 } }, 11823 .fill_helper = bpf_fill_alu64_mod_reg_pairs, 11824 }, 11825 /* ALU32 X register combinations */ 11826 { 11827 "ALU32_MOV_X: register combinations", 11828 { }, 11829 INTERNAL, 11830 { }, 11831 { { 0, 1 } }, 11832 .fill_helper = bpf_fill_alu32_mov_reg_pairs, 11833 }, 11834 { 11835 "ALU32_AND_X: register combinations", 11836 { }, 11837 INTERNAL, 11838 { }, 11839 { { 0, 1 } }, 11840 .fill_helper = bpf_fill_alu32_and_reg_pairs, 11841 }, 11842 { 11843 "ALU32_OR_X: register combinations", 11844 { }, 11845 INTERNAL, 11846 { }, 11847 { { 0, 1 } }, 11848 .fill_helper = bpf_fill_alu32_or_reg_pairs, 11849 }, 11850 { 11851 "ALU32_XOR_X: register combinations", 11852 { }, 11853 INTERNAL, 11854 { }, 11855 { { 0, 1 } }, 11856 .fill_helper = bpf_fill_alu32_xor_reg_pairs, 11857 }, 11858 { 11859 "ALU32_LSH_X: register combinations", 11860 { }, 11861 INTERNAL, 11862 { }, 11863 { { 0, 1 } }, 11864 .fill_helper = bpf_fill_alu32_lsh_reg_pairs, 11865 }, 11866 { 11867 "ALU32_RSH_X: register combinations", 11868 { }, 11869 INTERNAL, 11870 { }, 11871 { { 0, 1 } }, 11872 .fill_helper = bpf_fill_alu32_rsh_reg_pairs, 11873 }, 11874 { 11875 "ALU32_ARSH_X: register combinations", 11876 { }, 11877 INTERNAL, 11878 { }, 11879 { { 0, 1 } }, 11880 .fill_helper = bpf_fill_alu32_arsh_reg_pairs, 11881 }, 11882 { 11883 "ALU32_ADD_X: register combinations", 11884 { }, 11885 INTERNAL, 11886 { }, 11887 { { 0, 1 } }, 11888 .fill_helper = bpf_fill_alu32_add_reg_pairs, 11889 }, 11890 { 11891 "ALU32_SUB_X: register combinations", 11892 { }, 11893 INTERNAL, 11894 { }, 11895 { { 0, 1 } }, 11896 .fill_helper = bpf_fill_alu32_sub_reg_pairs, 11897 }, 11898 { 11899 "ALU32_MUL_X: register combinations", 11900 { }, 11901 INTERNAL, 11902 { }, 11903 { { 0, 1 } }, 11904 .fill_helper = bpf_fill_alu32_mul_reg_pairs, 11905 }, 11906 { 11907 "ALU32_DIV_X: register combinations", 11908 { }, 11909 INTERNAL, 11910 { }, 11911 { { 0, 1 } }, 11912 .fill_helper = bpf_fill_alu32_div_reg_pairs, 11913 }, 11914 { 11915 "ALU32_MOD_X register combinations", 11916 { }, 11917 INTERNAL, 11918 { }, 11919 { { 0, 1 } }, 11920 .fill_helper = bpf_fill_alu32_mod_reg_pairs, 11921 }, 11922 /* Exhaustive test of ALU64 shift operations */ 11923 { 11924 "ALU64_LSH_K: all shift values", 11925 { }, 11926 INTERNAL | FLAG_NO_DATA, 11927 { }, 11928 { { 0, 1 } }, 11929 .fill_helper = bpf_fill_alu64_lsh_imm, 11930 }, 11931 { 11932 "ALU64_RSH_K: all shift values", 11933 { }, 11934 INTERNAL | FLAG_NO_DATA, 11935 { }, 11936 { { 0, 1 } }, 11937 .fill_helper = bpf_fill_alu64_rsh_imm, 11938 }, 11939 { 11940 "ALU64_ARSH_K: all shift values", 11941 { }, 11942 INTERNAL | FLAG_NO_DATA, 11943 { }, 11944 { { 0, 1 } }, 11945 .fill_helper = bpf_fill_alu64_arsh_imm, 11946 }, 11947 { 11948 "ALU64_LSH_X: all shift values", 11949 { }, 11950 INTERNAL | FLAG_NO_DATA, 11951 { }, 11952 { { 0, 1 } }, 11953 .fill_helper = bpf_fill_alu64_lsh_reg, 11954 }, 11955 { 11956 "ALU64_RSH_X: all shift values", 11957 { }, 11958 INTERNAL | FLAG_NO_DATA, 11959 { }, 11960 { { 0, 1 } }, 11961 .fill_helper = bpf_fill_alu64_rsh_reg, 11962 }, 11963 { 11964 "ALU64_ARSH_X: all shift values", 11965 { }, 11966 INTERNAL | FLAG_NO_DATA, 11967 { }, 11968 { { 0, 1 } }, 11969 .fill_helper = bpf_fill_alu64_arsh_reg, 11970 }, 11971 /* Exhaustive test of ALU32 shift operations */ 11972 { 11973 "ALU32_LSH_K: all shift values", 11974 { }, 11975 INTERNAL | FLAG_NO_DATA, 11976 { }, 11977 { { 0, 1 } }, 11978 .fill_helper = bpf_fill_alu32_lsh_imm, 11979 }, 11980 { 11981 "ALU32_RSH_K: all shift values", 11982 { }, 11983 INTERNAL | FLAG_NO_DATA, 11984 { }, 11985 { { 0, 1 } }, 11986 .fill_helper = bpf_fill_alu32_rsh_imm, 11987 }, 11988 { 11989 "ALU32_ARSH_K: all shift values", 11990 { }, 11991 INTERNAL | FLAG_NO_DATA, 11992 { }, 11993 { { 0, 1 } }, 11994 .fill_helper = bpf_fill_alu32_arsh_imm, 11995 }, 11996 { 11997 "ALU32_LSH_X: all shift values", 11998 { }, 11999 INTERNAL | FLAG_NO_DATA, 12000 { }, 12001 { { 0, 1 } }, 12002 .fill_helper = bpf_fill_alu32_lsh_reg, 12003 }, 12004 { 12005 "ALU32_RSH_X: all shift values", 12006 { }, 12007 INTERNAL | FLAG_NO_DATA, 12008 { }, 12009 { { 0, 1 } }, 12010 .fill_helper = bpf_fill_alu32_rsh_reg, 12011 }, 12012 { 12013 "ALU32_ARSH_X: all shift values", 12014 { }, 12015 INTERNAL | FLAG_NO_DATA, 12016 { }, 12017 { { 0, 1 } }, 12018 .fill_helper = bpf_fill_alu32_arsh_reg, 12019 }, 12020 /* 12021 * Exhaustive test of ALU64 shift operations when 12022 * source and destination register are the same. 12023 */ 12024 { 12025 "ALU64_LSH_X: all shift values with the same register", 12026 { }, 12027 INTERNAL | FLAG_NO_DATA, 12028 { }, 12029 { { 0, 1 } }, 12030 .fill_helper = bpf_fill_alu64_lsh_same_reg, 12031 }, 12032 { 12033 "ALU64_RSH_X: all shift values with the same register", 12034 { }, 12035 INTERNAL | FLAG_NO_DATA, 12036 { }, 12037 { { 0, 1 } }, 12038 .fill_helper = bpf_fill_alu64_rsh_same_reg, 12039 }, 12040 { 12041 "ALU64_ARSH_X: all shift values with the same register", 12042 { }, 12043 INTERNAL | FLAG_NO_DATA, 12044 { }, 12045 { { 0, 1 } }, 12046 .fill_helper = bpf_fill_alu64_arsh_same_reg, 12047 }, 12048 /* 12049 * Exhaustive test of ALU32 shift operations when 12050 * source and destination register are the same. 12051 */ 12052 { 12053 "ALU32_LSH_X: all shift values with the same register", 12054 { }, 12055 INTERNAL | FLAG_NO_DATA, 12056 { }, 12057 { { 0, 1 } }, 12058 .fill_helper = bpf_fill_alu32_lsh_same_reg, 12059 }, 12060 { 12061 "ALU32_RSH_X: all shift values with the same register", 12062 { }, 12063 INTERNAL | FLAG_NO_DATA, 12064 { }, 12065 { { 0, 1 } }, 12066 .fill_helper = bpf_fill_alu32_rsh_same_reg, 12067 }, 12068 { 12069 "ALU32_ARSH_X: all shift values with the same register", 12070 { }, 12071 INTERNAL | FLAG_NO_DATA, 12072 { }, 12073 { { 0, 1 } }, 12074 .fill_helper = bpf_fill_alu32_arsh_same_reg, 12075 }, 12076 /* ALU64 immediate magnitudes */ 12077 { 12078 "ALU64_MOV_K: all immediate value magnitudes", 12079 { }, 12080 INTERNAL | FLAG_NO_DATA, 12081 { }, 12082 { { 0, 1 } }, 12083 .fill_helper = bpf_fill_alu64_mov_imm, 12084 .nr_testruns = NR_PATTERN_RUNS, 12085 }, 12086 { 12087 "ALU64_AND_K: all immediate value magnitudes", 12088 { }, 12089 INTERNAL | FLAG_NO_DATA, 12090 { }, 12091 { { 0, 1 } }, 12092 .fill_helper = bpf_fill_alu64_and_imm, 12093 .nr_testruns = NR_PATTERN_RUNS, 12094 }, 12095 { 12096 "ALU64_OR_K: all immediate value magnitudes", 12097 { }, 12098 INTERNAL | FLAG_NO_DATA, 12099 { }, 12100 { { 0, 1 } }, 12101 .fill_helper = bpf_fill_alu64_or_imm, 12102 .nr_testruns = NR_PATTERN_RUNS, 12103 }, 12104 { 12105 "ALU64_XOR_K: all immediate value magnitudes", 12106 { }, 12107 INTERNAL | FLAG_NO_DATA, 12108 { }, 12109 { { 0, 1 } }, 12110 .fill_helper = bpf_fill_alu64_xor_imm, 12111 .nr_testruns = NR_PATTERN_RUNS, 12112 }, 12113 { 12114 "ALU64_ADD_K: all immediate value magnitudes", 12115 { }, 12116 INTERNAL | FLAG_NO_DATA, 12117 { }, 12118 { { 0, 1 } }, 12119 .fill_helper = bpf_fill_alu64_add_imm, 12120 .nr_testruns = NR_PATTERN_RUNS, 12121 }, 12122 { 12123 "ALU64_SUB_K: all immediate value magnitudes", 12124 { }, 12125 INTERNAL | FLAG_NO_DATA, 12126 { }, 12127 { { 0, 1 } }, 12128 .fill_helper = bpf_fill_alu64_sub_imm, 12129 .nr_testruns = NR_PATTERN_RUNS, 12130 }, 12131 { 12132 "ALU64_MUL_K: all immediate value magnitudes", 12133 { }, 12134 INTERNAL | FLAG_NO_DATA, 12135 { }, 12136 { { 0, 1 } }, 12137 .fill_helper = bpf_fill_alu64_mul_imm, 12138 .nr_testruns = NR_PATTERN_RUNS, 12139 }, 12140 { 12141 "ALU64_DIV_K: all immediate value magnitudes", 12142 { }, 12143 INTERNAL | FLAG_NO_DATA, 12144 { }, 12145 { { 0, 1 } }, 12146 .fill_helper = bpf_fill_alu64_div_imm, 12147 .nr_testruns = NR_PATTERN_RUNS, 12148 }, 12149 { 12150 "ALU64_MOD_K: all immediate value magnitudes", 12151 { }, 12152 INTERNAL | FLAG_NO_DATA, 12153 { }, 12154 { { 0, 1 } }, 12155 .fill_helper = bpf_fill_alu64_mod_imm, 12156 .nr_testruns = NR_PATTERN_RUNS, 12157 }, 12158 /* ALU32 immediate magnitudes */ 12159 { 12160 "ALU32_MOV_K: all immediate value magnitudes", 12161 { }, 12162 INTERNAL | FLAG_NO_DATA, 12163 { }, 12164 { { 0, 1 } }, 12165 .fill_helper = bpf_fill_alu32_mov_imm, 12166 .nr_testruns = NR_PATTERN_RUNS, 12167 }, 12168 { 12169 "ALU32_AND_K: all immediate value magnitudes", 12170 { }, 12171 INTERNAL | FLAG_NO_DATA, 12172 { }, 12173 { { 0, 1 } }, 12174 .fill_helper = bpf_fill_alu32_and_imm, 12175 .nr_testruns = NR_PATTERN_RUNS, 12176 }, 12177 { 12178 "ALU32_OR_K: all immediate value magnitudes", 12179 { }, 12180 INTERNAL | FLAG_NO_DATA, 12181 { }, 12182 { { 0, 1 } }, 12183 .fill_helper = bpf_fill_alu32_or_imm, 12184 .nr_testruns = NR_PATTERN_RUNS, 12185 }, 12186 { 12187 "ALU32_XOR_K: all immediate value magnitudes", 12188 { }, 12189 INTERNAL | FLAG_NO_DATA, 12190 { }, 12191 { { 0, 1 } }, 12192 .fill_helper = bpf_fill_alu32_xor_imm, 12193 .nr_testruns = NR_PATTERN_RUNS, 12194 }, 12195 { 12196 "ALU32_ADD_K: all immediate value magnitudes", 12197 { }, 12198 INTERNAL | FLAG_NO_DATA, 12199 { }, 12200 { { 0, 1 } }, 12201 .fill_helper = bpf_fill_alu32_add_imm, 12202 .nr_testruns = NR_PATTERN_RUNS, 12203 }, 12204 { 12205 "ALU32_SUB_K: all immediate value magnitudes", 12206 { }, 12207 INTERNAL | FLAG_NO_DATA, 12208 { }, 12209 { { 0, 1 } }, 12210 .fill_helper = bpf_fill_alu32_sub_imm, 12211 .nr_testruns = NR_PATTERN_RUNS, 12212 }, 12213 { 12214 "ALU32_MUL_K: all immediate value magnitudes", 12215 { }, 12216 INTERNAL | FLAG_NO_DATA, 12217 { }, 12218 { { 0, 1 } }, 12219 .fill_helper = bpf_fill_alu32_mul_imm, 12220 .nr_testruns = NR_PATTERN_RUNS, 12221 }, 12222 { 12223 "ALU32_DIV_K: all immediate value magnitudes", 12224 { }, 12225 INTERNAL | FLAG_NO_DATA, 12226 { }, 12227 { { 0, 1 } }, 12228 .fill_helper = bpf_fill_alu32_div_imm, 12229 .nr_testruns = NR_PATTERN_RUNS, 12230 }, 12231 { 12232 "ALU32_MOD_K: all immediate value magnitudes", 12233 { }, 12234 INTERNAL | FLAG_NO_DATA, 12235 { }, 12236 { { 0, 1 } }, 12237 .fill_helper = bpf_fill_alu32_mod_imm, 12238 .nr_testruns = NR_PATTERN_RUNS, 12239 }, 12240 /* ALU64 register magnitudes */ 12241 { 12242 "ALU64_MOV_X: all register value magnitudes", 12243 { }, 12244 INTERNAL | FLAG_NO_DATA, 12245 { }, 12246 { { 0, 1 } }, 12247 .fill_helper = bpf_fill_alu64_mov_reg, 12248 .nr_testruns = NR_PATTERN_RUNS, 12249 }, 12250 { 12251 "ALU64_AND_X: all register value magnitudes", 12252 { }, 12253 INTERNAL | FLAG_NO_DATA, 12254 { }, 12255 { { 0, 1 } }, 12256 .fill_helper = bpf_fill_alu64_and_reg, 12257 .nr_testruns = NR_PATTERN_RUNS, 12258 }, 12259 { 12260 "ALU64_OR_X: all register value magnitudes", 12261 { }, 12262 INTERNAL | FLAG_NO_DATA, 12263 { }, 12264 { { 0, 1 } }, 12265 .fill_helper = bpf_fill_alu64_or_reg, 12266 .nr_testruns = NR_PATTERN_RUNS, 12267 }, 12268 { 12269 "ALU64_XOR_X: all register value magnitudes", 12270 { }, 12271 INTERNAL | FLAG_NO_DATA, 12272 { }, 12273 { { 0, 1 } }, 12274 .fill_helper = bpf_fill_alu64_xor_reg, 12275 .nr_testruns = NR_PATTERN_RUNS, 12276 }, 12277 { 12278 "ALU64_ADD_X: all register value magnitudes", 12279 { }, 12280 INTERNAL | FLAG_NO_DATA, 12281 { }, 12282 { { 0, 1 } }, 12283 .fill_helper = bpf_fill_alu64_add_reg, 12284 .nr_testruns = NR_PATTERN_RUNS, 12285 }, 12286 { 12287 "ALU64_SUB_X: all register value magnitudes", 12288 { }, 12289 INTERNAL | FLAG_NO_DATA, 12290 { }, 12291 { { 0, 1 } }, 12292 .fill_helper = bpf_fill_alu64_sub_reg, 12293 .nr_testruns = NR_PATTERN_RUNS, 12294 }, 12295 { 12296 "ALU64_MUL_X: all register value magnitudes", 12297 { }, 12298 INTERNAL | FLAG_NO_DATA, 12299 { }, 12300 { { 0, 1 } }, 12301 .fill_helper = bpf_fill_alu64_mul_reg, 12302 .nr_testruns = NR_PATTERN_RUNS, 12303 }, 12304 { 12305 "ALU64_DIV_X: all register value magnitudes", 12306 { }, 12307 INTERNAL | FLAG_NO_DATA, 12308 { }, 12309 { { 0, 1 } }, 12310 .fill_helper = bpf_fill_alu64_div_reg, 12311 .nr_testruns = NR_PATTERN_RUNS, 12312 }, 12313 { 12314 "ALU64_MOD_X: all register value magnitudes", 12315 { }, 12316 INTERNAL | FLAG_NO_DATA, 12317 { }, 12318 { { 0, 1 } }, 12319 .fill_helper = bpf_fill_alu64_mod_reg, 12320 .nr_testruns = NR_PATTERN_RUNS, 12321 }, 12322 /* ALU32 register magnitudes */ 12323 { 12324 "ALU32_MOV_X: all register value magnitudes", 12325 { }, 12326 INTERNAL | FLAG_NO_DATA, 12327 { }, 12328 { { 0, 1 } }, 12329 .fill_helper = bpf_fill_alu32_mov_reg, 12330 .nr_testruns = NR_PATTERN_RUNS, 12331 }, 12332 { 12333 "ALU32_AND_X: all register value magnitudes", 12334 { }, 12335 INTERNAL | FLAG_NO_DATA, 12336 { }, 12337 { { 0, 1 } }, 12338 .fill_helper = bpf_fill_alu32_and_reg, 12339 .nr_testruns = NR_PATTERN_RUNS, 12340 }, 12341 { 12342 "ALU32_OR_X: all register value magnitudes", 12343 { }, 12344 INTERNAL | FLAG_NO_DATA, 12345 { }, 12346 { { 0, 1 } }, 12347 .fill_helper = bpf_fill_alu32_or_reg, 12348 .nr_testruns = NR_PATTERN_RUNS, 12349 }, 12350 { 12351 "ALU32_XOR_X: all register value magnitudes", 12352 { }, 12353 INTERNAL | FLAG_NO_DATA, 12354 { }, 12355 { { 0, 1 } }, 12356 .fill_helper = bpf_fill_alu32_xor_reg, 12357 .nr_testruns = NR_PATTERN_RUNS, 12358 }, 12359 { 12360 "ALU32_ADD_X: all register value magnitudes", 12361 { }, 12362 INTERNAL | FLAG_NO_DATA, 12363 { }, 12364 { { 0, 1 } }, 12365 .fill_helper = bpf_fill_alu32_add_reg, 12366 .nr_testruns = NR_PATTERN_RUNS, 12367 }, 12368 { 12369 "ALU32_SUB_X: all register value magnitudes", 12370 { }, 12371 INTERNAL | FLAG_NO_DATA, 12372 { }, 12373 { { 0, 1 } }, 12374 .fill_helper = bpf_fill_alu32_sub_reg, 12375 .nr_testruns = NR_PATTERN_RUNS, 12376 }, 12377 { 12378 "ALU32_MUL_X: all register value magnitudes", 12379 { }, 12380 INTERNAL | FLAG_NO_DATA, 12381 { }, 12382 { { 0, 1 } }, 12383 .fill_helper = bpf_fill_alu32_mul_reg, 12384 .nr_testruns = NR_PATTERN_RUNS, 12385 }, 12386 { 12387 "ALU32_DIV_X: all register value magnitudes", 12388 { }, 12389 INTERNAL | FLAG_NO_DATA, 12390 { }, 12391 { { 0, 1 } }, 12392 .fill_helper = bpf_fill_alu32_div_reg, 12393 .nr_testruns = NR_PATTERN_RUNS, 12394 }, 12395 { 12396 "ALU32_MOD_X: all register value magnitudes", 12397 { }, 12398 INTERNAL | FLAG_NO_DATA, 12399 { }, 12400 { { 0, 1 } }, 12401 .fill_helper = bpf_fill_alu32_mod_reg, 12402 .nr_testruns = NR_PATTERN_RUNS, 12403 }, 12404 /* LD_IMM64 immediate magnitudes */ 12405 { 12406 "LD_IMM64: all immediate value magnitudes", 12407 { }, 12408 INTERNAL | FLAG_NO_DATA, 12409 { }, 12410 { { 0, 1 } }, 12411 .fill_helper = bpf_fill_ld_imm64, 12412 }, 12413 /* 64-bit ATOMIC register combinations */ 12414 { 12415 "ATOMIC_DW_ADD: register combinations", 12416 { }, 12417 INTERNAL, 12418 { }, 12419 { { 0, 1 } }, 12420 .fill_helper = bpf_fill_atomic64_add_reg_pairs, 12421 .stack_depth = 8, 12422 }, 12423 { 12424 "ATOMIC_DW_AND: register combinations", 12425 { }, 12426 INTERNAL, 12427 { }, 12428 { { 0, 1 } }, 12429 .fill_helper = bpf_fill_atomic64_and_reg_pairs, 12430 .stack_depth = 8, 12431 }, 12432 { 12433 "ATOMIC_DW_OR: register combinations", 12434 { }, 12435 INTERNAL, 12436 { }, 12437 { { 0, 1 } }, 12438 .fill_helper = bpf_fill_atomic64_or_reg_pairs, 12439 .stack_depth = 8, 12440 }, 12441 { 12442 "ATOMIC_DW_XOR: register combinations", 12443 { }, 12444 INTERNAL, 12445 { }, 12446 { { 0, 1 } }, 12447 .fill_helper = bpf_fill_atomic64_xor_reg_pairs, 12448 .stack_depth = 8, 12449 }, 12450 { 12451 "ATOMIC_DW_ADD_FETCH: register combinations", 12452 { }, 12453 INTERNAL, 12454 { }, 12455 { { 0, 1 } }, 12456 .fill_helper = bpf_fill_atomic64_add_fetch_reg_pairs, 12457 .stack_depth = 8, 12458 }, 12459 { 12460 "ATOMIC_DW_AND_FETCH: register combinations", 12461 { }, 12462 INTERNAL, 12463 { }, 12464 { { 0, 1 } }, 12465 .fill_helper = bpf_fill_atomic64_and_fetch_reg_pairs, 12466 .stack_depth = 8, 12467 }, 12468 { 12469 "ATOMIC_DW_OR_FETCH: register combinations", 12470 { }, 12471 INTERNAL, 12472 { }, 12473 { { 0, 1 } }, 12474 .fill_helper = bpf_fill_atomic64_or_fetch_reg_pairs, 12475 .stack_depth = 8, 12476 }, 12477 { 12478 "ATOMIC_DW_XOR_FETCH: register combinations", 12479 { }, 12480 INTERNAL, 12481 { }, 12482 { { 0, 1 } }, 12483 .fill_helper = bpf_fill_atomic64_xor_fetch_reg_pairs, 12484 .stack_depth = 8, 12485 }, 12486 { 12487 "ATOMIC_DW_XCHG: register combinations", 12488 { }, 12489 INTERNAL, 12490 { }, 12491 { { 0, 1 } }, 12492 .fill_helper = bpf_fill_atomic64_xchg_reg_pairs, 12493 .stack_depth = 8, 12494 }, 12495 { 12496 "ATOMIC_DW_CMPXCHG: register combinations", 12497 { }, 12498 INTERNAL, 12499 { }, 12500 { { 0, 1 } }, 12501 .fill_helper = bpf_fill_atomic64_cmpxchg_reg_pairs, 12502 .stack_depth = 8, 12503 }, 12504 /* 32-bit ATOMIC register combinations */ 12505 { 12506 "ATOMIC_W_ADD: register combinations", 12507 { }, 12508 INTERNAL, 12509 { }, 12510 { { 0, 1 } }, 12511 .fill_helper = bpf_fill_atomic32_add_reg_pairs, 12512 .stack_depth = 8, 12513 }, 12514 { 12515 "ATOMIC_W_AND: register combinations", 12516 { }, 12517 INTERNAL, 12518 { }, 12519 { { 0, 1 } }, 12520 .fill_helper = bpf_fill_atomic32_and_reg_pairs, 12521 .stack_depth = 8, 12522 }, 12523 { 12524 "ATOMIC_W_OR: register combinations", 12525 { }, 12526 INTERNAL, 12527 { }, 12528 { { 0, 1 } }, 12529 .fill_helper = bpf_fill_atomic32_or_reg_pairs, 12530 .stack_depth = 8, 12531 }, 12532 { 12533 "ATOMIC_W_XOR: register combinations", 12534 { }, 12535 INTERNAL, 12536 { }, 12537 { { 0, 1 } }, 12538 .fill_helper = bpf_fill_atomic32_xor_reg_pairs, 12539 .stack_depth = 8, 12540 }, 12541 { 12542 "ATOMIC_W_ADD_FETCH: register combinations", 12543 { }, 12544 INTERNAL, 12545 { }, 12546 { { 0, 1 } }, 12547 .fill_helper = bpf_fill_atomic32_add_fetch_reg_pairs, 12548 .stack_depth = 8, 12549 }, 12550 { 12551 "ATOMIC_W_AND_FETCH: register combinations", 12552 { }, 12553 INTERNAL, 12554 { }, 12555 { { 0, 1 } }, 12556 .fill_helper = bpf_fill_atomic32_and_fetch_reg_pairs, 12557 .stack_depth = 8, 12558 }, 12559 { 12560 "ATOMIC_W_OR_FETCH: register combinations", 12561 { }, 12562 INTERNAL, 12563 { }, 12564 { { 0, 1 } }, 12565 .fill_helper = bpf_fill_atomic32_or_fetch_reg_pairs, 12566 .stack_depth = 8, 12567 }, 12568 { 12569 "ATOMIC_W_XOR_FETCH: register combinations", 12570 { }, 12571 INTERNAL, 12572 { }, 12573 { { 0, 1 } }, 12574 .fill_helper = bpf_fill_atomic32_xor_fetch_reg_pairs, 12575 .stack_depth = 8, 12576 }, 12577 { 12578 "ATOMIC_W_XCHG: register combinations", 12579 { }, 12580 INTERNAL, 12581 { }, 12582 { { 0, 1 } }, 12583 .fill_helper = bpf_fill_atomic32_xchg_reg_pairs, 12584 .stack_depth = 8, 12585 }, 12586 { 12587 "ATOMIC_W_CMPXCHG: register combinations", 12588 { }, 12589 INTERNAL, 12590 { }, 12591 { { 0, 1 } }, 12592 .fill_helper = bpf_fill_atomic32_cmpxchg_reg_pairs, 12593 .stack_depth = 8, 12594 }, 12595 /* 64-bit ATOMIC magnitudes */ 12596 { 12597 "ATOMIC_DW_ADD: all operand magnitudes", 12598 { }, 12599 INTERNAL | FLAG_NO_DATA, 12600 { }, 12601 { { 0, 1 } }, 12602 .fill_helper = bpf_fill_atomic64_add, 12603 .stack_depth = 8, 12604 .nr_testruns = NR_PATTERN_RUNS, 12605 }, 12606 { 12607 "ATOMIC_DW_AND: all operand magnitudes", 12608 { }, 12609 INTERNAL | FLAG_NO_DATA, 12610 { }, 12611 { { 0, 1 } }, 12612 .fill_helper = bpf_fill_atomic64_and, 12613 .stack_depth = 8, 12614 .nr_testruns = NR_PATTERN_RUNS, 12615 }, 12616 { 12617 "ATOMIC_DW_OR: all operand magnitudes", 12618 { }, 12619 INTERNAL | FLAG_NO_DATA, 12620 { }, 12621 { { 0, 1 } }, 12622 .fill_helper = bpf_fill_atomic64_or, 12623 .stack_depth = 8, 12624 .nr_testruns = NR_PATTERN_RUNS, 12625 }, 12626 { 12627 "ATOMIC_DW_XOR: all operand magnitudes", 12628 { }, 12629 INTERNAL | FLAG_NO_DATA, 12630 { }, 12631 { { 0, 1 } }, 12632 .fill_helper = bpf_fill_atomic64_xor, 12633 .stack_depth = 8, 12634 .nr_testruns = NR_PATTERN_RUNS, 12635 }, 12636 { 12637 "ATOMIC_DW_ADD_FETCH: all operand magnitudes", 12638 { }, 12639 INTERNAL | FLAG_NO_DATA, 12640 { }, 12641 { { 0, 1 } }, 12642 .fill_helper = bpf_fill_atomic64_add_fetch, 12643 .stack_depth = 8, 12644 .nr_testruns = NR_PATTERN_RUNS, 12645 }, 12646 { 12647 "ATOMIC_DW_AND_FETCH: all operand magnitudes", 12648 { }, 12649 INTERNAL | FLAG_NO_DATA, 12650 { }, 12651 { { 0, 1 } }, 12652 .fill_helper = bpf_fill_atomic64_and_fetch, 12653 .stack_depth = 8, 12654 .nr_testruns = NR_PATTERN_RUNS, 12655 }, 12656 { 12657 "ATOMIC_DW_OR_FETCH: all operand magnitudes", 12658 { }, 12659 INTERNAL | FLAG_NO_DATA, 12660 { }, 12661 { { 0, 1 } }, 12662 .fill_helper = bpf_fill_atomic64_or_fetch, 12663 .stack_depth = 8, 12664 .nr_testruns = NR_PATTERN_RUNS, 12665 }, 12666 { 12667 "ATOMIC_DW_XOR_FETCH: all operand magnitudes", 12668 { }, 12669 INTERNAL | FLAG_NO_DATA, 12670 { }, 12671 { { 0, 1 } }, 12672 .fill_helper = bpf_fill_atomic64_xor_fetch, 12673 .stack_depth = 8, 12674 .nr_testruns = NR_PATTERN_RUNS, 12675 }, 12676 { 12677 "ATOMIC_DW_XCHG: all operand magnitudes", 12678 { }, 12679 INTERNAL | FLAG_NO_DATA, 12680 { }, 12681 { { 0, 1 } }, 12682 .fill_helper = bpf_fill_atomic64_xchg, 12683 .stack_depth = 8, 12684 .nr_testruns = NR_PATTERN_RUNS, 12685 }, 12686 { 12687 "ATOMIC_DW_CMPXCHG: all operand magnitudes", 12688 { }, 12689 INTERNAL | FLAG_NO_DATA, 12690 { }, 12691 { { 0, 1 } }, 12692 .fill_helper = bpf_fill_cmpxchg64, 12693 .stack_depth = 8, 12694 .nr_testruns = NR_PATTERN_RUNS, 12695 }, 12696 /* 64-bit atomic magnitudes */ 12697 { 12698 "ATOMIC_W_ADD: all operand magnitudes", 12699 { }, 12700 INTERNAL | FLAG_NO_DATA, 12701 { }, 12702 { { 0, 1 } }, 12703 .fill_helper = bpf_fill_atomic32_add, 12704 .stack_depth = 8, 12705 .nr_testruns = NR_PATTERN_RUNS, 12706 }, 12707 { 12708 "ATOMIC_W_AND: all operand magnitudes", 12709 { }, 12710 INTERNAL | FLAG_NO_DATA, 12711 { }, 12712 { { 0, 1 } }, 12713 .fill_helper = bpf_fill_atomic32_and, 12714 .stack_depth = 8, 12715 .nr_testruns = NR_PATTERN_RUNS, 12716 }, 12717 { 12718 "ATOMIC_W_OR: all operand magnitudes", 12719 { }, 12720 INTERNAL | FLAG_NO_DATA, 12721 { }, 12722 { { 0, 1 } }, 12723 .fill_helper = bpf_fill_atomic32_or, 12724 .stack_depth = 8, 12725 .nr_testruns = NR_PATTERN_RUNS, 12726 }, 12727 { 12728 "ATOMIC_W_XOR: all operand magnitudes", 12729 { }, 12730 INTERNAL | FLAG_NO_DATA, 12731 { }, 12732 { { 0, 1 } }, 12733 .fill_helper = bpf_fill_atomic32_xor, 12734 .stack_depth = 8, 12735 .nr_testruns = NR_PATTERN_RUNS, 12736 }, 12737 { 12738 "ATOMIC_W_ADD_FETCH: all operand magnitudes", 12739 { }, 12740 INTERNAL | FLAG_NO_DATA, 12741 { }, 12742 { { 0, 1 } }, 12743 .fill_helper = bpf_fill_atomic32_add_fetch, 12744 .stack_depth = 8, 12745 .nr_testruns = NR_PATTERN_RUNS, 12746 }, 12747 { 12748 "ATOMIC_W_AND_FETCH: all operand magnitudes", 12749 { }, 12750 INTERNAL | FLAG_NO_DATA, 12751 { }, 12752 { { 0, 1 } }, 12753 .fill_helper = bpf_fill_atomic32_and_fetch, 12754 .stack_depth = 8, 12755 .nr_testruns = NR_PATTERN_RUNS, 12756 }, 12757 { 12758 "ATOMIC_W_OR_FETCH: all operand magnitudes", 12759 { }, 12760 INTERNAL | FLAG_NO_DATA, 12761 { }, 12762 { { 0, 1 } }, 12763 .fill_helper = bpf_fill_atomic32_or_fetch, 12764 .stack_depth = 8, 12765 .nr_testruns = NR_PATTERN_RUNS, 12766 }, 12767 { 12768 "ATOMIC_W_XOR_FETCH: all operand magnitudes", 12769 { }, 12770 INTERNAL | FLAG_NO_DATA, 12771 { }, 12772 { { 0, 1 } }, 12773 .fill_helper = bpf_fill_atomic32_xor_fetch, 12774 .stack_depth = 8, 12775 .nr_testruns = NR_PATTERN_RUNS, 12776 }, 12777 { 12778 "ATOMIC_W_XCHG: all operand magnitudes", 12779 { }, 12780 INTERNAL | FLAG_NO_DATA, 12781 { }, 12782 { { 0, 1 } }, 12783 .fill_helper = bpf_fill_atomic32_xchg, 12784 .stack_depth = 8, 12785 .nr_testruns = NR_PATTERN_RUNS, 12786 }, 12787 { 12788 "ATOMIC_W_CMPXCHG: all operand magnitudes", 12789 { }, 12790 INTERNAL | FLAG_NO_DATA, 12791 { }, 12792 { { 0, 1 } }, 12793 .fill_helper = bpf_fill_cmpxchg32, 12794 .stack_depth = 8, 12795 .nr_testruns = NR_PATTERN_RUNS, 12796 }, 12797 /* JMP immediate magnitudes */ 12798 { 12799 "JMP_JSET_K: all immediate value magnitudes", 12800 { }, 12801 INTERNAL | FLAG_NO_DATA, 12802 { }, 12803 { { 0, 1 } }, 12804 .fill_helper = bpf_fill_jmp_jset_imm, 12805 .nr_testruns = NR_PATTERN_RUNS, 12806 }, 12807 { 12808 "JMP_JEQ_K: all immediate value magnitudes", 12809 { }, 12810 INTERNAL | FLAG_NO_DATA, 12811 { }, 12812 { { 0, 1 } }, 12813 .fill_helper = bpf_fill_jmp_jeq_imm, 12814 .nr_testruns = NR_PATTERN_RUNS, 12815 }, 12816 { 12817 "JMP_JNE_K: all immediate value magnitudes", 12818 { }, 12819 INTERNAL | FLAG_NO_DATA, 12820 { }, 12821 { { 0, 1 } }, 12822 .fill_helper = bpf_fill_jmp_jne_imm, 12823 .nr_testruns = NR_PATTERN_RUNS, 12824 }, 12825 { 12826 "JMP_JGT_K: all immediate value magnitudes", 12827 { }, 12828 INTERNAL | FLAG_NO_DATA, 12829 { }, 12830 { { 0, 1 } }, 12831 .fill_helper = bpf_fill_jmp_jgt_imm, 12832 .nr_testruns = NR_PATTERN_RUNS, 12833 }, 12834 { 12835 "JMP_JGE_K: all immediate value magnitudes", 12836 { }, 12837 INTERNAL | FLAG_NO_DATA, 12838 { }, 12839 { { 0, 1 } }, 12840 .fill_helper = bpf_fill_jmp_jge_imm, 12841 .nr_testruns = NR_PATTERN_RUNS, 12842 }, 12843 { 12844 "JMP_JLT_K: all immediate value magnitudes", 12845 { }, 12846 INTERNAL | FLAG_NO_DATA, 12847 { }, 12848 { { 0, 1 } }, 12849 .fill_helper = bpf_fill_jmp_jlt_imm, 12850 .nr_testruns = NR_PATTERN_RUNS, 12851 }, 12852 { 12853 "JMP_JLE_K: all immediate value magnitudes", 12854 { }, 12855 INTERNAL | FLAG_NO_DATA, 12856 { }, 12857 { { 0, 1 } }, 12858 .fill_helper = bpf_fill_jmp_jle_imm, 12859 .nr_testruns = NR_PATTERN_RUNS, 12860 }, 12861 { 12862 "JMP_JSGT_K: all immediate value magnitudes", 12863 { }, 12864 INTERNAL | FLAG_NO_DATA, 12865 { }, 12866 { { 0, 1 } }, 12867 .fill_helper = bpf_fill_jmp_jsgt_imm, 12868 .nr_testruns = NR_PATTERN_RUNS, 12869 }, 12870 { 12871 "JMP_JSGE_K: all immediate value magnitudes", 12872 { }, 12873 INTERNAL | FLAG_NO_DATA, 12874 { }, 12875 { { 0, 1 } }, 12876 .fill_helper = bpf_fill_jmp_jsge_imm, 12877 .nr_testruns = NR_PATTERN_RUNS, 12878 }, 12879 { 12880 "JMP_JSLT_K: all immediate value magnitudes", 12881 { }, 12882 INTERNAL | FLAG_NO_DATA, 12883 { }, 12884 { { 0, 1 } }, 12885 .fill_helper = bpf_fill_jmp_jslt_imm, 12886 .nr_testruns = NR_PATTERN_RUNS, 12887 }, 12888 { 12889 "JMP_JSLE_K: all immediate value magnitudes", 12890 { }, 12891 INTERNAL | FLAG_NO_DATA, 12892 { }, 12893 { { 0, 1 } }, 12894 .fill_helper = bpf_fill_jmp_jsle_imm, 12895 .nr_testruns = NR_PATTERN_RUNS, 12896 }, 12897 /* JMP register magnitudes */ 12898 { 12899 "JMP_JSET_X: all register value magnitudes", 12900 { }, 12901 INTERNAL | FLAG_NO_DATA, 12902 { }, 12903 { { 0, 1 } }, 12904 .fill_helper = bpf_fill_jmp_jset_reg, 12905 .nr_testruns = NR_PATTERN_RUNS, 12906 }, 12907 { 12908 "JMP_JEQ_X: all register value magnitudes", 12909 { }, 12910 INTERNAL | FLAG_NO_DATA, 12911 { }, 12912 { { 0, 1 } }, 12913 .fill_helper = bpf_fill_jmp_jeq_reg, 12914 .nr_testruns = NR_PATTERN_RUNS, 12915 }, 12916 { 12917 "JMP_JNE_X: all register value magnitudes", 12918 { }, 12919 INTERNAL | FLAG_NO_DATA, 12920 { }, 12921 { { 0, 1 } }, 12922 .fill_helper = bpf_fill_jmp_jne_reg, 12923 .nr_testruns = NR_PATTERN_RUNS, 12924 }, 12925 { 12926 "JMP_JGT_X: all register value magnitudes", 12927 { }, 12928 INTERNAL | FLAG_NO_DATA, 12929 { }, 12930 { { 0, 1 } }, 12931 .fill_helper = bpf_fill_jmp_jgt_reg, 12932 .nr_testruns = NR_PATTERN_RUNS, 12933 }, 12934 { 12935 "JMP_JGE_X: all register value magnitudes", 12936 { }, 12937 INTERNAL | FLAG_NO_DATA, 12938 { }, 12939 { { 0, 1 } }, 12940 .fill_helper = bpf_fill_jmp_jge_reg, 12941 .nr_testruns = NR_PATTERN_RUNS, 12942 }, 12943 { 12944 "JMP_JLT_X: all register value magnitudes", 12945 { }, 12946 INTERNAL | FLAG_NO_DATA, 12947 { }, 12948 { { 0, 1 } }, 12949 .fill_helper = bpf_fill_jmp_jlt_reg, 12950 .nr_testruns = NR_PATTERN_RUNS, 12951 }, 12952 { 12953 "JMP_JLE_X: all register value magnitudes", 12954 { }, 12955 INTERNAL | FLAG_NO_DATA, 12956 { }, 12957 { { 0, 1 } }, 12958 .fill_helper = bpf_fill_jmp_jle_reg, 12959 .nr_testruns = NR_PATTERN_RUNS, 12960 }, 12961 { 12962 "JMP_JSGT_X: all register value magnitudes", 12963 { }, 12964 INTERNAL | FLAG_NO_DATA, 12965 { }, 12966 { { 0, 1 } }, 12967 .fill_helper = bpf_fill_jmp_jsgt_reg, 12968 .nr_testruns = NR_PATTERN_RUNS, 12969 }, 12970 { 12971 "JMP_JSGE_X: all register value magnitudes", 12972 { }, 12973 INTERNAL | FLAG_NO_DATA, 12974 { }, 12975 { { 0, 1 } }, 12976 .fill_helper = bpf_fill_jmp_jsge_reg, 12977 .nr_testruns = NR_PATTERN_RUNS, 12978 }, 12979 { 12980 "JMP_JSLT_X: all register value magnitudes", 12981 { }, 12982 INTERNAL | FLAG_NO_DATA, 12983 { }, 12984 { { 0, 1 } }, 12985 .fill_helper = bpf_fill_jmp_jslt_reg, 12986 .nr_testruns = NR_PATTERN_RUNS, 12987 }, 12988 { 12989 "JMP_JSLE_X: all register value magnitudes", 12990 { }, 12991 INTERNAL | FLAG_NO_DATA, 12992 { }, 12993 { { 0, 1 } }, 12994 .fill_helper = bpf_fill_jmp_jsle_reg, 12995 .nr_testruns = NR_PATTERN_RUNS, 12996 }, 12997 /* JMP32 immediate magnitudes */ 12998 { 12999 "JMP32_JSET_K: all immediate value magnitudes", 13000 { }, 13001 INTERNAL | FLAG_NO_DATA, 13002 { }, 13003 { { 0, 1 } }, 13004 .fill_helper = bpf_fill_jmp32_jset_imm, 13005 .nr_testruns = NR_PATTERN_RUNS, 13006 }, 13007 { 13008 "JMP32_JEQ_K: all immediate value magnitudes", 13009 { }, 13010 INTERNAL | FLAG_NO_DATA, 13011 { }, 13012 { { 0, 1 } }, 13013 .fill_helper = bpf_fill_jmp32_jeq_imm, 13014 .nr_testruns = NR_PATTERN_RUNS, 13015 }, 13016 { 13017 "JMP32_JNE_K: all immediate value magnitudes", 13018 { }, 13019 INTERNAL | FLAG_NO_DATA, 13020 { }, 13021 { { 0, 1 } }, 13022 .fill_helper = bpf_fill_jmp32_jne_imm, 13023 .nr_testruns = NR_PATTERN_RUNS, 13024 }, 13025 { 13026 "JMP32_JGT_K: all immediate value magnitudes", 13027 { }, 13028 INTERNAL | FLAG_NO_DATA, 13029 { }, 13030 { { 0, 1 } }, 13031 .fill_helper = bpf_fill_jmp32_jgt_imm, 13032 .nr_testruns = NR_PATTERN_RUNS, 13033 }, 13034 { 13035 "JMP32_JGE_K: all immediate value magnitudes", 13036 { }, 13037 INTERNAL | FLAG_NO_DATA, 13038 { }, 13039 { { 0, 1 } }, 13040 .fill_helper = bpf_fill_jmp32_jge_imm, 13041 .nr_testruns = NR_PATTERN_RUNS, 13042 }, 13043 { 13044 "JMP32_JLT_K: all immediate value magnitudes", 13045 { }, 13046 INTERNAL | FLAG_NO_DATA, 13047 { }, 13048 { { 0, 1 } }, 13049 .fill_helper = bpf_fill_jmp32_jlt_imm, 13050 .nr_testruns = NR_PATTERN_RUNS, 13051 }, 13052 { 13053 "JMP32_JLE_K: all immediate value magnitudes", 13054 { }, 13055 INTERNAL | FLAG_NO_DATA, 13056 { }, 13057 { { 0, 1 } }, 13058 .fill_helper = bpf_fill_jmp32_jle_imm, 13059 .nr_testruns = NR_PATTERN_RUNS, 13060 }, 13061 { 13062 "JMP32_JSGT_K: all immediate value magnitudes", 13063 { }, 13064 INTERNAL | FLAG_NO_DATA, 13065 { }, 13066 { { 0, 1 } }, 13067 .fill_helper = bpf_fill_jmp32_jsgt_imm, 13068 .nr_testruns = NR_PATTERN_RUNS, 13069 }, 13070 { 13071 "JMP32_JSGE_K: all immediate value magnitudes", 13072 { }, 13073 INTERNAL | FLAG_NO_DATA, 13074 { }, 13075 { { 0, 1 } }, 13076 .fill_helper = bpf_fill_jmp32_jsge_imm, 13077 .nr_testruns = NR_PATTERN_RUNS, 13078 }, 13079 { 13080 "JMP32_JSLT_K: all immediate value magnitudes", 13081 { }, 13082 INTERNAL | FLAG_NO_DATA, 13083 { }, 13084 { { 0, 1 } }, 13085 .fill_helper = bpf_fill_jmp32_jslt_imm, 13086 .nr_testruns = NR_PATTERN_RUNS, 13087 }, 13088 { 13089 "JMP32_JSLE_K: all immediate value magnitudes", 13090 { }, 13091 INTERNAL | FLAG_NO_DATA, 13092 { }, 13093 { { 0, 1 } }, 13094 .fill_helper = bpf_fill_jmp32_jsle_imm, 13095 .nr_testruns = NR_PATTERN_RUNS, 13096 }, 13097 /* JMP32 register magnitudes */ 13098 { 13099 "JMP32_JSET_X: all register value magnitudes", 13100 { }, 13101 INTERNAL | FLAG_NO_DATA, 13102 { }, 13103 { { 0, 1 } }, 13104 .fill_helper = bpf_fill_jmp32_jset_reg, 13105 .nr_testruns = NR_PATTERN_RUNS, 13106 }, 13107 { 13108 "JMP32_JEQ_X: all register value magnitudes", 13109 { }, 13110 INTERNAL | FLAG_NO_DATA, 13111 { }, 13112 { { 0, 1 } }, 13113 .fill_helper = bpf_fill_jmp32_jeq_reg, 13114 .nr_testruns = NR_PATTERN_RUNS, 13115 }, 13116 { 13117 "JMP32_JNE_X: all register value magnitudes", 13118 { }, 13119 INTERNAL | FLAG_NO_DATA, 13120 { }, 13121 { { 0, 1 } }, 13122 .fill_helper = bpf_fill_jmp32_jne_reg, 13123 .nr_testruns = NR_PATTERN_RUNS, 13124 }, 13125 { 13126 "JMP32_JGT_X: all register value magnitudes", 13127 { }, 13128 INTERNAL | FLAG_NO_DATA, 13129 { }, 13130 { { 0, 1 } }, 13131 .fill_helper = bpf_fill_jmp32_jgt_reg, 13132 .nr_testruns = NR_PATTERN_RUNS, 13133 }, 13134 { 13135 "JMP32_JGE_X: all register value magnitudes", 13136 { }, 13137 INTERNAL | FLAG_NO_DATA, 13138 { }, 13139 { { 0, 1 } }, 13140 .fill_helper = bpf_fill_jmp32_jge_reg, 13141 .nr_testruns = NR_PATTERN_RUNS, 13142 }, 13143 { 13144 "JMP32_JLT_X: all register value magnitudes", 13145 { }, 13146 INTERNAL | FLAG_NO_DATA, 13147 { }, 13148 { { 0, 1 } }, 13149 .fill_helper = bpf_fill_jmp32_jlt_reg, 13150 .nr_testruns = NR_PATTERN_RUNS, 13151 }, 13152 { 13153 "JMP32_JLE_X: all register value magnitudes", 13154 { }, 13155 INTERNAL | FLAG_NO_DATA, 13156 { }, 13157 { { 0, 1 } }, 13158 .fill_helper = bpf_fill_jmp32_jle_reg, 13159 .nr_testruns = NR_PATTERN_RUNS, 13160 }, 13161 { 13162 "JMP32_JSGT_X: all register value magnitudes", 13163 { }, 13164 INTERNAL | FLAG_NO_DATA, 13165 { }, 13166 { { 0, 1 } }, 13167 .fill_helper = bpf_fill_jmp32_jsgt_reg, 13168 .nr_testruns = NR_PATTERN_RUNS, 13169 }, 13170 { 13171 "JMP32_JSGE_X: all register value magnitudes", 13172 { }, 13173 INTERNAL | FLAG_NO_DATA, 13174 { }, 13175 { { 0, 1 } }, 13176 .fill_helper = bpf_fill_jmp32_jsge_reg, 13177 .nr_testruns = NR_PATTERN_RUNS, 13178 }, 13179 { 13180 "JMP32_JSLT_X: all register value magnitudes", 13181 { }, 13182 INTERNAL | FLAG_NO_DATA, 13183 { }, 13184 { { 0, 1 } }, 13185 .fill_helper = bpf_fill_jmp32_jslt_reg, 13186 .nr_testruns = NR_PATTERN_RUNS, 13187 }, 13188 { 13189 "JMP32_JSLE_X: all register value magnitudes", 13190 { }, 13191 INTERNAL | FLAG_NO_DATA, 13192 { }, 13193 { { 0, 1 } }, 13194 .fill_helper = bpf_fill_jmp32_jsle_reg, 13195 .nr_testruns = NR_PATTERN_RUNS, 13196 }, 13197 /* Conditional jumps with constant decision */ 13198 { 13199 "JMP_JSET_K: imm = 0 -> never taken", 13200 .u.insns_int = { 13201 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13202 BPF_JMP_IMM(BPF_JSET, R1, 0, 1), 13203 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13204 BPF_EXIT_INSN(), 13205 }, 13206 INTERNAL | FLAG_NO_DATA, 13207 { }, 13208 { { 0, 0 } }, 13209 }, 13210 { 13211 "JMP_JLT_K: imm = 0 -> never taken", 13212 .u.insns_int = { 13213 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13214 BPF_JMP_IMM(BPF_JLT, R1, 0, 1), 13215 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13216 BPF_EXIT_INSN(), 13217 }, 13218 INTERNAL | FLAG_NO_DATA, 13219 { }, 13220 { { 0, 0 } }, 13221 }, 13222 { 13223 "JMP_JGE_K: imm = 0 -> always taken", 13224 .u.insns_int = { 13225 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13226 BPF_JMP_IMM(BPF_JGE, R1, 0, 1), 13227 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13228 BPF_EXIT_INSN(), 13229 }, 13230 INTERNAL | FLAG_NO_DATA, 13231 { }, 13232 { { 0, 1 } }, 13233 }, 13234 { 13235 "JMP_JGT_K: imm = 0xffffffff -> never taken", 13236 .u.insns_int = { 13237 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13238 BPF_JMP_IMM(BPF_JGT, R1, U32_MAX, 1), 13239 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13240 BPF_EXIT_INSN(), 13241 }, 13242 INTERNAL | FLAG_NO_DATA, 13243 { }, 13244 { { 0, 0 } }, 13245 }, 13246 { 13247 "JMP_JLE_K: imm = 0xffffffff -> always taken", 13248 .u.insns_int = { 13249 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13250 BPF_JMP_IMM(BPF_JLE, R1, U32_MAX, 1), 13251 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13252 BPF_EXIT_INSN(), 13253 }, 13254 INTERNAL | FLAG_NO_DATA, 13255 { }, 13256 { { 0, 1 } }, 13257 }, 13258 { 13259 "JMP32_JSGT_K: imm = 0x7fffffff -> never taken", 13260 .u.insns_int = { 13261 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13262 BPF_JMP32_IMM(BPF_JSGT, R1, S32_MAX, 1), 13263 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13264 BPF_EXIT_INSN(), 13265 }, 13266 INTERNAL | FLAG_NO_DATA, 13267 { }, 13268 { { 0, 0 } }, 13269 }, 13270 { 13271 "JMP32_JSGE_K: imm = -0x80000000 -> always taken", 13272 .u.insns_int = { 13273 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13274 BPF_JMP32_IMM(BPF_JSGE, R1, S32_MIN, 1), 13275 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13276 BPF_EXIT_INSN(), 13277 }, 13278 INTERNAL | FLAG_NO_DATA, 13279 { }, 13280 { { 0, 1 } }, 13281 }, 13282 { 13283 "JMP32_JSLT_K: imm = -0x80000000 -> never taken", 13284 .u.insns_int = { 13285 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13286 BPF_JMP32_IMM(BPF_JSLT, R1, S32_MIN, 1), 13287 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13288 BPF_EXIT_INSN(), 13289 }, 13290 INTERNAL | FLAG_NO_DATA, 13291 { }, 13292 { { 0, 0 } }, 13293 }, 13294 { 13295 "JMP32_JSLE_K: imm = 0x7fffffff -> always taken", 13296 .u.insns_int = { 13297 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13298 BPF_JMP32_IMM(BPF_JSLE, R1, S32_MAX, 1), 13299 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13300 BPF_EXIT_INSN(), 13301 }, 13302 INTERNAL | FLAG_NO_DATA, 13303 { }, 13304 { { 0, 1 } }, 13305 }, 13306 { 13307 "JMP_JEQ_X: dst = src -> always taken", 13308 .u.insns_int = { 13309 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13310 BPF_JMP_REG(BPF_JEQ, R1, R1, 1), 13311 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13312 BPF_EXIT_INSN(), 13313 }, 13314 INTERNAL | FLAG_NO_DATA, 13315 { }, 13316 { { 0, 1 } }, 13317 }, 13318 { 13319 "JMP_JGE_X: dst = src -> always taken", 13320 .u.insns_int = { 13321 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13322 BPF_JMP_REG(BPF_JGE, R1, R1, 1), 13323 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13324 BPF_EXIT_INSN(), 13325 }, 13326 INTERNAL | FLAG_NO_DATA, 13327 { }, 13328 { { 0, 1 } }, 13329 }, 13330 { 13331 "JMP_JLE_X: dst = src -> always taken", 13332 .u.insns_int = { 13333 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13334 BPF_JMP_REG(BPF_JLE, R1, R1, 1), 13335 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13336 BPF_EXIT_INSN(), 13337 }, 13338 INTERNAL | FLAG_NO_DATA, 13339 { }, 13340 { { 0, 1 } }, 13341 }, 13342 { 13343 "JMP_JSGE_X: dst = src -> always taken", 13344 .u.insns_int = { 13345 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13346 BPF_JMP_REG(BPF_JSGE, R1, R1, 1), 13347 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13348 BPF_EXIT_INSN(), 13349 }, 13350 INTERNAL | FLAG_NO_DATA, 13351 { }, 13352 { { 0, 1 } }, 13353 }, 13354 { 13355 "JMP_JSLE_X: dst = src -> always taken", 13356 .u.insns_int = { 13357 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13358 BPF_JMP_REG(BPF_JSLE, R1, R1, 1), 13359 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13360 BPF_EXIT_INSN(), 13361 }, 13362 INTERNAL | FLAG_NO_DATA, 13363 { }, 13364 { { 0, 1 } }, 13365 }, 13366 { 13367 "JMP_JNE_X: dst = src -> never taken", 13368 .u.insns_int = { 13369 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13370 BPF_JMP_REG(BPF_JNE, R1, R1, 1), 13371 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13372 BPF_EXIT_INSN(), 13373 }, 13374 INTERNAL | FLAG_NO_DATA, 13375 { }, 13376 { { 0, 0 } }, 13377 }, 13378 { 13379 "JMP_JGT_X: dst = src -> never taken", 13380 .u.insns_int = { 13381 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13382 BPF_JMP_REG(BPF_JGT, R1, R1, 1), 13383 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13384 BPF_EXIT_INSN(), 13385 }, 13386 INTERNAL | FLAG_NO_DATA, 13387 { }, 13388 { { 0, 0 } }, 13389 }, 13390 { 13391 "JMP_JLT_X: dst = src -> never taken", 13392 .u.insns_int = { 13393 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13394 BPF_JMP_REG(BPF_JLT, R1, R1, 1), 13395 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13396 BPF_EXIT_INSN(), 13397 }, 13398 INTERNAL | FLAG_NO_DATA, 13399 { }, 13400 { { 0, 0 } }, 13401 }, 13402 { 13403 "JMP_JSGT_X: dst = src -> never taken", 13404 .u.insns_int = { 13405 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13406 BPF_JMP_REG(BPF_JSGT, R1, R1, 1), 13407 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13408 BPF_EXIT_INSN(), 13409 }, 13410 INTERNAL | FLAG_NO_DATA, 13411 { }, 13412 { { 0, 0 } }, 13413 }, 13414 { 13415 "JMP_JSLT_X: dst = src -> never taken", 13416 .u.insns_int = { 13417 BPF_ALU64_IMM(BPF_MOV, R0, 1), 13418 BPF_JMP_REG(BPF_JSLT, R1, R1, 1), 13419 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13420 BPF_EXIT_INSN(), 13421 }, 13422 INTERNAL | FLAG_NO_DATA, 13423 { }, 13424 { { 0, 0 } }, 13425 }, 13426 /* Short relative jumps */ 13427 { 13428 "Short relative jump: offset=0", 13429 .u.insns_int = { 13430 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13431 BPF_JMP_IMM(BPF_JEQ, R0, 0, 0), 13432 BPF_EXIT_INSN(), 13433 BPF_ALU32_IMM(BPF_MOV, R0, -1), 13434 }, 13435 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT, 13436 { }, 13437 { { 0, 0 } }, 13438 }, 13439 { 13440 "Short relative jump: offset=1", 13441 .u.insns_int = { 13442 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13443 BPF_JMP_IMM(BPF_JEQ, R0, 0, 1), 13444 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13445 BPF_EXIT_INSN(), 13446 BPF_ALU32_IMM(BPF_MOV, R0, -1), 13447 }, 13448 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT, 13449 { }, 13450 { { 0, 0 } }, 13451 }, 13452 { 13453 "Short relative jump: offset=2", 13454 .u.insns_int = { 13455 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13456 BPF_JMP_IMM(BPF_JEQ, R0, 0, 2), 13457 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13458 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13459 BPF_EXIT_INSN(), 13460 BPF_ALU32_IMM(BPF_MOV, R0, -1), 13461 }, 13462 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT, 13463 { }, 13464 { { 0, 0 } }, 13465 }, 13466 { 13467 "Short relative jump: offset=3", 13468 .u.insns_int = { 13469 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13470 BPF_JMP_IMM(BPF_JEQ, R0, 0, 3), 13471 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13472 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13473 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13474 BPF_EXIT_INSN(), 13475 BPF_ALU32_IMM(BPF_MOV, R0, -1), 13476 }, 13477 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT, 13478 { }, 13479 { { 0, 0 } }, 13480 }, 13481 { 13482 "Short relative jump: offset=4", 13483 .u.insns_int = { 13484 BPF_ALU64_IMM(BPF_MOV, R0, 0), 13485 BPF_JMP_IMM(BPF_JEQ, R0, 0, 4), 13486 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13487 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13488 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13489 BPF_ALU32_IMM(BPF_ADD, R0, 1), 13490 BPF_EXIT_INSN(), 13491 BPF_ALU32_IMM(BPF_MOV, R0, -1), 13492 }, 13493 INTERNAL | FLAG_NO_DATA | FLAG_VERIFIER_ZEXT, 13494 { }, 13495 { { 0, 0 } }, 13496 }, 13497 /* Conditional branch conversions */ 13498 { 13499 "Long conditional jump: taken at runtime", 13500 { }, 13501 INTERNAL | FLAG_NO_DATA, 13502 { }, 13503 { { 0, 1 } }, 13504 .fill_helper = bpf_fill_max_jmp_taken, 13505 }, 13506 { 13507 "Long conditional jump: not taken at runtime", 13508 { }, 13509 INTERNAL | FLAG_NO_DATA, 13510 { }, 13511 { { 0, 2 } }, 13512 .fill_helper = bpf_fill_max_jmp_not_taken, 13513 }, 13514 { 13515 "Long conditional jump: always taken, known at JIT time", 13516 { }, 13517 INTERNAL | FLAG_NO_DATA, 13518 { }, 13519 { { 0, 1 } }, 13520 .fill_helper = bpf_fill_max_jmp_always_taken, 13521 }, 13522 { 13523 "Long conditional jump: never taken, known at JIT time", 13524 { }, 13525 INTERNAL | FLAG_NO_DATA, 13526 { }, 13527 { { 0, 2 } }, 13528 .fill_helper = bpf_fill_max_jmp_never_taken, 13529 }, 13530 /* Staggered jump sequences, immediate */ 13531 { 13532 "Staggered jumps: JMP_JA", 13533 { }, 13534 INTERNAL | FLAG_NO_DATA, 13535 { }, 13536 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13537 .fill_helper = bpf_fill_staggered_ja, 13538 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13539 }, 13540 { 13541 "Staggered jumps: JMP_JEQ_K", 13542 { }, 13543 INTERNAL | FLAG_NO_DATA, 13544 { }, 13545 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13546 .fill_helper = bpf_fill_staggered_jeq_imm, 13547 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13548 }, 13549 { 13550 "Staggered jumps: JMP_JNE_K", 13551 { }, 13552 INTERNAL | FLAG_NO_DATA, 13553 { }, 13554 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13555 .fill_helper = bpf_fill_staggered_jne_imm, 13556 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13557 }, 13558 { 13559 "Staggered jumps: JMP_JSET_K", 13560 { }, 13561 INTERNAL | FLAG_NO_DATA, 13562 { }, 13563 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13564 .fill_helper = bpf_fill_staggered_jset_imm, 13565 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13566 }, 13567 { 13568 "Staggered jumps: JMP_JGT_K", 13569 { }, 13570 INTERNAL | FLAG_NO_DATA, 13571 { }, 13572 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13573 .fill_helper = bpf_fill_staggered_jgt_imm, 13574 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13575 }, 13576 { 13577 "Staggered jumps: JMP_JGE_K", 13578 { }, 13579 INTERNAL | FLAG_NO_DATA, 13580 { }, 13581 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13582 .fill_helper = bpf_fill_staggered_jge_imm, 13583 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13584 }, 13585 { 13586 "Staggered jumps: JMP_JLT_K", 13587 { }, 13588 INTERNAL | FLAG_NO_DATA, 13589 { }, 13590 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13591 .fill_helper = bpf_fill_staggered_jlt_imm, 13592 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13593 }, 13594 { 13595 "Staggered jumps: JMP_JLE_K", 13596 { }, 13597 INTERNAL | FLAG_NO_DATA, 13598 { }, 13599 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13600 .fill_helper = bpf_fill_staggered_jle_imm, 13601 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13602 }, 13603 { 13604 "Staggered jumps: JMP_JSGT_K", 13605 { }, 13606 INTERNAL | FLAG_NO_DATA, 13607 { }, 13608 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13609 .fill_helper = bpf_fill_staggered_jsgt_imm, 13610 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13611 }, 13612 { 13613 "Staggered jumps: JMP_JSGE_K", 13614 { }, 13615 INTERNAL | FLAG_NO_DATA, 13616 { }, 13617 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13618 .fill_helper = bpf_fill_staggered_jsge_imm, 13619 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13620 }, 13621 { 13622 "Staggered jumps: JMP_JSLT_K", 13623 { }, 13624 INTERNAL | FLAG_NO_DATA, 13625 { }, 13626 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13627 .fill_helper = bpf_fill_staggered_jslt_imm, 13628 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13629 }, 13630 { 13631 "Staggered jumps: JMP_JSLE_K", 13632 { }, 13633 INTERNAL | FLAG_NO_DATA, 13634 { }, 13635 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13636 .fill_helper = bpf_fill_staggered_jsle_imm, 13637 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13638 }, 13639 /* Staggered jump sequences, register */ 13640 { 13641 "Staggered jumps: JMP_JEQ_X", 13642 { }, 13643 INTERNAL | FLAG_NO_DATA, 13644 { }, 13645 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13646 .fill_helper = bpf_fill_staggered_jeq_reg, 13647 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13648 }, 13649 { 13650 "Staggered jumps: JMP_JNE_X", 13651 { }, 13652 INTERNAL | FLAG_NO_DATA, 13653 { }, 13654 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13655 .fill_helper = bpf_fill_staggered_jne_reg, 13656 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13657 }, 13658 { 13659 "Staggered jumps: JMP_JSET_X", 13660 { }, 13661 INTERNAL | FLAG_NO_DATA, 13662 { }, 13663 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13664 .fill_helper = bpf_fill_staggered_jset_reg, 13665 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13666 }, 13667 { 13668 "Staggered jumps: JMP_JGT_X", 13669 { }, 13670 INTERNAL | FLAG_NO_DATA, 13671 { }, 13672 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13673 .fill_helper = bpf_fill_staggered_jgt_reg, 13674 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13675 }, 13676 { 13677 "Staggered jumps: JMP_JGE_X", 13678 { }, 13679 INTERNAL | FLAG_NO_DATA, 13680 { }, 13681 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13682 .fill_helper = bpf_fill_staggered_jge_reg, 13683 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13684 }, 13685 { 13686 "Staggered jumps: JMP_JLT_X", 13687 { }, 13688 INTERNAL | FLAG_NO_DATA, 13689 { }, 13690 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13691 .fill_helper = bpf_fill_staggered_jlt_reg, 13692 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13693 }, 13694 { 13695 "Staggered jumps: JMP_JLE_X", 13696 { }, 13697 INTERNAL | FLAG_NO_DATA, 13698 { }, 13699 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13700 .fill_helper = bpf_fill_staggered_jle_reg, 13701 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13702 }, 13703 { 13704 "Staggered jumps: JMP_JSGT_X", 13705 { }, 13706 INTERNAL | FLAG_NO_DATA, 13707 { }, 13708 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13709 .fill_helper = bpf_fill_staggered_jsgt_reg, 13710 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13711 }, 13712 { 13713 "Staggered jumps: JMP_JSGE_X", 13714 { }, 13715 INTERNAL | FLAG_NO_DATA, 13716 { }, 13717 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13718 .fill_helper = bpf_fill_staggered_jsge_reg, 13719 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13720 }, 13721 { 13722 "Staggered jumps: JMP_JSLT_X", 13723 { }, 13724 INTERNAL | FLAG_NO_DATA, 13725 { }, 13726 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13727 .fill_helper = bpf_fill_staggered_jslt_reg, 13728 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13729 }, 13730 { 13731 "Staggered jumps: JMP_JSLE_X", 13732 { }, 13733 INTERNAL | FLAG_NO_DATA, 13734 { }, 13735 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13736 .fill_helper = bpf_fill_staggered_jsle_reg, 13737 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13738 }, 13739 /* Staggered jump sequences, JMP32 immediate */ 13740 { 13741 "Staggered jumps: JMP32_JEQ_K", 13742 { }, 13743 INTERNAL | FLAG_NO_DATA, 13744 { }, 13745 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13746 .fill_helper = bpf_fill_staggered_jeq32_imm, 13747 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13748 }, 13749 { 13750 "Staggered jumps: JMP32_JNE_K", 13751 { }, 13752 INTERNAL | FLAG_NO_DATA, 13753 { }, 13754 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13755 .fill_helper = bpf_fill_staggered_jne32_imm, 13756 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13757 }, 13758 { 13759 "Staggered jumps: JMP32_JSET_K", 13760 { }, 13761 INTERNAL | FLAG_NO_DATA, 13762 { }, 13763 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13764 .fill_helper = bpf_fill_staggered_jset32_imm, 13765 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13766 }, 13767 { 13768 "Staggered jumps: JMP32_JGT_K", 13769 { }, 13770 INTERNAL | FLAG_NO_DATA, 13771 { }, 13772 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13773 .fill_helper = bpf_fill_staggered_jgt32_imm, 13774 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13775 }, 13776 { 13777 "Staggered jumps: JMP32_JGE_K", 13778 { }, 13779 INTERNAL | FLAG_NO_DATA, 13780 { }, 13781 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13782 .fill_helper = bpf_fill_staggered_jge32_imm, 13783 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13784 }, 13785 { 13786 "Staggered jumps: JMP32_JLT_K", 13787 { }, 13788 INTERNAL | FLAG_NO_DATA, 13789 { }, 13790 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13791 .fill_helper = bpf_fill_staggered_jlt32_imm, 13792 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13793 }, 13794 { 13795 "Staggered jumps: JMP32_JLE_K", 13796 { }, 13797 INTERNAL | FLAG_NO_DATA, 13798 { }, 13799 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13800 .fill_helper = bpf_fill_staggered_jle32_imm, 13801 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13802 }, 13803 { 13804 "Staggered jumps: JMP32_JSGT_K", 13805 { }, 13806 INTERNAL | FLAG_NO_DATA, 13807 { }, 13808 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13809 .fill_helper = bpf_fill_staggered_jsgt32_imm, 13810 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13811 }, 13812 { 13813 "Staggered jumps: JMP32_JSGE_K", 13814 { }, 13815 INTERNAL | FLAG_NO_DATA, 13816 { }, 13817 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13818 .fill_helper = bpf_fill_staggered_jsge32_imm, 13819 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13820 }, 13821 { 13822 "Staggered jumps: JMP32_JSLT_K", 13823 { }, 13824 INTERNAL | FLAG_NO_DATA, 13825 { }, 13826 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13827 .fill_helper = bpf_fill_staggered_jslt32_imm, 13828 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13829 }, 13830 { 13831 "Staggered jumps: JMP32_JSLE_K", 13832 { }, 13833 INTERNAL | FLAG_NO_DATA, 13834 { }, 13835 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13836 .fill_helper = bpf_fill_staggered_jsle32_imm, 13837 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13838 }, 13839 /* Staggered jump sequences, JMP32 register */ 13840 { 13841 "Staggered jumps: JMP32_JEQ_X", 13842 { }, 13843 INTERNAL | FLAG_NO_DATA, 13844 { }, 13845 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13846 .fill_helper = bpf_fill_staggered_jeq32_reg, 13847 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13848 }, 13849 { 13850 "Staggered jumps: JMP32_JNE_X", 13851 { }, 13852 INTERNAL | FLAG_NO_DATA, 13853 { }, 13854 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13855 .fill_helper = bpf_fill_staggered_jne32_reg, 13856 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13857 }, 13858 { 13859 "Staggered jumps: JMP32_JSET_X", 13860 { }, 13861 INTERNAL | FLAG_NO_DATA, 13862 { }, 13863 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13864 .fill_helper = bpf_fill_staggered_jset32_reg, 13865 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13866 }, 13867 { 13868 "Staggered jumps: JMP32_JGT_X", 13869 { }, 13870 INTERNAL | FLAG_NO_DATA, 13871 { }, 13872 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13873 .fill_helper = bpf_fill_staggered_jgt32_reg, 13874 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13875 }, 13876 { 13877 "Staggered jumps: JMP32_JGE_X", 13878 { }, 13879 INTERNAL | FLAG_NO_DATA, 13880 { }, 13881 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13882 .fill_helper = bpf_fill_staggered_jge32_reg, 13883 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13884 }, 13885 { 13886 "Staggered jumps: JMP32_JLT_X", 13887 { }, 13888 INTERNAL | FLAG_NO_DATA, 13889 { }, 13890 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13891 .fill_helper = bpf_fill_staggered_jlt32_reg, 13892 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13893 }, 13894 { 13895 "Staggered jumps: JMP32_JLE_X", 13896 { }, 13897 INTERNAL | FLAG_NO_DATA, 13898 { }, 13899 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13900 .fill_helper = bpf_fill_staggered_jle32_reg, 13901 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13902 }, 13903 { 13904 "Staggered jumps: JMP32_JSGT_X", 13905 { }, 13906 INTERNAL | FLAG_NO_DATA, 13907 { }, 13908 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13909 .fill_helper = bpf_fill_staggered_jsgt32_reg, 13910 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13911 }, 13912 { 13913 "Staggered jumps: JMP32_JSGE_X", 13914 { }, 13915 INTERNAL | FLAG_NO_DATA, 13916 { }, 13917 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13918 .fill_helper = bpf_fill_staggered_jsge32_reg, 13919 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13920 }, 13921 { 13922 "Staggered jumps: JMP32_JSLT_X", 13923 { }, 13924 INTERNAL | FLAG_NO_DATA, 13925 { }, 13926 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13927 .fill_helper = bpf_fill_staggered_jslt32_reg, 13928 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13929 }, 13930 { 13931 "Staggered jumps: JMP32_JSLE_X", 13932 { }, 13933 INTERNAL | FLAG_NO_DATA, 13934 { }, 13935 { { 0, MAX_STAGGERED_JMP_SIZE + 1 } }, 13936 .fill_helper = bpf_fill_staggered_jsle32_reg, 13937 .nr_testruns = NR_STAGGERED_JMP_RUNS, 13938 }, 13939 }; 13940 13941 static struct net_device dev; 13942 13943 static struct sk_buff *populate_skb(char *buf, int size) 13944 { 13945 struct sk_buff *skb; 13946 13947 if (size >= MAX_DATA) 13948 return NULL; 13949 13950 skb = alloc_skb(MAX_DATA, GFP_KERNEL); 13951 if (!skb) 13952 return NULL; 13953 13954 __skb_put_data(skb, buf, size); 13955 13956 /* Initialize a fake skb with test pattern. */ 13957 skb_reset_mac_header(skb); 13958 skb->protocol = htons(ETH_P_IP); 13959 skb->pkt_type = SKB_TYPE; 13960 skb->mark = SKB_MARK; 13961 skb->hash = SKB_HASH; 13962 skb->queue_mapping = SKB_QUEUE_MAP; 13963 skb->vlan_tci = SKB_VLAN_TCI; 13964 skb->vlan_present = SKB_VLAN_PRESENT; 13965 skb->vlan_proto = htons(ETH_P_IP); 13966 dev_net_set(&dev, &init_net); 13967 skb->dev = &dev; 13968 skb->dev->ifindex = SKB_DEV_IFINDEX; 13969 skb->dev->type = SKB_DEV_TYPE; 13970 skb_set_network_header(skb, min(size, ETH_HLEN)); 13971 13972 return skb; 13973 } 13974 13975 static void *generate_test_data(struct bpf_test *test, int sub) 13976 { 13977 struct sk_buff *skb; 13978 struct page *page; 13979 13980 if (test->aux & FLAG_NO_DATA) 13981 return NULL; 13982 13983 /* Test case expects an skb, so populate one. Various 13984 * subtests generate skbs of different sizes based on 13985 * the same data. 13986 */ 13987 skb = populate_skb(test->data, test->test[sub].data_size); 13988 if (!skb) 13989 return NULL; 13990 13991 if (test->aux & FLAG_SKB_FRAG) { 13992 /* 13993 * when the test requires a fragmented skb, add a 13994 * single fragment to the skb, filled with 13995 * test->frag_data. 13996 */ 13997 void *ptr; 13998 13999 page = alloc_page(GFP_KERNEL); 14000 14001 if (!page) 14002 goto err_kfree_skb; 14003 14004 ptr = kmap(page); 14005 if (!ptr) 14006 goto err_free_page; 14007 memcpy(ptr, test->frag_data, MAX_DATA); 14008 kunmap(page); 14009 skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA); 14010 } 14011 14012 return skb; 14013 14014 err_free_page: 14015 __free_page(page); 14016 err_kfree_skb: 14017 kfree_skb(skb); 14018 return NULL; 14019 } 14020 14021 static void release_test_data(const struct bpf_test *test, void *data) 14022 { 14023 if (test->aux & FLAG_NO_DATA) 14024 return; 14025 14026 kfree_skb(data); 14027 } 14028 14029 static int filter_length(int which) 14030 { 14031 struct sock_filter *fp; 14032 int len; 14033 14034 if (tests[which].fill_helper) 14035 return tests[which].u.ptr.len; 14036 14037 fp = tests[which].u.insns; 14038 for (len = MAX_INSNS - 1; len > 0; --len) 14039 if (fp[len].code != 0 || fp[len].k != 0) 14040 break; 14041 14042 return len + 1; 14043 } 14044 14045 static void *filter_pointer(int which) 14046 { 14047 if (tests[which].fill_helper) 14048 return tests[which].u.ptr.insns; 14049 else 14050 return tests[which].u.insns; 14051 } 14052 14053 static struct bpf_prog *generate_filter(int which, int *err) 14054 { 14055 __u8 test_type = tests[which].aux & TEST_TYPE_MASK; 14056 unsigned int flen = filter_length(which); 14057 void *fptr = filter_pointer(which); 14058 struct sock_fprog_kern fprog; 14059 struct bpf_prog *fp; 14060 14061 switch (test_type) { 14062 case CLASSIC: 14063 fprog.filter = fptr; 14064 fprog.len = flen; 14065 14066 *err = bpf_prog_create(&fp, &fprog); 14067 if (tests[which].aux & FLAG_EXPECTED_FAIL) { 14068 if (*err == tests[which].expected_errcode) { 14069 pr_cont("PASS\n"); 14070 /* Verifier rejected filter as expected. */ 14071 *err = 0; 14072 return NULL; 14073 } else { 14074 pr_cont("UNEXPECTED_PASS\n"); 14075 /* Verifier didn't reject the test that's 14076 * bad enough, just return! 14077 */ 14078 *err = -EINVAL; 14079 return NULL; 14080 } 14081 } 14082 if (*err) { 14083 pr_cont("FAIL to prog_create err=%d len=%d\n", 14084 *err, fprog.len); 14085 return NULL; 14086 } 14087 break; 14088 14089 case INTERNAL: 14090 fp = bpf_prog_alloc(bpf_prog_size(flen), 0); 14091 if (fp == NULL) { 14092 pr_cont("UNEXPECTED_FAIL no memory left\n"); 14093 *err = -ENOMEM; 14094 return NULL; 14095 } 14096 14097 fp->len = flen; 14098 /* Type doesn't really matter here as long as it's not unspec. */ 14099 fp->type = BPF_PROG_TYPE_SOCKET_FILTER; 14100 memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn)); 14101 fp->aux->stack_depth = tests[which].stack_depth; 14102 fp->aux->verifier_zext = !!(tests[which].aux & 14103 FLAG_VERIFIER_ZEXT); 14104 14105 /* We cannot error here as we don't need type compatibility 14106 * checks. 14107 */ 14108 fp = bpf_prog_select_runtime(fp, err); 14109 if (*err) { 14110 pr_cont("FAIL to select_runtime err=%d\n", *err); 14111 return NULL; 14112 } 14113 break; 14114 } 14115 14116 *err = 0; 14117 return fp; 14118 } 14119 14120 static void release_filter(struct bpf_prog *fp, int which) 14121 { 14122 __u8 test_type = tests[which].aux & TEST_TYPE_MASK; 14123 14124 switch (test_type) { 14125 case CLASSIC: 14126 bpf_prog_destroy(fp); 14127 break; 14128 case INTERNAL: 14129 bpf_prog_free(fp); 14130 break; 14131 } 14132 } 14133 14134 static int __run_one(const struct bpf_prog *fp, const void *data, 14135 int runs, u64 *duration) 14136 { 14137 u64 start, finish; 14138 int ret = 0, i; 14139 14140 migrate_disable(); 14141 start = ktime_get_ns(); 14142 14143 for (i = 0; i < runs; i++) 14144 ret = bpf_prog_run(fp, data); 14145 14146 finish = ktime_get_ns(); 14147 migrate_enable(); 14148 14149 *duration = finish - start; 14150 do_div(*duration, runs); 14151 14152 return ret; 14153 } 14154 14155 static int run_one(const struct bpf_prog *fp, struct bpf_test *test) 14156 { 14157 int err_cnt = 0, i, runs = MAX_TESTRUNS; 14158 14159 if (test->nr_testruns) 14160 runs = min(test->nr_testruns, MAX_TESTRUNS); 14161 14162 for (i = 0; i < MAX_SUBTESTS; i++) { 14163 void *data; 14164 u64 duration; 14165 u32 ret; 14166 14167 /* 14168 * NOTE: Several sub-tests may be present, in which case 14169 * a zero {data_size, result} tuple indicates the end of 14170 * the sub-test array. The first test is always run, 14171 * even if both data_size and result happen to be zero. 14172 */ 14173 if (i > 0 && 14174 test->test[i].data_size == 0 && 14175 test->test[i].result == 0) 14176 break; 14177 14178 data = generate_test_data(test, i); 14179 if (!data && !(test->aux & FLAG_NO_DATA)) { 14180 pr_cont("data generation failed "); 14181 err_cnt++; 14182 break; 14183 } 14184 ret = __run_one(fp, data, runs, &duration); 14185 release_test_data(test, data); 14186 14187 if (ret == test->test[i].result) { 14188 pr_cont("%lld ", duration); 14189 } else { 14190 pr_cont("ret %d != %d ", ret, 14191 test->test[i].result); 14192 err_cnt++; 14193 } 14194 } 14195 14196 return err_cnt; 14197 } 14198 14199 static char test_name[64]; 14200 module_param_string(test_name, test_name, sizeof(test_name), 0); 14201 14202 static int test_id = -1; 14203 module_param(test_id, int, 0); 14204 14205 static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 }; 14206 module_param_array(test_range, int, NULL, 0); 14207 14208 static __init int find_test_index(const char *test_name) 14209 { 14210 int i; 14211 14212 for (i = 0; i < ARRAY_SIZE(tests); i++) { 14213 if (!strcmp(tests[i].descr, test_name)) 14214 return i; 14215 } 14216 return -1; 14217 } 14218 14219 static __init int prepare_bpf_tests(void) 14220 { 14221 if (test_id >= 0) { 14222 /* 14223 * if a test_id was specified, use test_range to 14224 * cover only that test. 14225 */ 14226 if (test_id >= ARRAY_SIZE(tests)) { 14227 pr_err("test_bpf: invalid test_id specified.\n"); 14228 return -EINVAL; 14229 } 14230 14231 test_range[0] = test_id; 14232 test_range[1] = test_id; 14233 } else if (*test_name) { 14234 /* 14235 * if a test_name was specified, find it and setup 14236 * test_range to cover only that test. 14237 */ 14238 int idx = find_test_index(test_name); 14239 14240 if (idx < 0) { 14241 pr_err("test_bpf: no test named '%s' found.\n", 14242 test_name); 14243 return -EINVAL; 14244 } 14245 test_range[0] = idx; 14246 test_range[1] = idx; 14247 } else { 14248 /* 14249 * check that the supplied test_range is valid. 14250 */ 14251 if (test_range[0] >= ARRAY_SIZE(tests) || 14252 test_range[1] >= ARRAY_SIZE(tests) || 14253 test_range[0] < 0 || test_range[1] < 0) { 14254 pr_err("test_bpf: test_range is out of bound.\n"); 14255 return -EINVAL; 14256 } 14257 14258 if (test_range[1] < test_range[0]) { 14259 pr_err("test_bpf: test_range is ending before it starts.\n"); 14260 return -EINVAL; 14261 } 14262 } 14263 14264 return 0; 14265 } 14266 14267 static __init void destroy_bpf_tests(void) 14268 { 14269 } 14270 14271 static bool exclude_test(int test_id) 14272 { 14273 return test_id < test_range[0] || test_id > test_range[1]; 14274 } 14275 14276 static __init struct sk_buff *build_test_skb(void) 14277 { 14278 u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN; 14279 struct sk_buff *skb[2]; 14280 struct page *page[2]; 14281 int i, data_size = 8; 14282 14283 for (i = 0; i < 2; i++) { 14284 page[i] = alloc_page(GFP_KERNEL); 14285 if (!page[i]) { 14286 if (i == 0) 14287 goto err_page0; 14288 else 14289 goto err_page1; 14290 } 14291 14292 /* this will set skb[i]->head_frag */ 14293 skb[i] = dev_alloc_skb(headroom + data_size); 14294 if (!skb[i]) { 14295 if (i == 0) 14296 goto err_skb0; 14297 else 14298 goto err_skb1; 14299 } 14300 14301 skb_reserve(skb[i], headroom); 14302 skb_put(skb[i], data_size); 14303 skb[i]->protocol = htons(ETH_P_IP); 14304 skb_reset_network_header(skb[i]); 14305 skb_set_mac_header(skb[i], -ETH_HLEN); 14306 14307 skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64); 14308 // skb_headlen(skb[i]): 8, skb[i]->head_frag = 1 14309 } 14310 14311 /* setup shinfo */ 14312 skb_shinfo(skb[0])->gso_size = 1448; 14313 skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4; 14314 skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY; 14315 skb_shinfo(skb[0])->gso_segs = 0; 14316 skb_shinfo(skb[0])->frag_list = skb[1]; 14317 skb_shinfo(skb[0])->hwtstamps.hwtstamp = 1000; 14318 14319 /* adjust skb[0]'s len */ 14320 skb[0]->len += skb[1]->len; 14321 skb[0]->data_len += skb[1]->data_len; 14322 skb[0]->truesize += skb[1]->truesize; 14323 14324 return skb[0]; 14325 14326 err_skb1: 14327 __free_page(page[1]); 14328 err_page1: 14329 kfree_skb(skb[0]); 14330 err_skb0: 14331 __free_page(page[0]); 14332 err_page0: 14333 return NULL; 14334 } 14335 14336 static __init struct sk_buff *build_test_skb_linear_no_head_frag(void) 14337 { 14338 unsigned int alloc_size = 2000; 14339 unsigned int headroom = 102, doffset = 72, data_size = 1308; 14340 struct sk_buff *skb[2]; 14341 int i; 14342 14343 /* skbs linked in a frag_list, both with linear data, with head_frag=0 14344 * (data allocated by kmalloc), both have tcp data of 1308 bytes 14345 * (total payload is 2616 bytes). 14346 * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom. 14347 */ 14348 for (i = 0; i < 2; i++) { 14349 skb[i] = alloc_skb(alloc_size, GFP_KERNEL); 14350 if (!skb[i]) { 14351 if (i == 0) 14352 goto err_skb0; 14353 else 14354 goto err_skb1; 14355 } 14356 14357 skb[i]->protocol = htons(ETH_P_IPV6); 14358 skb_reserve(skb[i], headroom); 14359 skb_put(skb[i], doffset + data_size); 14360 skb_reset_network_header(skb[i]); 14361 if (i == 0) 14362 skb_reset_mac_header(skb[i]); 14363 else 14364 skb_set_mac_header(skb[i], -ETH_HLEN); 14365 __skb_pull(skb[i], doffset); 14366 } 14367 14368 /* setup shinfo. 14369 * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a 14370 * reduced gso_size. 14371 */ 14372 skb_shinfo(skb[0])->gso_size = 1288; 14373 skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY; 14374 skb_shinfo(skb[0])->gso_segs = 0; 14375 skb_shinfo(skb[0])->frag_list = skb[1]; 14376 14377 /* adjust skb[0]'s len */ 14378 skb[0]->len += skb[1]->len; 14379 skb[0]->data_len += skb[1]->len; 14380 skb[0]->truesize += skb[1]->truesize; 14381 14382 return skb[0]; 14383 14384 err_skb1: 14385 kfree_skb(skb[0]); 14386 err_skb0: 14387 return NULL; 14388 } 14389 14390 struct skb_segment_test { 14391 const char *descr; 14392 struct sk_buff *(*build_skb)(void); 14393 netdev_features_t features; 14394 }; 14395 14396 static struct skb_segment_test skb_segment_tests[] __initconst = { 14397 { 14398 .descr = "gso_with_rx_frags", 14399 .build_skb = build_test_skb, 14400 .features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM | 14401 NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM 14402 }, 14403 { 14404 .descr = "gso_linear_no_head_frag", 14405 .build_skb = build_test_skb_linear_no_head_frag, 14406 .features = NETIF_F_SG | NETIF_F_FRAGLIST | 14407 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO | 14408 NETIF_F_LLTX_BIT | NETIF_F_GRO | 14409 NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | 14410 NETIF_F_HW_VLAN_STAG_TX_BIT 14411 } 14412 }; 14413 14414 static __init int test_skb_segment_single(const struct skb_segment_test *test) 14415 { 14416 struct sk_buff *skb, *segs; 14417 int ret = -1; 14418 14419 skb = test->build_skb(); 14420 if (!skb) { 14421 pr_info("%s: failed to build_test_skb", __func__); 14422 goto done; 14423 } 14424 14425 segs = skb_segment(skb, test->features); 14426 if (!IS_ERR(segs)) { 14427 kfree_skb_list(segs); 14428 ret = 0; 14429 } 14430 kfree_skb(skb); 14431 done: 14432 return ret; 14433 } 14434 14435 static __init int test_skb_segment(void) 14436 { 14437 int i, err_cnt = 0, pass_cnt = 0; 14438 14439 for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) { 14440 const struct skb_segment_test *test = &skb_segment_tests[i]; 14441 14442 pr_info("#%d %s ", i, test->descr); 14443 14444 if (test_skb_segment_single(test)) { 14445 pr_cont("FAIL\n"); 14446 err_cnt++; 14447 } else { 14448 pr_cont("PASS\n"); 14449 pass_cnt++; 14450 } 14451 } 14452 14453 pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__, 14454 pass_cnt, err_cnt); 14455 return err_cnt ? -EINVAL : 0; 14456 } 14457 14458 static __init int test_bpf(void) 14459 { 14460 int i, err_cnt = 0, pass_cnt = 0; 14461 int jit_cnt = 0, run_cnt = 0; 14462 14463 for (i = 0; i < ARRAY_SIZE(tests); i++) { 14464 struct bpf_prog *fp; 14465 int err; 14466 14467 cond_resched(); 14468 if (exclude_test(i)) 14469 continue; 14470 14471 pr_info("#%d %s ", i, tests[i].descr); 14472 14473 if (tests[i].fill_helper && 14474 tests[i].fill_helper(&tests[i]) < 0) { 14475 pr_cont("FAIL to prog_fill\n"); 14476 continue; 14477 } 14478 14479 fp = generate_filter(i, &err); 14480 14481 if (tests[i].fill_helper) { 14482 kfree(tests[i].u.ptr.insns); 14483 tests[i].u.ptr.insns = NULL; 14484 } 14485 14486 if (fp == NULL) { 14487 if (err == 0) { 14488 pass_cnt++; 14489 continue; 14490 } 14491 err_cnt++; 14492 continue; 14493 } 14494 14495 pr_cont("jited:%u ", fp->jited); 14496 14497 run_cnt++; 14498 if (fp->jited) 14499 jit_cnt++; 14500 14501 err = run_one(fp, &tests[i]); 14502 release_filter(fp, i); 14503 14504 if (err) { 14505 pr_cont("FAIL (%d times)\n", err); 14506 err_cnt++; 14507 } else { 14508 pr_cont("PASS\n"); 14509 pass_cnt++; 14510 } 14511 } 14512 14513 pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n", 14514 pass_cnt, err_cnt, jit_cnt, run_cnt); 14515 14516 return err_cnt ? -EINVAL : 0; 14517 } 14518 14519 struct tail_call_test { 14520 const char *descr; 14521 struct bpf_insn insns[MAX_INSNS]; 14522 int flags; 14523 int result; 14524 int stack_depth; 14525 }; 14526 14527 /* Flags that can be passed to tail call test cases */ 14528 #define FLAG_NEED_STATE BIT(0) 14529 #define FLAG_RESULT_IN_STATE BIT(1) 14530 14531 /* 14532 * Magic marker used in test snippets for tail calls below. 14533 * BPF_LD/MOV to R2 and R2 with this immediate value is replaced 14534 * with the proper values by the test runner. 14535 */ 14536 #define TAIL_CALL_MARKER 0x7a11ca11 14537 14538 /* Special offset to indicate a NULL call target */ 14539 #define TAIL_CALL_NULL 0x7fff 14540 14541 /* Special offset to indicate an out-of-range index */ 14542 #define TAIL_CALL_INVALID 0x7ffe 14543 14544 #define TAIL_CALL(offset) \ 14545 BPF_LD_IMM64(R2, TAIL_CALL_MARKER), \ 14546 BPF_RAW_INSN(BPF_ALU | BPF_MOV | BPF_K, R3, 0, \ 14547 offset, TAIL_CALL_MARKER), \ 14548 BPF_JMP_IMM(BPF_TAIL_CALL, 0, 0, 0) 14549 14550 /* 14551 * A test function to be called from a BPF program, clobbering a lot of 14552 * CPU registers in the process. A JITed BPF program calling this function 14553 * must save and restore any caller-saved registers it uses for internal 14554 * state, for example the current tail call count. 14555 */ 14556 BPF_CALL_1(bpf_test_func, u64, arg) 14557 { 14558 char buf[64]; 14559 long a = 0; 14560 long b = 1; 14561 long c = 2; 14562 long d = 3; 14563 long e = 4; 14564 long f = 5; 14565 long g = 6; 14566 long h = 7; 14567 14568 return snprintf(buf, sizeof(buf), 14569 "%ld %lu %lx %ld %lu %lx %ld %lu %x", 14570 a, b, c, d, e, f, g, h, (int)arg); 14571 } 14572 #define BPF_FUNC_test_func __BPF_FUNC_MAX_ID 14573 14574 /* 14575 * Tail call tests. Each test case may call any other test in the table, 14576 * including itself, specified as a relative index offset from the calling 14577 * test. The index TAIL_CALL_NULL can be used to specify a NULL target 14578 * function to test the JIT error path. Similarly, the index TAIL_CALL_INVALID 14579 * results in a target index that is out of range. 14580 */ 14581 static struct tail_call_test tail_call_tests[] = { 14582 { 14583 "Tail call leaf", 14584 .insns = { 14585 BPF_ALU64_REG(BPF_MOV, R0, R1), 14586 BPF_ALU64_IMM(BPF_ADD, R0, 1), 14587 BPF_EXIT_INSN(), 14588 }, 14589 .result = 1, 14590 }, 14591 { 14592 "Tail call 2", 14593 .insns = { 14594 BPF_ALU64_IMM(BPF_ADD, R1, 2), 14595 TAIL_CALL(-1), 14596 BPF_ALU64_IMM(BPF_MOV, R0, -1), 14597 BPF_EXIT_INSN(), 14598 }, 14599 .result = 3, 14600 }, 14601 { 14602 "Tail call 3", 14603 .insns = { 14604 BPF_ALU64_IMM(BPF_ADD, R1, 3), 14605 TAIL_CALL(-1), 14606 BPF_ALU64_IMM(BPF_MOV, R0, -1), 14607 BPF_EXIT_INSN(), 14608 }, 14609 .result = 6, 14610 }, 14611 { 14612 "Tail call 4", 14613 .insns = { 14614 BPF_ALU64_IMM(BPF_ADD, R1, 4), 14615 TAIL_CALL(-1), 14616 BPF_ALU64_IMM(BPF_MOV, R0, -1), 14617 BPF_EXIT_INSN(), 14618 }, 14619 .result = 10, 14620 }, 14621 { 14622 "Tail call error path, max count reached", 14623 .insns = { 14624 BPF_LDX_MEM(BPF_W, R2, R1, 0), 14625 BPF_ALU64_IMM(BPF_ADD, R2, 1), 14626 BPF_STX_MEM(BPF_W, R1, R2, 0), 14627 TAIL_CALL(0), 14628 BPF_EXIT_INSN(), 14629 }, 14630 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE, 14631 .result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS, 14632 }, 14633 { 14634 "Tail call count preserved across function calls", 14635 .insns = { 14636 BPF_LDX_MEM(BPF_W, R2, R1, 0), 14637 BPF_ALU64_IMM(BPF_ADD, R2, 1), 14638 BPF_STX_MEM(BPF_W, R1, R2, 0), 14639 BPF_STX_MEM(BPF_DW, R10, R1, -8), 14640 BPF_CALL_REL(BPF_FUNC_get_numa_node_id), 14641 BPF_CALL_REL(BPF_FUNC_ktime_get_ns), 14642 BPF_CALL_REL(BPF_FUNC_ktime_get_boot_ns), 14643 BPF_CALL_REL(BPF_FUNC_ktime_get_coarse_ns), 14644 BPF_CALL_REL(BPF_FUNC_jiffies64), 14645 BPF_CALL_REL(BPF_FUNC_test_func), 14646 BPF_LDX_MEM(BPF_DW, R1, R10, -8), 14647 BPF_ALU32_REG(BPF_MOV, R0, R1), 14648 TAIL_CALL(0), 14649 BPF_EXIT_INSN(), 14650 }, 14651 .stack_depth = 8, 14652 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE, 14653 .result = (MAX_TAIL_CALL_CNT + 1 + 1) * MAX_TESTRUNS, 14654 }, 14655 { 14656 "Tail call error path, NULL target", 14657 .insns = { 14658 BPF_LDX_MEM(BPF_W, R2, R1, 0), 14659 BPF_ALU64_IMM(BPF_ADD, R2, 1), 14660 BPF_STX_MEM(BPF_W, R1, R2, 0), 14661 TAIL_CALL(TAIL_CALL_NULL), 14662 BPF_EXIT_INSN(), 14663 }, 14664 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE, 14665 .result = MAX_TESTRUNS, 14666 }, 14667 { 14668 "Tail call error path, index out of range", 14669 .insns = { 14670 BPF_LDX_MEM(BPF_W, R2, R1, 0), 14671 BPF_ALU64_IMM(BPF_ADD, R2, 1), 14672 BPF_STX_MEM(BPF_W, R1, R2, 0), 14673 TAIL_CALL(TAIL_CALL_INVALID), 14674 BPF_EXIT_INSN(), 14675 }, 14676 .flags = FLAG_NEED_STATE | FLAG_RESULT_IN_STATE, 14677 .result = MAX_TESTRUNS, 14678 }, 14679 }; 14680 14681 static void __init destroy_tail_call_tests(struct bpf_array *progs) 14682 { 14683 int i; 14684 14685 for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) 14686 if (progs->ptrs[i]) 14687 bpf_prog_free(progs->ptrs[i]); 14688 kfree(progs); 14689 } 14690 14691 static __init int prepare_tail_call_tests(struct bpf_array **pprogs) 14692 { 14693 int ntests = ARRAY_SIZE(tail_call_tests); 14694 struct bpf_array *progs; 14695 int which, err; 14696 14697 /* Allocate the table of programs to be used for tall calls */ 14698 progs = kzalloc(sizeof(*progs) + (ntests + 1) * sizeof(progs->ptrs[0]), 14699 GFP_KERNEL); 14700 if (!progs) 14701 goto out_nomem; 14702 14703 /* Create all eBPF programs and populate the table */ 14704 for (which = 0; which < ntests; which++) { 14705 struct tail_call_test *test = &tail_call_tests[which]; 14706 struct bpf_prog *fp; 14707 int len, i; 14708 14709 /* Compute the number of program instructions */ 14710 for (len = 0; len < MAX_INSNS; len++) { 14711 struct bpf_insn *insn = &test->insns[len]; 14712 14713 if (len < MAX_INSNS - 1 && 14714 insn->code == (BPF_LD | BPF_DW | BPF_IMM)) 14715 len++; 14716 if (insn->code == 0) 14717 break; 14718 } 14719 14720 /* Allocate and initialize the program */ 14721 fp = bpf_prog_alloc(bpf_prog_size(len), 0); 14722 if (!fp) 14723 goto out_nomem; 14724 14725 fp->len = len; 14726 fp->type = BPF_PROG_TYPE_SOCKET_FILTER; 14727 fp->aux->stack_depth = test->stack_depth; 14728 memcpy(fp->insnsi, test->insns, len * sizeof(struct bpf_insn)); 14729 14730 /* Relocate runtime tail call offsets and addresses */ 14731 for (i = 0; i < len; i++) { 14732 struct bpf_insn *insn = &fp->insnsi[i]; 14733 long addr = 0; 14734 14735 switch (insn->code) { 14736 case BPF_LD | BPF_DW | BPF_IMM: 14737 if (insn->imm != TAIL_CALL_MARKER) 14738 break; 14739 insn[0].imm = (u32)(long)progs; 14740 insn[1].imm = ((u64)(long)progs) >> 32; 14741 break; 14742 14743 case BPF_ALU | BPF_MOV | BPF_K: 14744 if (insn->imm != TAIL_CALL_MARKER) 14745 break; 14746 if (insn->off == TAIL_CALL_NULL) 14747 insn->imm = ntests; 14748 else if (insn->off == TAIL_CALL_INVALID) 14749 insn->imm = ntests + 1; 14750 else 14751 insn->imm = which + insn->off; 14752 insn->off = 0; 14753 break; 14754 14755 case BPF_JMP | BPF_CALL: 14756 if (insn->src_reg != BPF_PSEUDO_CALL) 14757 break; 14758 switch (insn->imm) { 14759 case BPF_FUNC_get_numa_node_id: 14760 addr = (long)&numa_node_id; 14761 break; 14762 case BPF_FUNC_ktime_get_ns: 14763 addr = (long)&ktime_get_ns; 14764 break; 14765 case BPF_FUNC_ktime_get_boot_ns: 14766 addr = (long)&ktime_get_boot_fast_ns; 14767 break; 14768 case BPF_FUNC_ktime_get_coarse_ns: 14769 addr = (long)&ktime_get_coarse_ns; 14770 break; 14771 case BPF_FUNC_jiffies64: 14772 addr = (long)&get_jiffies_64; 14773 break; 14774 case BPF_FUNC_test_func: 14775 addr = (long)&bpf_test_func; 14776 break; 14777 default: 14778 err = -EFAULT; 14779 goto out_err; 14780 } 14781 *insn = BPF_EMIT_CALL(addr); 14782 if ((long)__bpf_call_base + insn->imm != addr) 14783 *insn = BPF_JMP_A(0); /* Skip: NOP */ 14784 break; 14785 } 14786 } 14787 14788 fp = bpf_prog_select_runtime(fp, &err); 14789 if (err) 14790 goto out_err; 14791 14792 progs->ptrs[which] = fp; 14793 } 14794 14795 /* The last entry contains a NULL program pointer */ 14796 progs->map.max_entries = ntests + 1; 14797 *pprogs = progs; 14798 return 0; 14799 14800 out_nomem: 14801 err = -ENOMEM; 14802 14803 out_err: 14804 if (progs) 14805 destroy_tail_call_tests(progs); 14806 return err; 14807 } 14808 14809 static __init int test_tail_calls(struct bpf_array *progs) 14810 { 14811 int i, err_cnt = 0, pass_cnt = 0; 14812 int jit_cnt = 0, run_cnt = 0; 14813 14814 for (i = 0; i < ARRAY_SIZE(tail_call_tests); i++) { 14815 struct tail_call_test *test = &tail_call_tests[i]; 14816 struct bpf_prog *fp = progs->ptrs[i]; 14817 int *data = NULL; 14818 int state = 0; 14819 u64 duration; 14820 int ret; 14821 14822 cond_resched(); 14823 14824 pr_info("#%d %s ", i, test->descr); 14825 if (!fp) { 14826 err_cnt++; 14827 continue; 14828 } 14829 pr_cont("jited:%u ", fp->jited); 14830 14831 run_cnt++; 14832 if (fp->jited) 14833 jit_cnt++; 14834 14835 if (test->flags & FLAG_NEED_STATE) 14836 data = &state; 14837 ret = __run_one(fp, data, MAX_TESTRUNS, &duration); 14838 if (test->flags & FLAG_RESULT_IN_STATE) 14839 ret = state; 14840 if (ret == test->result) { 14841 pr_cont("%lld PASS", duration); 14842 pass_cnt++; 14843 } else { 14844 pr_cont("ret %d != %d FAIL", ret, test->result); 14845 err_cnt++; 14846 } 14847 } 14848 14849 pr_info("%s: Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n", 14850 __func__, pass_cnt, err_cnt, jit_cnt, run_cnt); 14851 14852 return err_cnt ? -EINVAL : 0; 14853 } 14854 14855 static int __init test_bpf_init(void) 14856 { 14857 struct bpf_array *progs = NULL; 14858 int ret; 14859 14860 ret = prepare_bpf_tests(); 14861 if (ret < 0) 14862 return ret; 14863 14864 ret = test_bpf(); 14865 destroy_bpf_tests(); 14866 if (ret) 14867 return ret; 14868 14869 ret = prepare_tail_call_tests(&progs); 14870 if (ret) 14871 return ret; 14872 ret = test_tail_calls(progs); 14873 destroy_tail_call_tests(progs); 14874 if (ret) 14875 return ret; 14876 14877 return test_skb_segment(); 14878 } 14879 14880 static void __exit test_bpf_exit(void) 14881 { 14882 } 14883 14884 module_init(test_bpf_init); 14885 module_exit(test_bpf_exit); 14886 14887 MODULE_LICENSE("GPL"); 14888