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