18c2ecf20Sopenharmony_ci{ 28c2ecf20Sopenharmony_ci "add+sub+mul", 38c2ecf20Sopenharmony_ci .insns = { 48c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 1), 58c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 68c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 3), 78c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 88c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 98c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 108c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 118c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 128c2ecf20Sopenharmony_ci }, 138c2ecf20Sopenharmony_ci .result = ACCEPT, 148c2ecf20Sopenharmony_ci .retval = -3, 158c2ecf20Sopenharmony_ci}, 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci "xor32 zero extend check", 188c2ecf20Sopenharmony_ci .insns = { 198c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_2, -1), 208c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 228c2ecf20Sopenharmony_ci BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 238c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 2), 248c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 258c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 1), 268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 278c2ecf20Sopenharmony_ci }, 288c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 298c2ecf20Sopenharmony_ci .result = ACCEPT, 308c2ecf20Sopenharmony_ci .retval = 1, 318c2ecf20Sopenharmony_ci}, 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci "arsh32 on imm", 348c2ecf20Sopenharmony_ci .insns = { 358c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 368c2ecf20Sopenharmony_ci BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 378c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 388c2ecf20Sopenharmony_ci }, 398c2ecf20Sopenharmony_ci .result = ACCEPT, 408c2ecf20Sopenharmony_ci .retval = 0, 418c2ecf20Sopenharmony_ci}, 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci "arsh32 on imm 2", 448c2ecf20Sopenharmony_ci .insns = { 458c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 468c2ecf20Sopenharmony_ci BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 478c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 488c2ecf20Sopenharmony_ci }, 498c2ecf20Sopenharmony_ci .result = ACCEPT, 508c2ecf20Sopenharmony_ci .retval = -16069393, 518c2ecf20Sopenharmony_ci}, 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci "arsh32 on reg", 548c2ecf20Sopenharmony_ci .insns = { 558c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 568c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 5), 578c2ecf20Sopenharmony_ci BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 588c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 598c2ecf20Sopenharmony_ci }, 608c2ecf20Sopenharmony_ci .result = ACCEPT, 618c2ecf20Sopenharmony_ci .retval = 0, 628c2ecf20Sopenharmony_ci}, 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci "arsh32 on reg 2", 658c2ecf20Sopenharmony_ci .insns = { 668c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 15), 688c2ecf20Sopenharmony_ci BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 698c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 708c2ecf20Sopenharmony_ci }, 718c2ecf20Sopenharmony_ci .result = ACCEPT, 728c2ecf20Sopenharmony_ci .retval = 43724, 738c2ecf20Sopenharmony_ci}, 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci "arsh64 on imm", 768c2ecf20Sopenharmony_ci .insns = { 778c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 788c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 798c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 808c2ecf20Sopenharmony_ci }, 818c2ecf20Sopenharmony_ci .result = ACCEPT, 828c2ecf20Sopenharmony_ci}, 838c2ecf20Sopenharmony_ci{ 848c2ecf20Sopenharmony_ci "arsh64 on reg", 858c2ecf20Sopenharmony_ci .insns = { 868c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 878c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 5), 888c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 898c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 908c2ecf20Sopenharmony_ci }, 918c2ecf20Sopenharmony_ci .result = ACCEPT, 928c2ecf20Sopenharmony_ci}, 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci "lsh64 by 0 imm", 958c2ecf20Sopenharmony_ci .insns = { 968c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 978c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 1), 988c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0), 998c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1008c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1018c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1028c2ecf20Sopenharmony_ci }, 1038c2ecf20Sopenharmony_ci .result = ACCEPT, 1048c2ecf20Sopenharmony_ci .retval = 1, 1058c2ecf20Sopenharmony_ci}, 1068c2ecf20Sopenharmony_ci{ 1078c2ecf20Sopenharmony_ci "rsh64 by 0 imm", 1088c2ecf20Sopenharmony_ci .insns = { 1098c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 1108c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 1118c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 1128c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0), 1138c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 1148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1168c2ecf20Sopenharmony_ci }, 1178c2ecf20Sopenharmony_ci .result = ACCEPT, 1188c2ecf20Sopenharmony_ci .retval = 1, 1198c2ecf20Sopenharmony_ci}, 1208c2ecf20Sopenharmony_ci{ 1218c2ecf20Sopenharmony_ci "arsh64 by 0 imm", 1228c2ecf20Sopenharmony_ci .insns = { 1238c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 1248c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 1258c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 1268c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0), 1278c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 1288c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1298c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1308c2ecf20Sopenharmony_ci }, 1318c2ecf20Sopenharmony_ci .result = ACCEPT, 1328c2ecf20Sopenharmony_ci .retval = 1, 1338c2ecf20Sopenharmony_ci}, 1348c2ecf20Sopenharmony_ci{ 1358c2ecf20Sopenharmony_ci "lsh64 by 0 reg", 1368c2ecf20Sopenharmony_ci .insns = { 1378c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 1388c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 1), 1398c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_2, 0), 1408c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 1418c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 1428c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1438c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1448c2ecf20Sopenharmony_ci }, 1458c2ecf20Sopenharmony_ci .result = ACCEPT, 1468c2ecf20Sopenharmony_ci .retval = 1, 1478c2ecf20Sopenharmony_ci}, 1488c2ecf20Sopenharmony_ci{ 1498c2ecf20Sopenharmony_ci "rsh64 by 0 reg", 1508c2ecf20Sopenharmony_ci .insns = { 1518c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 1528c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 1538c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 1548c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_3, 0), 1558c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3), 1568c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 1578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1588c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1598c2ecf20Sopenharmony_ci }, 1608c2ecf20Sopenharmony_ci .result = ACCEPT, 1618c2ecf20Sopenharmony_ci .retval = 1, 1628c2ecf20Sopenharmony_ci}, 1638c2ecf20Sopenharmony_ci{ 1648c2ecf20Sopenharmony_ci "arsh64 by 0 reg", 1658c2ecf20Sopenharmony_ci .insns = { 1668c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 1678c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 1688c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 1698c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_3, 0), 1708c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3), 1718c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 1728c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1738c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1748c2ecf20Sopenharmony_ci }, 1758c2ecf20Sopenharmony_ci .result = ACCEPT, 1768c2ecf20Sopenharmony_ci .retval = 1, 1778c2ecf20Sopenharmony_ci}, 1788c2ecf20Sopenharmony_ci{ 1798c2ecf20Sopenharmony_ci "invalid 64-bit BPF_END", 1808c2ecf20Sopenharmony_ci .insns = { 1818c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 0), 1828c2ecf20Sopenharmony_ci { 1838c2ecf20Sopenharmony_ci .code = BPF_ALU64 | BPF_END | BPF_TO_LE, 1848c2ecf20Sopenharmony_ci .dst_reg = BPF_REG_0, 1858c2ecf20Sopenharmony_ci .src_reg = 0, 1868c2ecf20Sopenharmony_ci .off = 0, 1878c2ecf20Sopenharmony_ci .imm = 32, 1888c2ecf20Sopenharmony_ci }, 1898c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1908c2ecf20Sopenharmony_ci }, 1918c2ecf20Sopenharmony_ci .errstr = "unknown opcode d7", 1928c2ecf20Sopenharmony_ci .result = REJECT, 1938c2ecf20Sopenharmony_ci}, 1948c2ecf20Sopenharmony_ci{ 1958c2ecf20Sopenharmony_ci "mov64 src == dst", 1968c2ecf20Sopenharmony_ci .insns = { 1978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 1988c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 1998c2ecf20Sopenharmony_ci // Check bounds are OK 2008c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 2018c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2028c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2038c2ecf20Sopenharmony_ci }, 2048c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2058c2ecf20Sopenharmony_ci .result = ACCEPT, 2068c2ecf20Sopenharmony_ci}, 2078c2ecf20Sopenharmony_ci{ 2088c2ecf20Sopenharmony_ci "mov64 src != dst", 2098c2ecf20Sopenharmony_ci .insns = { 2108c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 2118c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 2128c2ecf20Sopenharmony_ci // Check bounds are OK 2138c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 2148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 2158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2168c2ecf20Sopenharmony_ci }, 2178c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2188c2ecf20Sopenharmony_ci .result = ACCEPT, 2198c2ecf20Sopenharmony_ci}, 220