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