18c2ecf20Sopenharmony_ci{
28c2ecf20Sopenharmony_ci	"calls: basic sanity",
38c2ecf20Sopenharmony_ci	.insns = {
48c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
58c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
68c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
78c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
88c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
98c2ecf20Sopenharmony_ci	},
108c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
118c2ecf20Sopenharmony_ci	.result = ACCEPT,
128c2ecf20Sopenharmony_ci},
138c2ecf20Sopenharmony_ci{
148c2ecf20Sopenharmony_ci	"calls: not on unpriviledged",
158c2ecf20Sopenharmony_ci	.insns = {
168c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
178c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
198c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
208c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
218c2ecf20Sopenharmony_ci	},
228c2ecf20Sopenharmony_ci	.errstr_unpriv = "function calls to other bpf functions are allowed for",
238c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
248c2ecf20Sopenharmony_ci	.result = ACCEPT,
258c2ecf20Sopenharmony_ci	.retval = 1,
268c2ecf20Sopenharmony_ci},
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	"calls: div by 0 in subprog",
298c2ecf20Sopenharmony_ci	.insns = {
308c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
318c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
328c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
338c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
348c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
358c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
368c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
378c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
388c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
398c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
408c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
418c2ecf20Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_2, 0),
428c2ecf20Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_3, 1),
438c2ecf20Sopenharmony_ci	BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2),
448c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
458c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
468c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
478c2ecf20Sopenharmony_ci	},
488c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
498c2ecf20Sopenharmony_ci	.result = ACCEPT,
508c2ecf20Sopenharmony_ci	.retval = 1,
518c2ecf20Sopenharmony_ci},
528c2ecf20Sopenharmony_ci{
538c2ecf20Sopenharmony_ci	"calls: multiple ret types in subprog 1",
548c2ecf20Sopenharmony_ci	.insns = {
558c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
568c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
578c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
588c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
598c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
608c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
618c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
628c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
638c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
648c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
658c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
668c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
678c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
688c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
698c2ecf20Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_0, 42),
708c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
718c2ecf20Sopenharmony_ci	},
728c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
738c2ecf20Sopenharmony_ci	.result = REJECT,
748c2ecf20Sopenharmony_ci	.errstr = "R0 invalid mem access 'inv'",
758c2ecf20Sopenharmony_ci},
768c2ecf20Sopenharmony_ci{
778c2ecf20Sopenharmony_ci	"calls: multiple ret types in subprog 2",
788c2ecf20Sopenharmony_ci	.insns = {
798c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
808c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
818c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
828c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
838c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
848c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
858c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
868c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
878c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
888c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
898c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
908c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
918c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
928c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
938c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9),
948c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
958c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
968c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
978c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
988c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
998c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
1008c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6,
1018c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
1028c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64),
1038c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1048c2ecf20Sopenharmony_ci	},
1058c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
1068c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 16 },
1078c2ecf20Sopenharmony_ci	.result = REJECT,
1088c2ecf20Sopenharmony_ci	.errstr = "R0 min value is outside of the allowed memory range",
1098c2ecf20Sopenharmony_ci},
1108c2ecf20Sopenharmony_ci{
1118c2ecf20Sopenharmony_ci	"calls: overlapping caller/callee",
1128c2ecf20Sopenharmony_ci	.insns = {
1138c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0),
1148c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1158c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1168c2ecf20Sopenharmony_ci	},
1178c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1188c2ecf20Sopenharmony_ci	.errstr = "last insn is not an exit or jmp",
1198c2ecf20Sopenharmony_ci	.result = REJECT,
1208c2ecf20Sopenharmony_ci},
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	"calls: wrong recursive calls",
1238c2ecf20Sopenharmony_ci	.insns = {
1248c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
1258c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
1268c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
1278c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
1288c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
1298c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1308c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1318c2ecf20Sopenharmony_ci	},
1328c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1338c2ecf20Sopenharmony_ci	.errstr = "jump out of range",
1348c2ecf20Sopenharmony_ci	.result = REJECT,
1358c2ecf20Sopenharmony_ci},
1368c2ecf20Sopenharmony_ci{
1378c2ecf20Sopenharmony_ci	"calls: wrong src reg",
1388c2ecf20Sopenharmony_ci	.insns = {
1398c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0),
1408c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1418c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1428c2ecf20Sopenharmony_ci	},
1438c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1448c2ecf20Sopenharmony_ci	.errstr = "BPF_CALL uses reserved fields",
1458c2ecf20Sopenharmony_ci	.result = REJECT,
1468c2ecf20Sopenharmony_ci},
1478c2ecf20Sopenharmony_ci{
1488c2ecf20Sopenharmony_ci	"calls: wrong off value",
1498c2ecf20Sopenharmony_ci	.insns = {
1508c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2),
1518c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1528c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1538c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
1548c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1558c2ecf20Sopenharmony_ci	},
1568c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1578c2ecf20Sopenharmony_ci	.errstr = "BPF_CALL uses reserved fields",
1588c2ecf20Sopenharmony_ci	.result = REJECT,
1598c2ecf20Sopenharmony_ci},
1608c2ecf20Sopenharmony_ci{
1618c2ecf20Sopenharmony_ci	"calls: jump back loop",
1628c2ecf20Sopenharmony_ci	.insns = {
1638c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
1648c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1658c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1668c2ecf20Sopenharmony_ci	},
1678c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1688c2ecf20Sopenharmony_ci	.errstr = "back-edge from insn 0 to 0",
1698c2ecf20Sopenharmony_ci	.result = REJECT,
1708c2ecf20Sopenharmony_ci},
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	"calls: conditional call",
1738c2ecf20Sopenharmony_ci	.insns = {
1748c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1758c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
1768c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
1778c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
1788c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1798c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1808c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
1818c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1828c2ecf20Sopenharmony_ci	},
1838c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
1848c2ecf20Sopenharmony_ci	.errstr = "jump out of range",
1858c2ecf20Sopenharmony_ci	.result = REJECT,
1868c2ecf20Sopenharmony_ci},
1878c2ecf20Sopenharmony_ci{
1888c2ecf20Sopenharmony_ci	"calls: conditional call 2",
1898c2ecf20Sopenharmony_ci	.insns = {
1908c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
1918c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
1928c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
1938c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
1948c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1958c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1968c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
1978c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
1988c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
1998c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2008c2ecf20Sopenharmony_ci	},
2018c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
2028c2ecf20Sopenharmony_ci	.result = ACCEPT,
2038c2ecf20Sopenharmony_ci},
2048c2ecf20Sopenharmony_ci{
2058c2ecf20Sopenharmony_ci	"calls: conditional call 3",
2068c2ecf20Sopenharmony_ci	.insns = {
2078c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2088c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
2098c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
2108c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
2118c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2128c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2138c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2148c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
2158c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
2168c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
2178c2ecf20Sopenharmony_ci	},
2188c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
2198c2ecf20Sopenharmony_ci	.errstr_unpriv = "back-edge from insn",
2208c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
2218c2ecf20Sopenharmony_ci	.result = ACCEPT,
2228c2ecf20Sopenharmony_ci	.retval = 1,
2238c2ecf20Sopenharmony_ci},
2248c2ecf20Sopenharmony_ci{
2258c2ecf20Sopenharmony_ci	"calls: conditional call 4",
2268c2ecf20Sopenharmony_ci	.insns = {
2278c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2288c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
2298c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
2308c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
2318c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2328c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2338c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2348c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -5),
2358c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
2368c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2378c2ecf20Sopenharmony_ci	},
2388c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
2398c2ecf20Sopenharmony_ci	.result = ACCEPT,
2408c2ecf20Sopenharmony_ci},
2418c2ecf20Sopenharmony_ci{
2428c2ecf20Sopenharmony_ci	"calls: conditional call 5",
2438c2ecf20Sopenharmony_ci	.insns = {
2448c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2458c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
2468c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
2478c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
2488c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2498c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2508c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
2518c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
2528c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
2538c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2548c2ecf20Sopenharmony_ci	},
2558c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2568c2ecf20Sopenharmony_ci	.result = ACCEPT,
2578c2ecf20Sopenharmony_ci	.retval = 1,
2588c2ecf20Sopenharmony_ci},
2598c2ecf20Sopenharmony_ci{
2608c2ecf20Sopenharmony_ci	"calls: conditional call 6",
2618c2ecf20Sopenharmony_ci	.insns = {
2628c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
2638c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
2648c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
2658c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
2668c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2678c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
2688c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
2698c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2708c2ecf20Sopenharmony_ci	},
2718c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2728c2ecf20Sopenharmony_ci	.errstr = "infinite loop detected",
2738c2ecf20Sopenharmony_ci	.result = REJECT,
2748c2ecf20Sopenharmony_ci},
2758c2ecf20Sopenharmony_ci{
2768c2ecf20Sopenharmony_ci	"calls: using r0 returned by callee",
2778c2ecf20Sopenharmony_ci	.insns = {
2788c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
2798c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2808c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
2818c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2828c2ecf20Sopenharmony_ci	},
2838c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
2848c2ecf20Sopenharmony_ci	.result = ACCEPT,
2858c2ecf20Sopenharmony_ci},
2868c2ecf20Sopenharmony_ci{
2878c2ecf20Sopenharmony_ci	"calls: using uninit r0 from callee",
2888c2ecf20Sopenharmony_ci	.insns = {
2898c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
2908c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2918c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
2928c2ecf20Sopenharmony_ci	},
2938c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
2948c2ecf20Sopenharmony_ci	.errstr = "!read_ok",
2958c2ecf20Sopenharmony_ci	.result = REJECT,
2968c2ecf20Sopenharmony_ci},
2978c2ecf20Sopenharmony_ci{
2988c2ecf20Sopenharmony_ci	"calls: callee is using r1",
2998c2ecf20Sopenharmony_ci	.insns = {
3008c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
3018c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3028c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
3038c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
3048c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3058c2ecf20Sopenharmony_ci	},
3068c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_ACT,
3078c2ecf20Sopenharmony_ci	.result = ACCEPT,
3088c2ecf20Sopenharmony_ci	.retval = TEST_DATA_LEN,
3098c2ecf20Sopenharmony_ci},
3108c2ecf20Sopenharmony_ci{
3118c2ecf20Sopenharmony_ci	"calls: callee using args1",
3128c2ecf20Sopenharmony_ci	.insns = {
3138c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
3148c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3158c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
3168c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3178c2ecf20Sopenharmony_ci	},
3188c2ecf20Sopenharmony_ci	.errstr_unpriv = "allowed for",
3198c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
3208c2ecf20Sopenharmony_ci	.result = ACCEPT,
3218c2ecf20Sopenharmony_ci	.retval = POINTER_VALUE,
3228c2ecf20Sopenharmony_ci},
3238c2ecf20Sopenharmony_ci{
3248c2ecf20Sopenharmony_ci	"calls: callee using wrong args2",
3258c2ecf20Sopenharmony_ci	.insns = {
3268c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
3278c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3288c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
3298c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3308c2ecf20Sopenharmony_ci	},
3318c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
3328c2ecf20Sopenharmony_ci	.errstr = "R2 !read_ok",
3338c2ecf20Sopenharmony_ci	.result = REJECT,
3348c2ecf20Sopenharmony_ci},
3358c2ecf20Sopenharmony_ci{
3368c2ecf20Sopenharmony_ci	"calls: callee using two args",
3378c2ecf20Sopenharmony_ci	.insns = {
3388c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
3398c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6,
3408c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
3418c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6,
3428c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
3438c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
3448c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3458c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
3468c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
3478c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3488c2ecf20Sopenharmony_ci	},
3498c2ecf20Sopenharmony_ci	.errstr_unpriv = "allowed for",
3508c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
3518c2ecf20Sopenharmony_ci	.result = ACCEPT,
3528c2ecf20Sopenharmony_ci	.retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN,
3538c2ecf20Sopenharmony_ci},
3548c2ecf20Sopenharmony_ci{
3558c2ecf20Sopenharmony_ci	"calls: callee changing pkt pointers",
3568c2ecf20Sopenharmony_ci	.insns = {
3578c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, offsetof(struct xdp_md, data)),
3588c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
3598c2ecf20Sopenharmony_ci		    offsetof(struct xdp_md, data_end)),
3608c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_8, BPF_REG_6),
3618c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8),
3628c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2),
3638c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
3648c2ecf20Sopenharmony_ci	/* clear_all_pkt_pointers() has to walk all frames
3658c2ecf20Sopenharmony_ci	 * to make sure that pkt pointers in the caller
3668c2ecf20Sopenharmony_ci	 * are cleared when callee is calling a helper that
3678c2ecf20Sopenharmony_ci	 * adjusts packet size
3688c2ecf20Sopenharmony_ci	 */
3698c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
3708c2ecf20Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_0, 0),
3718c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3728c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 0),
3738c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_xdp_adjust_head),
3748c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3758c2ecf20Sopenharmony_ci	},
3768c2ecf20Sopenharmony_ci	.result = REJECT,
3778c2ecf20Sopenharmony_ci	.errstr = "R6 invalid mem access 'inv'",
3788c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
3798c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
3808c2ecf20Sopenharmony_ci},
3818c2ecf20Sopenharmony_ci{
3828c2ecf20Sopenharmony_ci	"calls: ptr null check in subprog",
3838c2ecf20Sopenharmony_ci	.insns = {
3848c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
3858c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
3868c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
3878c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
3888c2ecf20Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
3898c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
3908c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
3918c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
3928c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
3938c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
3948c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3958c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
3968c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
3978c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
3988c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
3998c2ecf20Sopenharmony_ci	},
4008c2ecf20Sopenharmony_ci	.errstr_unpriv = "function calls to other bpf functions are allowed for",
4018c2ecf20Sopenharmony_ci	.fixup_map_hash_48b = { 3 },
4028c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
4038c2ecf20Sopenharmony_ci	.result = ACCEPT,
4048c2ecf20Sopenharmony_ci	.retval = 0,
4058c2ecf20Sopenharmony_ci},
4068c2ecf20Sopenharmony_ci{
4078c2ecf20Sopenharmony_ci	"calls: two calls with args",
4088c2ecf20Sopenharmony_ci	.insns = {
4098c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4118c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
4128c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
4138c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
4148c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
4158c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
4168c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
4178c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
4188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4198c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
4208c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
4218c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4228c2ecf20Sopenharmony_ci	},
4238c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4248c2ecf20Sopenharmony_ci	.result = ACCEPT,
4258c2ecf20Sopenharmony_ci	.retval = TEST_DATA_LEN + TEST_DATA_LEN,
4268c2ecf20Sopenharmony_ci},
4278c2ecf20Sopenharmony_ci{
4288c2ecf20Sopenharmony_ci	"calls: calls with stack arith",
4298c2ecf20Sopenharmony_ci	.insns = {
4308c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4318c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
4328c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4338c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4348c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
4358c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4368c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4378c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
4388c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
4398c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
4408c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4418c2ecf20Sopenharmony_ci	},
4428c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4438c2ecf20Sopenharmony_ci	.result = ACCEPT,
4448c2ecf20Sopenharmony_ci	.retval = 42,
4458c2ecf20Sopenharmony_ci},
4468c2ecf20Sopenharmony_ci{
4478c2ecf20Sopenharmony_ci	"calls: calls with misaligned stack access",
4488c2ecf20Sopenharmony_ci	.insns = {
4498c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
4508c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
4518c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4528c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4538c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61),
4548c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4558c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4568c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
4578c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
4588c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
4598c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4608c2ecf20Sopenharmony_ci	},
4618c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4628c2ecf20Sopenharmony_ci	.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
4638c2ecf20Sopenharmony_ci	.errstr = "misaligned stack access",
4648c2ecf20Sopenharmony_ci	.result = REJECT,
4658c2ecf20Sopenharmony_ci},
4668c2ecf20Sopenharmony_ci{
4678c2ecf20Sopenharmony_ci	"calls: calls control flow, jump test",
4688c2ecf20Sopenharmony_ci	.insns = {
4698c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
4708c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
4718c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 43),
4728c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4738c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -3),
4748c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4758c2ecf20Sopenharmony_ci	},
4768c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4778c2ecf20Sopenharmony_ci	.result = ACCEPT,
4788c2ecf20Sopenharmony_ci	.retval = 43,
4798c2ecf20Sopenharmony_ci},
4808c2ecf20Sopenharmony_ci{
4818c2ecf20Sopenharmony_ci	"calls: calls control flow, jump test 2",
4828c2ecf20Sopenharmony_ci	.insns = {
4838c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
4848c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
4858c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 43),
4868c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4878c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
4888c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4898c2ecf20Sopenharmony_ci	},
4908c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4918c2ecf20Sopenharmony_ci	.errstr = "jump out of range from insn 1 to 4",
4928c2ecf20Sopenharmony_ci	.result = REJECT,
4938c2ecf20Sopenharmony_ci},
4948c2ecf20Sopenharmony_ci{
4958c2ecf20Sopenharmony_ci	"calls: two calls with bad jump",
4968c2ecf20Sopenharmony_ci	.insns = {
4978c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
4988c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
4998c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
5008c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
5018c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
5028c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
5038c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
5048c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
5058c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
5068c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5078c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
5088c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
5098c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
5108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5118c2ecf20Sopenharmony_ci	},
5128c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5138c2ecf20Sopenharmony_ci	.errstr = "jump out of range from insn 11 to 9",
5148c2ecf20Sopenharmony_ci	.result = REJECT,
5158c2ecf20Sopenharmony_ci},
5168c2ecf20Sopenharmony_ci{
5178c2ecf20Sopenharmony_ci	"calls: recursive call. test1",
5188c2ecf20Sopenharmony_ci	.insns = {
5198c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5208c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5218c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
5228c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5238c2ecf20Sopenharmony_ci	},
5248c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5258c2ecf20Sopenharmony_ci	.errstr = "back-edge",
5268c2ecf20Sopenharmony_ci	.result = REJECT,
5278c2ecf20Sopenharmony_ci},
5288c2ecf20Sopenharmony_ci{
5298c2ecf20Sopenharmony_ci	"calls: recursive call. test2",
5308c2ecf20Sopenharmony_ci	.insns = {
5318c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5328c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5338c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
5348c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5358c2ecf20Sopenharmony_ci	},
5368c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5378c2ecf20Sopenharmony_ci	.errstr = "back-edge",
5388c2ecf20Sopenharmony_ci	.result = REJECT,
5398c2ecf20Sopenharmony_ci},
5408c2ecf20Sopenharmony_ci{
5418c2ecf20Sopenharmony_ci	"calls: unreachable code",
5428c2ecf20Sopenharmony_ci	.insns = {
5438c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5448c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5458c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5468c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5478c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
5488c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5498c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
5508c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5518c2ecf20Sopenharmony_ci	},
5528c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5538c2ecf20Sopenharmony_ci	.errstr = "unreachable insn 6",
5548c2ecf20Sopenharmony_ci	.result = REJECT,
5558c2ecf20Sopenharmony_ci},
5568c2ecf20Sopenharmony_ci{
5578c2ecf20Sopenharmony_ci	"calls: invalid call",
5588c2ecf20Sopenharmony_ci	.insns = {
5598c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5608c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5618c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4),
5628c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5638c2ecf20Sopenharmony_ci	},
5648c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5658c2ecf20Sopenharmony_ci	.errstr = "invalid destination",
5668c2ecf20Sopenharmony_ci	.result = REJECT,
5678c2ecf20Sopenharmony_ci},
5688c2ecf20Sopenharmony_ci{
5698c2ecf20Sopenharmony_ci	"calls: invalid call 2",
5708c2ecf20Sopenharmony_ci	.insns = {
5718c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
5728c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5738c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff),
5748c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5758c2ecf20Sopenharmony_ci	},
5768c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5778c2ecf20Sopenharmony_ci	.errstr = "invalid destination",
5788c2ecf20Sopenharmony_ci	.result = REJECT,
5798c2ecf20Sopenharmony_ci},
5808c2ecf20Sopenharmony_ci{
5818c2ecf20Sopenharmony_ci	"calls: jumping across function bodies. test1",
5828c2ecf20Sopenharmony_ci	.insns = {
5838c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5848c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
5858c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5868c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
5878c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
5888c2ecf20Sopenharmony_ci	},
5898c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
5908c2ecf20Sopenharmony_ci	.errstr = "jump out of range",
5918c2ecf20Sopenharmony_ci	.result = REJECT,
5928c2ecf20Sopenharmony_ci},
5938c2ecf20Sopenharmony_ci{
5948c2ecf20Sopenharmony_ci	"calls: jumping across function bodies. test2",
5958c2ecf20Sopenharmony_ci	.insns = {
5968c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
5978c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
5988c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
5998c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6008c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6018c2ecf20Sopenharmony_ci	},
6028c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6038c2ecf20Sopenharmony_ci	.errstr = "jump out of range",
6048c2ecf20Sopenharmony_ci	.result = REJECT,
6058c2ecf20Sopenharmony_ci},
6068c2ecf20Sopenharmony_ci{
6078c2ecf20Sopenharmony_ci	"calls: call without exit",
6088c2ecf20Sopenharmony_ci	.insns = {
6098c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
6108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6118c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
6128c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6138c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
6148c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2),
6158c2ecf20Sopenharmony_ci	},
6168c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6178c2ecf20Sopenharmony_ci	.errstr = "not an exit",
6188c2ecf20Sopenharmony_ci	.result = REJECT,
6198c2ecf20Sopenharmony_ci},
6208c2ecf20Sopenharmony_ci{
6218c2ecf20Sopenharmony_ci	"calls: call into middle of ld_imm64",
6228c2ecf20Sopenharmony_ci	.insns = {
6238c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
6248c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
6258c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
6268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6278c2ecf20Sopenharmony_ci	BPF_LD_IMM64(BPF_REG_0, 0),
6288c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6298c2ecf20Sopenharmony_ci	},
6308c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6318c2ecf20Sopenharmony_ci	.errstr = "last insn",
6328c2ecf20Sopenharmony_ci	.result = REJECT,
6338c2ecf20Sopenharmony_ci},
6348c2ecf20Sopenharmony_ci{
6358c2ecf20Sopenharmony_ci	"calls: call into middle of other call",
6368c2ecf20Sopenharmony_ci	.insns = {
6378c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
6388c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
6398c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
6408c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6418c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
6428c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
6438c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6448c2ecf20Sopenharmony_ci	},
6458c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6468c2ecf20Sopenharmony_ci	.errstr = "last insn",
6478c2ecf20Sopenharmony_ci	.result = REJECT,
6488c2ecf20Sopenharmony_ci},
6498c2ecf20Sopenharmony_ci{
6508c2ecf20Sopenharmony_ci	"calls: subprog call with ld_abs in main prog",
6518c2ecf20Sopenharmony_ci	.insns = {
6528c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6538c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_B, 0),
6548c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_H, 0),
6558c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_W, 0),
6568c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
6578c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
6588c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
6598c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
6608c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_B, 0),
6618c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_H, 0),
6628c2ecf20Sopenharmony_ci	BPF_LD_ABS(BPF_W, 0),
6638c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6648c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 1),
6658c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_3, 2),
6668c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push),
6678c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6688c2ecf20Sopenharmony_ci	},
6698c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6708c2ecf20Sopenharmony_ci	.result = ACCEPT,
6718c2ecf20Sopenharmony_ci},
6728c2ecf20Sopenharmony_ci{
6738c2ecf20Sopenharmony_ci	"calls: two calls with bad fallthrough",
6748c2ecf20Sopenharmony_ci	.insns = {
6758c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
6768c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6778c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
6788c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
6798c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
6808c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
6818c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
6828c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
6838c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
6848c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_0),
6858c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
6868c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
6878c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
6888c2ecf20Sopenharmony_ci	},
6898c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
6908c2ecf20Sopenharmony_ci	.errstr = "not an exit",
6918c2ecf20Sopenharmony_ci	.result = REJECT,
6928c2ecf20Sopenharmony_ci},
6938c2ecf20Sopenharmony_ci{
6948c2ecf20Sopenharmony_ci	"calls: two calls with stack read",
6958c2ecf20Sopenharmony_ci	.insns = {
6968c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
6978c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
6988c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
6998c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
7008c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7018c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7028c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
7038c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
7048c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
7058c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
7068c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
7078c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
7088c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7098c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
7108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7118c2ecf20Sopenharmony_ci	},
7128c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
7138c2ecf20Sopenharmony_ci	.result = ACCEPT,
7148c2ecf20Sopenharmony_ci},
7158c2ecf20Sopenharmony_ci{
7168c2ecf20Sopenharmony_ci	"calls: two calls with stack write",
7178c2ecf20Sopenharmony_ci	.insns = {
7188c2ecf20Sopenharmony_ci	/* main prog */
7198c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
7208c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
7218c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
7228c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
7238c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
7248c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
7258c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
7268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7278c2ecf20Sopenharmony_ci
7288c2ecf20Sopenharmony_ci	/* subprog 1 */
7298c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
7308c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
7318c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7),
7328c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
7338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
7348c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
7358c2ecf20Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
7368c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_8),
7378c2ecf20Sopenharmony_ci	/* write into stack frame of main prog */
7388c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
7398c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7408c2ecf20Sopenharmony_ci
7418c2ecf20Sopenharmony_ci	/* subprog 2 */
7428c2ecf20Sopenharmony_ci	/* read from stack frame of main prog */
7438c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
7448c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7458c2ecf20Sopenharmony_ci	},
7468c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
7478c2ecf20Sopenharmony_ci	.result = ACCEPT,
7488c2ecf20Sopenharmony_ci},
7498c2ecf20Sopenharmony_ci{
7508c2ecf20Sopenharmony_ci	"calls: stack overflow using two frames (pre-call access)",
7518c2ecf20Sopenharmony_ci	.insns = {
7528c2ecf20Sopenharmony_ci	/* prog 1 */
7538c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
7548c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1),
7558c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7568c2ecf20Sopenharmony_ci
7578c2ecf20Sopenharmony_ci	/* prog 2 */
7588c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
7598c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
7608c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7618c2ecf20Sopenharmony_ci	},
7628c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
7638c2ecf20Sopenharmony_ci	.errstr = "combined stack size",
7648c2ecf20Sopenharmony_ci	.result = REJECT,
7658c2ecf20Sopenharmony_ci},
7668c2ecf20Sopenharmony_ci{
7678c2ecf20Sopenharmony_ci	"calls: stack overflow using two frames (post-call access)",
7688c2ecf20Sopenharmony_ci	.insns = {
7698c2ecf20Sopenharmony_ci	/* prog 1 */
7708c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2),
7718c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
7728c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7738c2ecf20Sopenharmony_ci
7748c2ecf20Sopenharmony_ci	/* prog 2 */
7758c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
7768c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
7778c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7788c2ecf20Sopenharmony_ci	},
7798c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
7808c2ecf20Sopenharmony_ci	.errstr = "combined stack size",
7818c2ecf20Sopenharmony_ci	.result = REJECT,
7828c2ecf20Sopenharmony_ci},
7838c2ecf20Sopenharmony_ci{
7848c2ecf20Sopenharmony_ci	"calls: stack depth check using three frames. test1",
7858c2ecf20Sopenharmony_ci	.insns = {
7868c2ecf20Sopenharmony_ci	/* main */
7878c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
7888c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
7898c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
7908c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
7918c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7928c2ecf20Sopenharmony_ci	/* A */
7938c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
7948c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7958c2ecf20Sopenharmony_ci	/* B */
7968c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
7978c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
7988c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
7998c2ecf20Sopenharmony_ci	},
8008c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
8018c2ecf20Sopenharmony_ci	/* stack_main=32, stack_A=256, stack_B=64
8028c2ecf20Sopenharmony_ci	 * and max(main+A, main+A+B) < 512
8038c2ecf20Sopenharmony_ci	 */
8048c2ecf20Sopenharmony_ci	.result = ACCEPT,
8058c2ecf20Sopenharmony_ci},
8068c2ecf20Sopenharmony_ci{
8078c2ecf20Sopenharmony_ci	"calls: stack depth check using three frames. test2",
8088c2ecf20Sopenharmony_ci	.insns = {
8098c2ecf20Sopenharmony_ci	/* main */
8108c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
8118c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
8128c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
8138c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
8148c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8158c2ecf20Sopenharmony_ci	/* A */
8168c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
8178c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8188c2ecf20Sopenharmony_ci	/* B */
8198c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
8208c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
8218c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8228c2ecf20Sopenharmony_ci	},
8238c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
8248c2ecf20Sopenharmony_ci	/* stack_main=32, stack_A=64, stack_B=256
8258c2ecf20Sopenharmony_ci	 * and max(main+A, main+A+B) < 512
8268c2ecf20Sopenharmony_ci	 */
8278c2ecf20Sopenharmony_ci	.result = ACCEPT,
8288c2ecf20Sopenharmony_ci},
8298c2ecf20Sopenharmony_ci{
8308c2ecf20Sopenharmony_ci	"calls: stack depth check using three frames. test3",
8318c2ecf20Sopenharmony_ci	.insns = {
8328c2ecf20Sopenharmony_ci	/* main */
8338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
8348c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
8358c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
8368c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */
8378c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1),
8388c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
8398c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
8408c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8418c2ecf20Sopenharmony_ci	/* A */
8428c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1),
8438c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8448c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0),
8458c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -3),
8468c2ecf20Sopenharmony_ci	/* B */
8478c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1),
8488c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */
8498c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
8508c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8518c2ecf20Sopenharmony_ci	},
8528c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
8538c2ecf20Sopenharmony_ci	/* stack_main=64, stack_A=224, stack_B=256
8548c2ecf20Sopenharmony_ci	 * and max(main+A, main+A+B) > 512
8558c2ecf20Sopenharmony_ci	 */
8568c2ecf20Sopenharmony_ci	.errstr = "combined stack",
8578c2ecf20Sopenharmony_ci	.result = REJECT,
8588c2ecf20Sopenharmony_ci},
8598c2ecf20Sopenharmony_ci{
8608c2ecf20Sopenharmony_ci	"calls: stack depth check using three frames. test4",
8618c2ecf20Sopenharmony_ci	/* void main(void) {
8628c2ecf20Sopenharmony_ci	 *   func1(0);
8638c2ecf20Sopenharmony_ci	 *   func1(1);
8648c2ecf20Sopenharmony_ci	 *   func2(1);
8658c2ecf20Sopenharmony_ci	 * }
8668c2ecf20Sopenharmony_ci	 * void func1(int alloc_or_recurse) {
8678c2ecf20Sopenharmony_ci	 *   if (alloc_or_recurse) {
8688c2ecf20Sopenharmony_ci	 *     frame_pointer[-300] = 1;
8698c2ecf20Sopenharmony_ci	 *   } else {
8708c2ecf20Sopenharmony_ci	 *     func2(alloc_or_recurse);
8718c2ecf20Sopenharmony_ci	 *   }
8728c2ecf20Sopenharmony_ci	 * }
8738c2ecf20Sopenharmony_ci	 * void func2(int alloc_or_recurse) {
8748c2ecf20Sopenharmony_ci	 *   if (alloc_or_recurse) {
8758c2ecf20Sopenharmony_ci	 *     frame_pointer[-300] = 1;
8768c2ecf20Sopenharmony_ci	 *   }
8778c2ecf20Sopenharmony_ci	 * }
8788c2ecf20Sopenharmony_ci	 */
8798c2ecf20Sopenharmony_ci	.insns = {
8808c2ecf20Sopenharmony_ci	/* main */
8818c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 0),
8828c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
8838c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 1),
8848c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
8858c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 1),
8868c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */
8878c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
8888c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8898c2ecf20Sopenharmony_ci	/* A */
8908c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2),
8918c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
8928c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8938c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
8948c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8958c2ecf20Sopenharmony_ci	/* B */
8968c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
8978c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
8988c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
8998c2ecf20Sopenharmony_ci	},
9008c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
9018c2ecf20Sopenharmony_ci	.result = REJECT,
9028c2ecf20Sopenharmony_ci	.errstr = "combined stack",
9038c2ecf20Sopenharmony_ci},
9048c2ecf20Sopenharmony_ci{
9058c2ecf20Sopenharmony_ci	"calls: stack depth check using three frames. test5",
9068c2ecf20Sopenharmony_ci	.insns = {
9078c2ecf20Sopenharmony_ci	/* main */
9088c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */
9098c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9108c2ecf20Sopenharmony_ci	/* A */
9118c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
9128c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9138c2ecf20Sopenharmony_ci	/* B */
9148c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */
9158c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9168c2ecf20Sopenharmony_ci	/* C */
9178c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */
9188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9198c2ecf20Sopenharmony_ci	/* D */
9208c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */
9218c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9228c2ecf20Sopenharmony_ci	/* E */
9238c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */
9248c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9258c2ecf20Sopenharmony_ci	/* F */
9268c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */
9278c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9288c2ecf20Sopenharmony_ci	/* G */
9298c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */
9308c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9318c2ecf20Sopenharmony_ci	/* H */
9328c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
9338c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9348c2ecf20Sopenharmony_ci	},
9358c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
9368c2ecf20Sopenharmony_ci	.errstr = "call stack",
9378c2ecf20Sopenharmony_ci	.result = REJECT,
9388c2ecf20Sopenharmony_ci},
9398c2ecf20Sopenharmony_ci{
9408c2ecf20Sopenharmony_ci	"calls: stack depth check in dead code",
9418c2ecf20Sopenharmony_ci	.insns = {
9428c2ecf20Sopenharmony_ci	/* main */
9438c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 0),
9448c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */
9458c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9468c2ecf20Sopenharmony_ci	/* A */
9478c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
9488c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), /* call B */
9498c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
9508c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9518c2ecf20Sopenharmony_ci	/* B */
9528c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */
9538c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9548c2ecf20Sopenharmony_ci	/* C */
9558c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */
9568c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9578c2ecf20Sopenharmony_ci	/* D */
9588c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */
9598c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9608c2ecf20Sopenharmony_ci	/* E */
9618c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */
9628c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9638c2ecf20Sopenharmony_ci	/* F */
9648c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */
9658c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9668c2ecf20Sopenharmony_ci	/* G */
9678c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */
9688c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9698c2ecf20Sopenharmony_ci	/* H */
9708c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
9718c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9728c2ecf20Sopenharmony_ci	},
9738c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
9748c2ecf20Sopenharmony_ci	.errstr = "call stack",
9758c2ecf20Sopenharmony_ci	.result = REJECT,
9768c2ecf20Sopenharmony_ci},
9778c2ecf20Sopenharmony_ci{
9788c2ecf20Sopenharmony_ci	"calls: spill into caller stack frame",
9798c2ecf20Sopenharmony_ci	.insns = {
9808c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
9818c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
9828c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
9838c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
9848c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9858c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0),
9868c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
9878c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
9888c2ecf20Sopenharmony_ci	},
9898c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
9908c2ecf20Sopenharmony_ci	.errstr = "cannot spill",
9918c2ecf20Sopenharmony_ci	.result = REJECT,
9928c2ecf20Sopenharmony_ci},
9938c2ecf20Sopenharmony_ci{
9948c2ecf20Sopenharmony_ci	"calls: write into caller stack frame",
9958c2ecf20Sopenharmony_ci	.insns = {
9968c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
9978c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
9988c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
9998c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10008c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
10018c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10028c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42),
10038c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
10048c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10058c2ecf20Sopenharmony_ci	},
10068c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
10078c2ecf20Sopenharmony_ci	.result = ACCEPT,
10088c2ecf20Sopenharmony_ci	.retval = 42,
10098c2ecf20Sopenharmony_ci},
10108c2ecf20Sopenharmony_ci{
10118c2ecf20Sopenharmony_ci	"calls: write into callee stack frame",
10128c2ecf20Sopenharmony_ci	.insns = {
10138c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10148c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
10158c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10168c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
10178c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8),
10188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10198c2ecf20Sopenharmony_ci	},
10208c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
10218c2ecf20Sopenharmony_ci	.errstr = "cannot return stack pointer",
10228c2ecf20Sopenharmony_ci	.result = REJECT,
10238c2ecf20Sopenharmony_ci},
10248c2ecf20Sopenharmony_ci{
10258c2ecf20Sopenharmony_ci	"calls: two calls with stack write and void return",
10268c2ecf20Sopenharmony_ci	.insns = {
10278c2ecf20Sopenharmony_ci	/* main prog */
10288c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
10298c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10308c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10318c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10328c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10338c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10348c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
10358c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	/* subprog 1 */
10388c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10398c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
10408c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
10418c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
10428c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10438c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_ci	/* subprog 2 */
10468c2ecf20Sopenharmony_ci	/* write into stack frame of main prog */
10478c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
10488c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* void return */
10498c2ecf20Sopenharmony_ci	},
10508c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
10518c2ecf20Sopenharmony_ci	.result = ACCEPT,
10528c2ecf20Sopenharmony_ci},
10538c2ecf20Sopenharmony_ci{
10548c2ecf20Sopenharmony_ci	"calls: ambiguous return value",
10558c2ecf20Sopenharmony_ci	.insns = {
10568c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10578c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
10588c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
10598c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
10608c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
10618c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
10628c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10638c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
10648c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
10658c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10668c2ecf20Sopenharmony_ci	},
10678c2ecf20Sopenharmony_ci	.errstr_unpriv = "allowed for",
10688c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
10698c2ecf20Sopenharmony_ci	.errstr = "R0 !read_ok",
10708c2ecf20Sopenharmony_ci	.result = REJECT,
10718c2ecf20Sopenharmony_ci},
10728c2ecf20Sopenharmony_ci{
10738c2ecf20Sopenharmony_ci	"calls: two calls that return map_value",
10748c2ecf20Sopenharmony_ci	.insns = {
10758c2ecf20Sopenharmony_ci	/* main prog */
10768c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
10778c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10788c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10798c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
10808c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
10818c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
10828c2ecf20Sopenharmony_ci
10838c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
10848c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
10858c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
10868c2ecf20Sopenharmony_ci	/* write into map value */
10878c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10888c2ecf20Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
10898c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
10908c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
10918c2ecf20Sopenharmony_ci	/* write into map value */
10928c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
10938c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
10948c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
10958c2ecf20Sopenharmony_ci
10968c2ecf20Sopenharmony_ci	/* subprog 1 */
10978c2ecf20Sopenharmony_ci	/* call 3rd function twice */
10988c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
10998c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
11008c2ecf20Sopenharmony_ci	/* first time with fp-8 */
11018c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11028c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
11038c2ecf20Sopenharmony_ci	/* second time with fp-16 */
11048c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
11058c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
11068c2ecf20Sopenharmony_ci
11078c2ecf20Sopenharmony_ci	/* subprog 2 */
11088c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11098c2ecf20Sopenharmony_ci	/* lookup from map */
11108c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11118c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11128c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11138c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
11148c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
11158c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
11168c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11178c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
11188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
11198c2ecf20Sopenharmony_ci	},
11208c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
11218c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
11228c2ecf20Sopenharmony_ci	.result = ACCEPT,
11238c2ecf20Sopenharmony_ci},
11248c2ecf20Sopenharmony_ci{
11258c2ecf20Sopenharmony_ci	"calls: two calls that return map_value with bool condition",
11268c2ecf20Sopenharmony_ci	.insns = {
11278c2ecf20Sopenharmony_ci	/* main prog */
11288c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
11298c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
11308c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
11318c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11328c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
11338c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
11348c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
11358c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
11368c2ecf20Sopenharmony_ci
11378c2ecf20Sopenharmony_ci	/* subprog 1 */
11388c2ecf20Sopenharmony_ci	/* call 3rd function twice */
11398c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11408c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
11418c2ecf20Sopenharmony_ci	/* first time with fp-8 */
11428c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
11438c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
11448c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
11458c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
11468c2ecf20Sopenharmony_ci	/* write into map value */
11478c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11488c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
11498c2ecf20Sopenharmony_ci	/* second time with fp-16 */
11508c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
11518c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
11528c2ecf20Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
11538c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
11548c2ecf20Sopenharmony_ci	/* write into map value */
11558c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
11568c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
11578c2ecf20Sopenharmony_ci
11588c2ecf20Sopenharmony_ci	/* subprog 2 */
11598c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11608c2ecf20Sopenharmony_ci	/* lookup from map */
11618c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11628c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11638c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
11648c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
11658c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
11668c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
11678c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
11688c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
11698c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
11708c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
11718c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
11728c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* return 1 */
11738c2ecf20Sopenharmony_ci	},
11748c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
11758c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
11768c2ecf20Sopenharmony_ci	.result = ACCEPT,
11778c2ecf20Sopenharmony_ci},
11788c2ecf20Sopenharmony_ci{
11798c2ecf20Sopenharmony_ci	"calls: two calls that return map_value with incorrect bool check",
11808c2ecf20Sopenharmony_ci	.insns = {
11818c2ecf20Sopenharmony_ci	/* main prog */
11828c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
11838c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
11848c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
11858c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
11868c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
11878c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
11888c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
11898c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
11908c2ecf20Sopenharmony_ci
11918c2ecf20Sopenharmony_ci	/* subprog 1 */
11928c2ecf20Sopenharmony_ci	/* call 3rd function twice */
11938c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
11948c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
11958c2ecf20Sopenharmony_ci	/* first time with fp-8 */
11968c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
11978c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
11988c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
11998c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
12008c2ecf20Sopenharmony_ci	/* write into map value */
12018c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
12028c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
12038c2ecf20Sopenharmony_ci	/* second time with fp-16 */
12048c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
12058c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
12068c2ecf20Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
12078c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
12088c2ecf20Sopenharmony_ci	/* write into map value */
12098c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
12108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
12118c2ecf20Sopenharmony_ci
12128c2ecf20Sopenharmony_ci	/* subprog 2 */
12138c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
12148c2ecf20Sopenharmony_ci	/* lookup from map */
12158c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
12168c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
12178c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
12188c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
12198c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
12208c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
12218c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
12228c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
12238c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
12248c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
12258c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
12268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(), /* return 1 */
12278c2ecf20Sopenharmony_ci	},
12288c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
12298c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
12308c2ecf20Sopenharmony_ci	.result = REJECT,
12318c2ecf20Sopenharmony_ci	.errstr = "invalid read from stack R7 off=-16 size=8",
12328c2ecf20Sopenharmony_ci},
12338c2ecf20Sopenharmony_ci{
12348c2ecf20Sopenharmony_ci	"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1",
12358c2ecf20Sopenharmony_ci	.insns = {
12368c2ecf20Sopenharmony_ci	/* main prog */
12378c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
12388c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
12398c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
12408c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
12418c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
12428c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
12438c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
12448c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
12458c2ecf20Sopenharmony_ci
12468c2ecf20Sopenharmony_ci	/* subprog 1 */
12478c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
12488c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
12498c2ecf20Sopenharmony_ci	/* 1st lookup from map */
12508c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
12518c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
12528c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
12538c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
12548c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
12558c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
12568c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
12578c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
12588c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
12598c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
12608c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_ci	/* 2nd lookup from map */
12638c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
12648c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
12658c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
12668c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
12678c2ecf20Sopenharmony_ci		     BPF_FUNC_map_lookup_elem),
12688c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
12698c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
12708c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
12718c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
12728c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
12738c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
12748c2ecf20Sopenharmony_ci
12758c2ecf20Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
12768c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
12778c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
12788c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
12798c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
12808c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
12818c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
12828c2ecf20Sopenharmony_ci
12838c2ecf20Sopenharmony_ci	/* subprog 2 */
12848c2ecf20Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
12858c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
12868c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
12878c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
12888c2ecf20Sopenharmony_ci	/* write into map value */
12898c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
12908c2ecf20Sopenharmony_ci
12918c2ecf20Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
12928c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
12938c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
12948c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
12958c2ecf20Sopenharmony_ci	/* write into map value */
12968c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
12978c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
12988c2ecf20Sopenharmony_ci	},
12998c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
13008c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
13018c2ecf20Sopenharmony_ci	.result = REJECT,
13028c2ecf20Sopenharmony_ci	.errstr = "invalid access to map value, value_size=8 off=2 size=8",
13038c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
13048c2ecf20Sopenharmony_ci},
13058c2ecf20Sopenharmony_ci{
13068c2ecf20Sopenharmony_ci	"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2",
13078c2ecf20Sopenharmony_ci	.insns = {
13088c2ecf20Sopenharmony_ci	/* main prog */
13098c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
13108c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
13118c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
13128c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
13138c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
13148c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
13158c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
13168c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
13178c2ecf20Sopenharmony_ci
13188c2ecf20Sopenharmony_ci	/* subprog 1 */
13198c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
13208c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
13218c2ecf20Sopenharmony_ci	/* 1st lookup from map */
13228c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
13238c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
13248c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
13258c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
13268c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
13278c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
13288c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
13298c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
13308c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
13318c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
13328c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
13338c2ecf20Sopenharmony_ci
13348c2ecf20Sopenharmony_ci	/* 2nd lookup from map */
13358c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
13368c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
13378c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
13388c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
13398c2ecf20Sopenharmony_ci		     BPF_FUNC_map_lookup_elem),
13408c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
13418c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
13428c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
13438c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
13448c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
13458c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
13468c2ecf20Sopenharmony_ci
13478c2ecf20Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
13488c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
13498c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
13508c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
13518c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
13528c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
13538c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
13548c2ecf20Sopenharmony_ci
13558c2ecf20Sopenharmony_ci	/* subprog 2 */
13568c2ecf20Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
13578c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
13588c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
13598c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
13608c2ecf20Sopenharmony_ci	/* write into map value */
13618c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
13628c2ecf20Sopenharmony_ci
13638c2ecf20Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
13648c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
13658c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
13668c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
13678c2ecf20Sopenharmony_ci	/* write into map value */
13688c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
13698c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
13708c2ecf20Sopenharmony_ci	},
13718c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
13728c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
13738c2ecf20Sopenharmony_ci	.result = ACCEPT,
13748c2ecf20Sopenharmony_ci},
13758c2ecf20Sopenharmony_ci{
13768c2ecf20Sopenharmony_ci	"calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3",
13778c2ecf20Sopenharmony_ci	.insns = {
13788c2ecf20Sopenharmony_ci	/* main prog */
13798c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
13808c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
13818c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
13828c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
13838c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
13848c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
13858c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
13868c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
13878c2ecf20Sopenharmony_ci
13888c2ecf20Sopenharmony_ci	/* subprog 1 */
13898c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
13908c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
13918c2ecf20Sopenharmony_ci	/* 1st lookup from map */
13928c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0),
13938c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
13948c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
13958c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
13968c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
13978c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
13988c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
13998c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
14008c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
14018c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
14028c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
14038c2ecf20Sopenharmony_ci
14048c2ecf20Sopenharmony_ci	/* 2nd lookup from map */
14058c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
14068c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
14078c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
14088c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
14098c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
14108c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),  // 26
14118c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
14128c2ecf20Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
14138c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
14148c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
14158c2ecf20Sopenharmony_ci
14168c2ecf20Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
14178c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30
14188c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
14198c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
14208c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
14218c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34
14228c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -30),
14238c2ecf20Sopenharmony_ci
14248c2ecf20Sopenharmony_ci	/* subprog 2 */
14258c2ecf20Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
14268c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
14278c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
14288c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
14298c2ecf20Sopenharmony_ci	/* write into map value */
14308c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
14318c2ecf20Sopenharmony_ci
14328c2ecf20Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
14338c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
14348c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
14358c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
14368c2ecf20Sopenharmony_ci	/* write into map value */
14378c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
14388c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -8),
14398c2ecf20Sopenharmony_ci	},
14408c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
14418c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
14428c2ecf20Sopenharmony_ci	.result = REJECT,
14438c2ecf20Sopenharmony_ci	.errstr = "invalid access to map value, value_size=8 off=2 size=8",
14448c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
14458c2ecf20Sopenharmony_ci},
14468c2ecf20Sopenharmony_ci{
14478c2ecf20Sopenharmony_ci	"calls: two calls that receive map_value_ptr_or_null via arg. test1",
14488c2ecf20Sopenharmony_ci	.insns = {
14498c2ecf20Sopenharmony_ci	/* main prog */
14508c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
14518c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
14528c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
14538c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
14548c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
14558c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
14568c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
14578c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
14588c2ecf20Sopenharmony_ci
14598c2ecf20Sopenharmony_ci	/* subprog 1 */
14608c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
14618c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
14628c2ecf20Sopenharmony_ci	/* 1st lookup from map */
14638c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
14648c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
14658c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
14668c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
14678c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
14688c2ecf20Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
14698c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
14708c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
14718c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
14728c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
14738c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci	/* 2nd lookup from map */
14768c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
14778c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
14788c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
14798c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
14808c2ecf20Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
14818c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
14828c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
14838c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
14848c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
14858c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
14868c2ecf20Sopenharmony_ci
14878c2ecf20Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
14888c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
14898c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
14908c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
14918c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
14928c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
14938c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
14948c2ecf20Sopenharmony_ci
14958c2ecf20Sopenharmony_ci	/* subprog 2 */
14968c2ecf20Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
14978c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
14988c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
14998c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
15008c2ecf20Sopenharmony_ci	/* write into map value */
15018c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
15028c2ecf20Sopenharmony_ci
15038c2ecf20Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
15048c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
15058c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
15068c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
15078c2ecf20Sopenharmony_ci	/* write into map value */
15088c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
15098c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
15108c2ecf20Sopenharmony_ci	},
15118c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
15128c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
15138c2ecf20Sopenharmony_ci	.result = ACCEPT,
15148c2ecf20Sopenharmony_ci},
15158c2ecf20Sopenharmony_ci{
15168c2ecf20Sopenharmony_ci	"calls: two calls that receive map_value_ptr_or_null via arg. test2",
15178c2ecf20Sopenharmony_ci	.insns = {
15188c2ecf20Sopenharmony_ci	/* main prog */
15198c2ecf20Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
15208c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
15218c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
15228c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
15238c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
15248c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
15258c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
15268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
15278c2ecf20Sopenharmony_ci
15288c2ecf20Sopenharmony_ci	/* subprog 1 */
15298c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
15308c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
15318c2ecf20Sopenharmony_ci	/* 1st lookup from map */
15328c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
15338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
15348c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
15358c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
15368c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
15378c2ecf20Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
15388c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
15398c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
15408c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
15418c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
15428c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
15438c2ecf20Sopenharmony_ci
15448c2ecf20Sopenharmony_ci	/* 2nd lookup from map */
15458c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
15468c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
15478c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
15488c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
15498c2ecf20Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
15508c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
15518c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
15528c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
15538c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
15548c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
15558c2ecf20Sopenharmony_ci
15568c2ecf20Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
15578c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
15588c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
15598c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
15608c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
15618c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
15628c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
15638c2ecf20Sopenharmony_ci
15648c2ecf20Sopenharmony_ci	/* subprog 2 */
15658c2ecf20Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
15668c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
15678c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
15688c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
15698c2ecf20Sopenharmony_ci	/* write into map value */
15708c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
15718c2ecf20Sopenharmony_ci
15728c2ecf20Sopenharmony_ci	/* if arg4 == 0 do *arg3 = 0 */
15738c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2),
15748c2ecf20Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
15758c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
15768c2ecf20Sopenharmony_ci	/* write into map value */
15778c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
15788c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
15798c2ecf20Sopenharmony_ci	},
15808c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
15818c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
15828c2ecf20Sopenharmony_ci	.result = REJECT,
15838c2ecf20Sopenharmony_ci	.errstr = "R0 invalid mem access 'inv'",
15848c2ecf20Sopenharmony_ci},
15858c2ecf20Sopenharmony_ci{
15868c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack",
15878c2ecf20Sopenharmony_ci	.insns = {
15888c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
15898c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
15908c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
15918c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
15928c2ecf20Sopenharmony_ci
15938c2ecf20Sopenharmony_ci	/* subprog 1 */
15948c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
15958c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
15968c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
15978c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
15988c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
15998c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
16008c2ecf20Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
16018c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
16028c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
16038c2ecf20Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
16048c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
16058c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
16068c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
16078c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16088c2ecf20Sopenharmony_ci	},
16098c2ecf20Sopenharmony_ci	.result = ACCEPT,
16108c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
16118c2ecf20Sopenharmony_ci	.retval = POINTER_VALUE,
16128c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
16138c2ecf20Sopenharmony_ci},
16148c2ecf20Sopenharmony_ci{
16158c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 2",
16168c2ecf20Sopenharmony_ci	.insns = {
16178c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
16188c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
16198c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
16208c2ecf20Sopenharmony_ci	/* Marking is still kept, but not in all cases safe. */
16218c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
16228c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
16238c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16248c2ecf20Sopenharmony_ci
16258c2ecf20Sopenharmony_ci	/* subprog 1 */
16268c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
16278c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
16288c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
16298c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
16308c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
16318c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
16328c2ecf20Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
16338c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
16348c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
16358c2ecf20Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
16368c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
16378c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
16388c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
16398c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16408c2ecf20Sopenharmony_ci	},
16418c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
16428c2ecf20Sopenharmony_ci	.errstr = "invalid access to packet",
16438c2ecf20Sopenharmony_ci	.result = REJECT,
16448c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
16458c2ecf20Sopenharmony_ci},
16468c2ecf20Sopenharmony_ci{
16478c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 3",
16488c2ecf20Sopenharmony_ci	.insns = {
16498c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
16508c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
16518c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
16528c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
16538c2ecf20Sopenharmony_ci	/* Marking is still kept and safe here. */
16548c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
16558c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
16568c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16578c2ecf20Sopenharmony_ci
16588c2ecf20Sopenharmony_ci	/* subprog 1 */
16598c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
16608c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
16618c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
16628c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
16638c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
16648c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
16658c2ecf20Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
16668c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
16678c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
16688c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
16698c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
16708c2ecf20Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
16718c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
16728c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
16738c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
16748c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
16758c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16768c2ecf20Sopenharmony_ci	},
16778c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
16788c2ecf20Sopenharmony_ci	.result = ACCEPT,
16798c2ecf20Sopenharmony_ci	.retval = 1,
16808c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
16818c2ecf20Sopenharmony_ci},
16828c2ecf20Sopenharmony_ci{
16838c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 4",
16848c2ecf20Sopenharmony_ci	.insns = {
16858c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
16868c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
16878c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
16888c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
16898c2ecf20Sopenharmony_ci	/* Check marking propagated. */
16908c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
16918c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
16928c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
16938c2ecf20Sopenharmony_ci
16948c2ecf20Sopenharmony_ci	/* subprog 1 */
16958c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
16968c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
16978c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
16988c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
16998c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
17008c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
17018c2ecf20Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
17028c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
17038c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
17048c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
17058c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
17068c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
17078c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
17088c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
17098c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
17108c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17118c2ecf20Sopenharmony_ci	},
17128c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
17138c2ecf20Sopenharmony_ci	.result = ACCEPT,
17148c2ecf20Sopenharmony_ci	.retval = 1,
17158c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
17168c2ecf20Sopenharmony_ci},
17178c2ecf20Sopenharmony_ci{
17188c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 5",
17198c2ecf20Sopenharmony_ci	.insns = {
17208c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
17218c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
17228c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0),
17238c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
17248c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
17258c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
17268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17278c2ecf20Sopenharmony_ci
17288c2ecf20Sopenharmony_ci	/* subprog 1 */
17298c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
17308c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
17318c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
17328c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
17338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
17348c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
17358c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
17368c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
17378c2ecf20Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
17388c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
17398c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
17408c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
17418c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
17428c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
17438c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
17448c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17458c2ecf20Sopenharmony_ci	},
17468c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
17478c2ecf20Sopenharmony_ci	.errstr = "same insn cannot be used with different",
17488c2ecf20Sopenharmony_ci	.result = REJECT,
17498c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
17508c2ecf20Sopenharmony_ci},
17518c2ecf20Sopenharmony_ci{
17528c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 6",
17538c2ecf20Sopenharmony_ci	.insns = {
17548c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
17558c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
17568c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
17578c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
17588c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
17598c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
17608c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
17618c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
17628c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17638c2ecf20Sopenharmony_ci
17648c2ecf20Sopenharmony_ci	/* subprog 1 */
17658c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
17668c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
17678c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
17688c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
17698c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
17708c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
17718c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
17728c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
17738c2ecf20Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
17748c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
17758c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
17768c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
17778c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
17788c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
17798c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
17808c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17818c2ecf20Sopenharmony_ci	},
17828c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
17838c2ecf20Sopenharmony_ci	.errstr = "R4 invalid mem access",
17848c2ecf20Sopenharmony_ci	.result = REJECT,
17858c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
17868c2ecf20Sopenharmony_ci},
17878c2ecf20Sopenharmony_ci{
17888c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 7",
17898c2ecf20Sopenharmony_ci	.insns = {
17908c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 0),
17918c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
17928c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
17938c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
17948c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
17958c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
17968c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
17978c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
17988c2ecf20Sopenharmony_ci
17998c2ecf20Sopenharmony_ci	/* subprog 1 */
18008c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
18018c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
18028c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
18038c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
18048c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
18058c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
18068c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
18078c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
18088c2ecf20Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
18098c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
18108c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
18118c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
18128c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
18138c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
18148c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
18158c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18168c2ecf20Sopenharmony_ci	},
18178c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
18188c2ecf20Sopenharmony_ci	.errstr = "R4 invalid mem access",
18198c2ecf20Sopenharmony_ci	.result = REJECT,
18208c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
18218c2ecf20Sopenharmony_ci},
18228c2ecf20Sopenharmony_ci{
18238c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 8",
18248c2ecf20Sopenharmony_ci	.insns = {
18258c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
18268c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
18278c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
18288c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
18298c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
18308c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
18318c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
18328c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18338c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
18348c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
18358c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
18368c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
18378c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
18388c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
18398c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18408c2ecf20Sopenharmony_ci
18418c2ecf20Sopenharmony_ci	/* subprog 1 */
18428c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
18438c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
18448c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
18458c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
18468c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
18478c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
18488c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
18498c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
18508c2ecf20Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
18518c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
18528c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
18538c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
18548c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
18558c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
18568c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
18578c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18588c2ecf20Sopenharmony_ci	},
18598c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
18608c2ecf20Sopenharmony_ci	.result = ACCEPT,
18618c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
18628c2ecf20Sopenharmony_ci},
18638c2ecf20Sopenharmony_ci{
18648c2ecf20Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 9",
18658c2ecf20Sopenharmony_ci	.insns = {
18668c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
18678c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
18688c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
18698c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
18708c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
18718c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
18728c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
18738c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18748c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
18758c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
18768c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
18778c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
18788c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
18798c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
18808c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18818c2ecf20Sopenharmony_ci
18828c2ecf20Sopenharmony_ci	/* subprog 1 */
18838c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
18848c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
18858c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
18868c2ecf20Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
18878c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
18888c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
18898c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
18908c2ecf20Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
18918c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
18928c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
18938c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
18948c2ecf20Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
18958c2ecf20Sopenharmony_ci	/* write 4 bytes into packet */
18968c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
18978c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
18988c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
18998c2ecf20Sopenharmony_ci	},
19008c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
19018c2ecf20Sopenharmony_ci	.errstr = "invalid access to packet",
19028c2ecf20Sopenharmony_ci	.result = REJECT,
19038c2ecf20Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
19048c2ecf20Sopenharmony_ci},
19058c2ecf20Sopenharmony_ci{
19068c2ecf20Sopenharmony_ci	"calls: caller stack init to zero or map_value_or_null",
19078c2ecf20Sopenharmony_ci	.insns = {
19088c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
19098c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
19108c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
19118c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
19128c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
19138c2ecf20Sopenharmony_ci	/* fetch map_value_or_null or const_zero from stack */
19148c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
19158c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
19168c2ecf20Sopenharmony_ci	/* store into map_value */
19178c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
19188c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
19198c2ecf20Sopenharmony_ci
19208c2ecf20Sopenharmony_ci	/* subprog 1 */
19218c2ecf20Sopenharmony_ci	/* if (ctx == 0) return; */
19228c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8),
19238c2ecf20Sopenharmony_ci	/* else bpf_map_lookup() and *(fp - 8) = r0 */
19248c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
19258c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
19268c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
19278c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
19288c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
19298c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
19308c2ecf20Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
19318c2ecf20Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
19328c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
19338c2ecf20Sopenharmony_ci	},
19348c2ecf20Sopenharmony_ci	.fixup_map_hash_8b = { 13 },
19358c2ecf20Sopenharmony_ci	.result = ACCEPT,
19368c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
19378c2ecf20Sopenharmony_ci},
19388c2ecf20Sopenharmony_ci{
19398c2ecf20Sopenharmony_ci	"calls: stack init to zero and pruning",
19408c2ecf20Sopenharmony_ci	.insns = {
19418c2ecf20Sopenharmony_ci	/* first make allocated_stack 16 byte */
19428c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
19438c2ecf20Sopenharmony_ci	/* now fork the execution such that the false branch
19448c2ecf20Sopenharmony_ci	 * of JGT insn will be verified second and it skisp zero
19458c2ecf20Sopenharmony_ci	 * init of fp-8 stack slot. If stack liveness marking
19468c2ecf20Sopenharmony_ci	 * is missing live_read marks from call map_lookup
19478c2ecf20Sopenharmony_ci	 * processing then pruning will incorrectly assume
19488c2ecf20Sopenharmony_ci	 * that fp-8 stack slot was unused in the fall-through
19498c2ecf20Sopenharmony_ci	 * branch and will accept the program incorrectly
19508c2ecf20Sopenharmony_ci	 */
19518c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2),
19528c2ecf20Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
19538c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 0),
19548c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
19558c2ecf20Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
19568c2ecf20Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
19578c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
19588c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
19598c2ecf20Sopenharmony_ci	},
19608c2ecf20Sopenharmony_ci	.fixup_map_hash_48b = { 6 },
19618c2ecf20Sopenharmony_ci	.errstr = "invalid indirect read from stack R2 off -8+0 size 8",
19628c2ecf20Sopenharmony_ci	.result = REJECT,
19638c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
19648c2ecf20Sopenharmony_ci},
19658c2ecf20Sopenharmony_ci{
19668c2ecf20Sopenharmony_ci	"calls: ctx read at start of subprog",
19678c2ecf20Sopenharmony_ci	.insns = {
19688c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
19698c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
19708c2ecf20Sopenharmony_ci	BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0),
19718c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
19728c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
19738c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
19748c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
19758c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0),
19768c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
19778c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
19788c2ecf20Sopenharmony_ci	},
19798c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
19808c2ecf20Sopenharmony_ci	.errstr_unpriv = "function calls to other bpf functions are allowed for",
19818c2ecf20Sopenharmony_ci	.result_unpriv = REJECT,
19828c2ecf20Sopenharmony_ci	.result = ACCEPT,
19838c2ecf20Sopenharmony_ci},
19848c2ecf20Sopenharmony_ci{
19858c2ecf20Sopenharmony_ci	"calls: cross frame pruning",
19868c2ecf20Sopenharmony_ci	.insns = {
19878c2ecf20Sopenharmony_ci	/* r8 = !!random();
19888c2ecf20Sopenharmony_ci	 * call pruner()
19898c2ecf20Sopenharmony_ci	 * if (r8)
19908c2ecf20Sopenharmony_ci	 *     do something bad;
19918c2ecf20Sopenharmony_ci	 */
19928c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
19938c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
19948c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
19958c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
19968c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
19978c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
19988c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1),
19998c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0),
20008c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
20018c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
20028c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
20038c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
20048c2ecf20Sopenharmony_ci	},
20058c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
20068c2ecf20Sopenharmony_ci	.errstr_unpriv = "function calls to other bpf functions are allowed for",
20078c2ecf20Sopenharmony_ci	.errstr = "!read_ok",
20088c2ecf20Sopenharmony_ci	.result = REJECT,
20098c2ecf20Sopenharmony_ci},
20108c2ecf20Sopenharmony_ci{
20118c2ecf20Sopenharmony_ci	"calls: cross frame pruning - liveness propagation",
20128c2ecf20Sopenharmony_ci	.insns = {
20138c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
20148c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
20158c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
20168c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
20178c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
20188c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
20198c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
20208c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
20218c2ecf20Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
20228c2ecf20Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
20238c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1),
20248c2ecf20Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_2, 0),
20258c2ecf20Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
20268c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
20278c2ecf20Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
20288c2ecf20Sopenharmony_ci	BPF_EXIT_INSN(),
20298c2ecf20Sopenharmony_ci	},
20308c2ecf20Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
20318c2ecf20Sopenharmony_ci	.errstr_unpriv = "function calls to other bpf functions are allowed for",
20328c2ecf20Sopenharmony_ci	.errstr = "!read_ok",
20338c2ecf20Sopenharmony_ci	.result = REJECT,
20348c2ecf20Sopenharmony_ci},
2035