162306a36Sopenharmony_ci{ 262306a36Sopenharmony_ci "add+sub+mul", 362306a36Sopenharmony_ci .insns = { 462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 1), 562306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2), 662306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 3), 762306a36Sopenharmony_ci BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2), 862306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), 962306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3), 1062306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 1162306a36Sopenharmony_ci BPF_EXIT_INSN(), 1262306a36Sopenharmony_ci }, 1362306a36Sopenharmony_ci .result = ACCEPT, 1462306a36Sopenharmony_ci .retval = -3, 1562306a36Sopenharmony_ci}, 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci "xor32 zero extend check", 1862306a36Sopenharmony_ci .insns = { 1962306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_2, -1), 2062306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32), 2162306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff), 2262306a36Sopenharmony_ci BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2), 2362306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 2), 2462306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1), 2562306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 1), 2662306a36Sopenharmony_ci BPF_EXIT_INSN(), 2762306a36Sopenharmony_ci }, 2862306a36Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2962306a36Sopenharmony_ci .result = ACCEPT, 3062306a36Sopenharmony_ci .retval = 1, 3162306a36Sopenharmony_ci}, 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci "arsh32 on imm", 3462306a36Sopenharmony_ci .insns = { 3562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 3662306a36Sopenharmony_ci BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5), 3762306a36Sopenharmony_ci BPF_EXIT_INSN(), 3862306a36Sopenharmony_ci }, 3962306a36Sopenharmony_ci .result = ACCEPT, 4062306a36Sopenharmony_ci .retval = 0, 4162306a36Sopenharmony_ci}, 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci "arsh32 on imm 2", 4462306a36Sopenharmony_ci .insns = { 4562306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788), 4662306a36Sopenharmony_ci BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7), 4762306a36Sopenharmony_ci BPF_EXIT_INSN(), 4862306a36Sopenharmony_ci }, 4962306a36Sopenharmony_ci .result = ACCEPT, 5062306a36Sopenharmony_ci .retval = -16069393, 5162306a36Sopenharmony_ci}, 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci "arsh32 on reg", 5462306a36Sopenharmony_ci .insns = { 5562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 5662306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 5), 5762306a36Sopenharmony_ci BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 5862306a36Sopenharmony_ci BPF_EXIT_INSN(), 5962306a36Sopenharmony_ci }, 6062306a36Sopenharmony_ci .result = ACCEPT, 6162306a36Sopenharmony_ci .retval = 0, 6262306a36Sopenharmony_ci}, 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci "arsh32 on reg 2", 6562306a36Sopenharmony_ci .insns = { 6662306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 0xffff55667788), 6762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 15), 6862306a36Sopenharmony_ci BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 6962306a36Sopenharmony_ci BPF_EXIT_INSN(), 7062306a36Sopenharmony_ci }, 7162306a36Sopenharmony_ci .result = ACCEPT, 7262306a36Sopenharmony_ci .retval = 43724, 7362306a36Sopenharmony_ci}, 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci "arsh64 on imm", 7662306a36Sopenharmony_ci .insns = { 7762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 7862306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5), 7962306a36Sopenharmony_ci BPF_EXIT_INSN(), 8062306a36Sopenharmony_ci }, 8162306a36Sopenharmony_ci .result = ACCEPT, 8262306a36Sopenharmony_ci}, 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci "arsh64 on reg", 8562306a36Sopenharmony_ci .insns = { 8662306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 8762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 5), 8862306a36Sopenharmony_ci BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1), 8962306a36Sopenharmony_ci BPF_EXIT_INSN(), 9062306a36Sopenharmony_ci }, 9162306a36Sopenharmony_ci .result = ACCEPT, 9262306a36Sopenharmony_ci}, 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci "lsh64 by 0 imm", 9562306a36Sopenharmony_ci .insns = { 9662306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 9762306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 1), 9862306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0), 9962306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 10062306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 10162306a36Sopenharmony_ci BPF_EXIT_INSN(), 10262306a36Sopenharmony_ci }, 10362306a36Sopenharmony_ci .result = ACCEPT, 10462306a36Sopenharmony_ci .retval = 1, 10562306a36Sopenharmony_ci}, 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci "rsh64 by 0 imm", 10862306a36Sopenharmony_ci .insns = { 10962306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 11062306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 11162306a36Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 11262306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0), 11362306a36Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 11462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 11562306a36Sopenharmony_ci BPF_EXIT_INSN(), 11662306a36Sopenharmony_ci }, 11762306a36Sopenharmony_ci .result = ACCEPT, 11862306a36Sopenharmony_ci .retval = 1, 11962306a36Sopenharmony_ci}, 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci "arsh64 by 0 imm", 12262306a36Sopenharmony_ci .insns = { 12362306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 12462306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 12562306a36Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 12662306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0), 12762306a36Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 12862306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 12962306a36Sopenharmony_ci BPF_EXIT_INSN(), 13062306a36Sopenharmony_ci }, 13162306a36Sopenharmony_ci .result = ACCEPT, 13262306a36Sopenharmony_ci .retval = 1, 13362306a36Sopenharmony_ci}, 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci "lsh64 by 0 reg", 13662306a36Sopenharmony_ci .insns = { 13762306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 13862306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 1), 13962306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_2, 0), 14062306a36Sopenharmony_ci BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2), 14162306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1), 14262306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 14362306a36Sopenharmony_ci BPF_EXIT_INSN(), 14462306a36Sopenharmony_ci }, 14562306a36Sopenharmony_ci .result = ACCEPT, 14662306a36Sopenharmony_ci .retval = 1, 14762306a36Sopenharmony_ci}, 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci "rsh64 by 0 reg", 15062306a36Sopenharmony_ci .insns = { 15162306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 15262306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 15362306a36Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 15462306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_3, 0), 15562306a36Sopenharmony_ci BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3), 15662306a36Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 15762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 15862306a36Sopenharmony_ci BPF_EXIT_INSN(), 15962306a36Sopenharmony_ci }, 16062306a36Sopenharmony_ci .result = ACCEPT, 16162306a36Sopenharmony_ci .retval = 1, 16262306a36Sopenharmony_ci}, 16362306a36Sopenharmony_ci{ 16462306a36Sopenharmony_ci "arsh64 by 0 reg", 16562306a36Sopenharmony_ci .insns = { 16662306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 1), 16762306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, 0x100000000LL), 16862306a36Sopenharmony_ci BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1), 16962306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_3, 0), 17062306a36Sopenharmony_ci BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3), 17162306a36Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1), 17262306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 17362306a36Sopenharmony_ci BPF_EXIT_INSN(), 17462306a36Sopenharmony_ci }, 17562306a36Sopenharmony_ci .result = ACCEPT, 17662306a36Sopenharmony_ci .retval = 1, 17762306a36Sopenharmony_ci}, 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci "invalid 64-bit BPF_END with BPF_TO_BE", 18062306a36Sopenharmony_ci .insns = { 18162306a36Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 0), 18262306a36Sopenharmony_ci { 18362306a36Sopenharmony_ci .code = BPF_ALU64 | BPF_END | BPF_TO_BE, 18462306a36Sopenharmony_ci .dst_reg = BPF_REG_0, 18562306a36Sopenharmony_ci .src_reg = 0, 18662306a36Sopenharmony_ci .off = 0, 18762306a36Sopenharmony_ci .imm = 32, 18862306a36Sopenharmony_ci }, 18962306a36Sopenharmony_ci BPF_EXIT_INSN(), 19062306a36Sopenharmony_ci }, 19162306a36Sopenharmony_ci .errstr = "unknown opcode df", 19262306a36Sopenharmony_ci .result = REJECT, 19362306a36Sopenharmony_ci}, 19462306a36Sopenharmony_ci{ 19562306a36Sopenharmony_ci "mov64 src == dst", 19662306a36Sopenharmony_ci .insns = { 19762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 19862306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_2), 19962306a36Sopenharmony_ci // Check bounds are OK 20062306a36Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 20162306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 20262306a36Sopenharmony_ci BPF_EXIT_INSN(), 20362306a36Sopenharmony_ci }, 20462306a36Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 20562306a36Sopenharmony_ci .result = ACCEPT, 20662306a36Sopenharmony_ci}, 20762306a36Sopenharmony_ci{ 20862306a36Sopenharmony_ci "mov64 src != dst", 20962306a36Sopenharmony_ci .insns = { 21062306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 0), 21162306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_3), 21262306a36Sopenharmony_ci // Check bounds are OK 21362306a36Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), 21462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 21562306a36Sopenharmony_ci BPF_EXIT_INSN(), 21662306a36Sopenharmony_ci }, 21762306a36Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 21862306a36Sopenharmony_ci .result = ACCEPT, 21962306a36Sopenharmony_ci}, 220