162306a36Sopenharmony_ci{
262306a36Sopenharmony_ci	"calls: invalid kfunc call not eliminated",
362306a36Sopenharmony_ci	.insns = {
462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
762306a36Sopenharmony_ci	},
862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
962306a36Sopenharmony_ci	.result  = REJECT,
1062306a36Sopenharmony_ci	.errstr = "invalid kernel function call not eliminated in verifier pass",
1162306a36Sopenharmony_ci},
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	"calls: invalid kfunc call unreachable",
1462306a36Sopenharmony_ci	.insns = {
1562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 0, 2),
1762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
1862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
1962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
2062306a36Sopenharmony_ci	},
2162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
2262306a36Sopenharmony_ci	.result  = ACCEPT,
2362306a36Sopenharmony_ci},
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	"calls: invalid kfunc call: ptr_to_mem to struct with non-scalar",
2662306a36Sopenharmony_ci	.insns = {
2762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
2862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
2962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
3062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
3162306a36Sopenharmony_ci	},
3262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
3362306a36Sopenharmony_ci	.result = REJECT,
3462306a36Sopenharmony_ci	.errstr = "arg#0 pointer type STRUCT prog_test_fail1 must point to scalar",
3562306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
3662306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_fail1", 2 },
3762306a36Sopenharmony_ci	},
3862306a36Sopenharmony_ci},
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	"calls: invalid kfunc call: ptr_to_mem to struct with nesting depth > 4",
4162306a36Sopenharmony_ci	.insns = {
4262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
4362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
4462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
4562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
4662306a36Sopenharmony_ci	},
4762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
4862306a36Sopenharmony_ci	.result = REJECT,
4962306a36Sopenharmony_ci	.errstr = "max struct nesting depth exceeded\narg#0 pointer type STRUCT prog_test_fail2",
5062306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
5162306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_fail2", 2 },
5262306a36Sopenharmony_ci	},
5362306a36Sopenharmony_ci},
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	"calls: invalid kfunc call: ptr_to_mem to struct with FAM",
5662306a36Sopenharmony_ci	.insns = {
5762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
5862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
5962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
6062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
6162306a36Sopenharmony_ci	},
6262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
6362306a36Sopenharmony_ci	.result = REJECT,
6462306a36Sopenharmony_ci	.errstr = "arg#0 pointer type STRUCT prog_test_fail3 must point to scalar",
6562306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
6662306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_fail3", 2 },
6762306a36Sopenharmony_ci	},
6862306a36Sopenharmony_ci},
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	"calls: invalid kfunc call: reg->type != PTR_TO_CTX",
7162306a36Sopenharmony_ci	.insns = {
7262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
7362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
7462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
7562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
7662306a36Sopenharmony_ci	},
7762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
7862306a36Sopenharmony_ci	.result = REJECT,
7962306a36Sopenharmony_ci	.errstr = "R1 must have zero offset when passed to release func or trusted arg to kfunc",
8062306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
8162306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_pass_ctx", 2 },
8262306a36Sopenharmony_ci	},
8362306a36Sopenharmony_ci},
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	"calls: invalid kfunc call: void * not allowed in func proto without mem size arg",
8662306a36Sopenharmony_ci	.insns = {
8762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
8862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
8962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
9062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
9162306a36Sopenharmony_ci	},
9262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
9362306a36Sopenharmony_ci	.result = REJECT,
9462306a36Sopenharmony_ci	.errstr = "arg#0 pointer type UNKNOWN  must point to scalar",
9562306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
9662306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_mem_len_fail1", 2 },
9762306a36Sopenharmony_ci	},
9862306a36Sopenharmony_ci},
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	"calls: trigger reg2btf_ids[reg->type] for reg->type > __BPF_REG_TYPE_MAX",
10162306a36Sopenharmony_ci	.insns = {
10262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
10362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
10462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
10562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
10662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
10762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
10862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
10962306a36Sopenharmony_ci	},
11062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
11162306a36Sopenharmony_ci	.result = REJECT,
11262306a36Sopenharmony_ci	.errstr = "Possibly NULL pointer passed to trusted arg0",
11362306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
11462306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
11562306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 5 },
11662306a36Sopenharmony_ci	},
11762306a36Sopenharmony_ci},
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	"calls: invalid kfunc call: reg->off must be zero when passed to release kfunc",
12062306a36Sopenharmony_ci	.insns = {
12162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
12262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
12362306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
12462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
12562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
12662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
12762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
12862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
12962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
13062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
13162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
13262306a36Sopenharmony_ci	},
13362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
13462306a36Sopenharmony_ci	.result = REJECT,
13562306a36Sopenharmony_ci	.errstr = "R1 must have zero offset when passed to release func",
13662306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
13762306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
13862306a36Sopenharmony_ci		{ "bpf_kfunc_call_memb_release", 8 },
13962306a36Sopenharmony_ci	},
14062306a36Sopenharmony_ci},
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	"calls: invalid kfunc call: don't match first member type when passed to release kfunc",
14362306a36Sopenharmony_ci	.insns = {
14462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
14562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
14662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
14762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
14862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
14962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
15062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
15162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
15262306a36Sopenharmony_ci	},
15362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
15462306a36Sopenharmony_ci	.result = REJECT,
15562306a36Sopenharmony_ci	.errstr = "kernel function bpf_kfunc_call_memb1_release args#0 expected pointer",
15662306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
15762306a36Sopenharmony_ci		{ "bpf_kfunc_call_memb_acquire", 1 },
15862306a36Sopenharmony_ci		{ "bpf_kfunc_call_memb1_release", 5 },
15962306a36Sopenharmony_ci	},
16062306a36Sopenharmony_ci},
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	"calls: invalid kfunc call: PTR_TO_BTF_ID with negative offset",
16362306a36Sopenharmony_ci	.insns = {
16462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
16562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
16662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
16762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
16862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
16962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
17062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
17162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
17262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -4),
17362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
17462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
17562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
17662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
17762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
17862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
17962306a36Sopenharmony_ci	},
18062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
18162306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
18262306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
18362306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_offset", 9 },
18462306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 12 },
18562306a36Sopenharmony_ci	},
18662306a36Sopenharmony_ci	.result_unpriv = REJECT,
18762306a36Sopenharmony_ci	.result = REJECT,
18862306a36Sopenharmony_ci	.errstr = "ptr R1 off=-4 disallowed",
18962306a36Sopenharmony_ci},
19062306a36Sopenharmony_ci{
19162306a36Sopenharmony_ci	"calls: invalid kfunc call: PTR_TO_BTF_ID with variable offset",
19262306a36Sopenharmony_ci	.insns = {
19362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
19462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
19562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
19662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
19762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
19862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
19962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
20062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_0, 4),
20162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 3),
20262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
20362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
20462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
20562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 3),
20662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
20762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
20862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
20962306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
21062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
21162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
21262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
21362306a36Sopenharmony_ci	},
21462306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
21562306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
21662306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
21762306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 9 },
21862306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 13 },
21962306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 17 },
22062306a36Sopenharmony_ci	},
22162306a36Sopenharmony_ci	.result_unpriv = REJECT,
22262306a36Sopenharmony_ci	.result = REJECT,
22362306a36Sopenharmony_ci	.errstr = "variable ptr_ access var_off=(0x0; 0x7) disallowed",
22462306a36Sopenharmony_ci},
22562306a36Sopenharmony_ci{
22662306a36Sopenharmony_ci	"calls: invalid kfunc call: referenced arg needs refcounted PTR_TO_BTF_ID",
22762306a36Sopenharmony_ci	.insns = {
22862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
22962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
23062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
23162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
23262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
23362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
23462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
23562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
23662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
23762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, 16),
23862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
23962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
24062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
24162306a36Sopenharmony_ci	},
24262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
24362306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
24462306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
24562306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_ref", 8 },
24662306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_ref", 10 },
24762306a36Sopenharmony_ci	},
24862306a36Sopenharmony_ci	.result_unpriv = REJECT,
24962306a36Sopenharmony_ci	.result = REJECT,
25062306a36Sopenharmony_ci	.errstr = "R1 must be",
25162306a36Sopenharmony_ci},
25262306a36Sopenharmony_ci{
25362306a36Sopenharmony_ci	"calls: valid kfunc call: referenced arg needs refcounted PTR_TO_BTF_ID",
25462306a36Sopenharmony_ci	.insns = {
25562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
25662306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
25762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
25862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
25962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
26062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
26162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
26262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
26362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
26462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
26562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
26662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
26762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
26862306a36Sopenharmony_ci	},
26962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
27062306a36Sopenharmony_ci	.fixup_kfunc_btf_id = {
27162306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_acquire", 3 },
27262306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_ref", 8 },
27362306a36Sopenharmony_ci		{ "bpf_kfunc_call_test_release", 10 },
27462306a36Sopenharmony_ci	},
27562306a36Sopenharmony_ci	.result_unpriv = REJECT,
27662306a36Sopenharmony_ci	.result = ACCEPT,
27762306a36Sopenharmony_ci},
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	"calls: basic sanity",
28062306a36Sopenharmony_ci	.insns = {
28162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
28262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
28362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
28462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
28562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
28662306a36Sopenharmony_ci	},
28762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
28862306a36Sopenharmony_ci	.result = ACCEPT,
28962306a36Sopenharmony_ci},
29062306a36Sopenharmony_ci{
29162306a36Sopenharmony_ci	"calls: not on unprivileged",
29262306a36Sopenharmony_ci	.insns = {
29362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
29462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
29562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
29662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
29762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
29862306a36Sopenharmony_ci	},
29962306a36Sopenharmony_ci	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
30062306a36Sopenharmony_ci	.result_unpriv = REJECT,
30162306a36Sopenharmony_ci	.result = ACCEPT,
30262306a36Sopenharmony_ci	.retval = 1,
30362306a36Sopenharmony_ci},
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	"calls: div by 0 in subprog",
30662306a36Sopenharmony_ci	.insns = {
30762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
30862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
30962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
31062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
31162306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
31262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
31362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
31462306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
31562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
31662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
31762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
31862306a36Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_2, 0),
31962306a36Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_3, 1),
32062306a36Sopenharmony_ci	BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2),
32162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
32262306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
32362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
32462306a36Sopenharmony_ci	},
32562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
32662306a36Sopenharmony_ci	.result = ACCEPT,
32762306a36Sopenharmony_ci	.retval = 1,
32862306a36Sopenharmony_ci},
32962306a36Sopenharmony_ci{
33062306a36Sopenharmony_ci	"calls: multiple ret types in subprog 1",
33162306a36Sopenharmony_ci	.insns = {
33262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
33362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
33462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
33562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
33662306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
33762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
33862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
33962306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
34062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
34162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
34262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
34362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
34462306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
34562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
34662306a36Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_0, 42),
34762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
34862306a36Sopenharmony_ci	},
34962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
35062306a36Sopenharmony_ci	.result = REJECT,
35162306a36Sopenharmony_ci	.errstr = "R0 invalid mem access 'scalar'",
35262306a36Sopenharmony_ci},
35362306a36Sopenharmony_ci{
35462306a36Sopenharmony_ci	"calls: multiple ret types in subprog 2",
35562306a36Sopenharmony_ci	.insns = {
35662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
35762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
35862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
35962306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1,
36062306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
36162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
36262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8),
36362306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1),
36462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0),
36562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
36662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
36762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
36862306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
36962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
37062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9),
37162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
37262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
37362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
37462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
37562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
37662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
37762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6,
37862306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
37962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64),
38062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
38162306a36Sopenharmony_ci	},
38262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
38362306a36Sopenharmony_ci	.fixup_map_hash_8b = { 16 },
38462306a36Sopenharmony_ci	.result = REJECT,
38562306a36Sopenharmony_ci	.errstr = "R0 min value is outside of the allowed memory range",
38662306a36Sopenharmony_ci},
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	"calls: overlapping caller/callee",
38962306a36Sopenharmony_ci	.insns = {
39062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0),
39162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
39262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
39362306a36Sopenharmony_ci	},
39462306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
39562306a36Sopenharmony_ci	.errstr = "last insn is not an exit or jmp",
39662306a36Sopenharmony_ci	.result = REJECT,
39762306a36Sopenharmony_ci},
39862306a36Sopenharmony_ci{
39962306a36Sopenharmony_ci	"calls: wrong recursive calls",
40062306a36Sopenharmony_ci	.insns = {
40162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
40262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
40362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
40462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
40562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2),
40662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
40762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
40862306a36Sopenharmony_ci	},
40962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
41062306a36Sopenharmony_ci	.errstr = "jump out of range",
41162306a36Sopenharmony_ci	.result = REJECT,
41262306a36Sopenharmony_ci},
41362306a36Sopenharmony_ci{
41462306a36Sopenharmony_ci	"calls: wrong src reg",
41562306a36Sopenharmony_ci	.insns = {
41662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 3, 0, 0),
41762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
41862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
41962306a36Sopenharmony_ci	},
42062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
42162306a36Sopenharmony_ci	.errstr = "BPF_CALL uses reserved fields",
42262306a36Sopenharmony_ci	.result = REJECT,
42362306a36Sopenharmony_ci},
42462306a36Sopenharmony_ci{
42562306a36Sopenharmony_ci	"calls: wrong off value",
42662306a36Sopenharmony_ci	.insns = {
42762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2),
42862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
42962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
43062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
43162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
43262306a36Sopenharmony_ci	},
43362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
43462306a36Sopenharmony_ci	.errstr = "BPF_CALL uses reserved fields",
43562306a36Sopenharmony_ci	.result = REJECT,
43662306a36Sopenharmony_ci},
43762306a36Sopenharmony_ci{
43862306a36Sopenharmony_ci	"calls: jump back loop",
43962306a36Sopenharmony_ci	.insns = {
44062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
44162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
44262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
44362306a36Sopenharmony_ci	},
44462306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
44562306a36Sopenharmony_ci	.errstr = "the call stack of 9 frames is too deep",
44662306a36Sopenharmony_ci	.result = REJECT,
44762306a36Sopenharmony_ci},
44862306a36Sopenharmony_ci{
44962306a36Sopenharmony_ci	"calls: conditional call",
45062306a36Sopenharmony_ci	.insns = {
45162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
45262306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
45362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
45462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
45562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
45662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
45762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
45862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
45962306a36Sopenharmony_ci	},
46062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
46162306a36Sopenharmony_ci	.errstr = "jump out of range",
46262306a36Sopenharmony_ci	.result = REJECT,
46362306a36Sopenharmony_ci},
46462306a36Sopenharmony_ci{
46562306a36Sopenharmony_ci	"calls: conditional call 2",
46662306a36Sopenharmony_ci	.insns = {
46762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
46862306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
46962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
47062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
47162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
47262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
47362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
47462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
47562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
47662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
47762306a36Sopenharmony_ci	},
47862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
47962306a36Sopenharmony_ci	.result = ACCEPT,
48062306a36Sopenharmony_ci},
48162306a36Sopenharmony_ci{
48262306a36Sopenharmony_ci	"calls: conditional call 3",
48362306a36Sopenharmony_ci	.insns = {
48462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
48562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
48662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
48762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 4),
48862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
48962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
49062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
49162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
49262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
49362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
49462306a36Sopenharmony_ci	},
49562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
49662306a36Sopenharmony_ci	.errstr_unpriv = "back-edge from insn",
49762306a36Sopenharmony_ci	.result_unpriv = REJECT,
49862306a36Sopenharmony_ci	.result = ACCEPT,
49962306a36Sopenharmony_ci	.retval = 1,
50062306a36Sopenharmony_ci},
50162306a36Sopenharmony_ci{
50262306a36Sopenharmony_ci	"calls: conditional call 4",
50362306a36Sopenharmony_ci	.insns = {
50462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
50562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
50662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
50762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
50862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
50962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
51062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
51162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -5),
51262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
51362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
51462306a36Sopenharmony_ci	},
51562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
51662306a36Sopenharmony_ci	.result = ACCEPT,
51762306a36Sopenharmony_ci},
51862306a36Sopenharmony_ci{
51962306a36Sopenharmony_ci	"calls: conditional call 5",
52062306a36Sopenharmony_ci	.insns = {
52162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
52262306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
52362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3),
52462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
52562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
52662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
52762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
52862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -6),
52962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 3),
53062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
53162306a36Sopenharmony_ci	},
53262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
53362306a36Sopenharmony_ci	.result = ACCEPT,
53462306a36Sopenharmony_ci	.retval = 1,
53562306a36Sopenharmony_ci},
53662306a36Sopenharmony_ci{
53762306a36Sopenharmony_ci	"calls: conditional call 6",
53862306a36Sopenharmony_ci	.insns = {
53962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
54062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
54162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
54262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
54362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
54462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
54562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, mark)),
54662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
54762306a36Sopenharmony_ci	},
54862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
54962306a36Sopenharmony_ci	.errstr = "infinite loop detected",
55062306a36Sopenharmony_ci	.result = REJECT,
55162306a36Sopenharmony_ci},
55262306a36Sopenharmony_ci{
55362306a36Sopenharmony_ci	"calls: using r0 returned by callee",
55462306a36Sopenharmony_ci	.insns = {
55562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
55662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
55762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 2),
55862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
55962306a36Sopenharmony_ci	},
56062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
56162306a36Sopenharmony_ci	.result = ACCEPT,
56262306a36Sopenharmony_ci},
56362306a36Sopenharmony_ci{
56462306a36Sopenharmony_ci	"calls: using uninit r0 from callee",
56562306a36Sopenharmony_ci	.insns = {
56662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
56762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
56862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
56962306a36Sopenharmony_ci	},
57062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
57162306a36Sopenharmony_ci	.errstr = "!read_ok",
57262306a36Sopenharmony_ci	.result = REJECT,
57362306a36Sopenharmony_ci},
57462306a36Sopenharmony_ci{
57562306a36Sopenharmony_ci	"calls: callee is using r1",
57662306a36Sopenharmony_ci	.insns = {
57762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
57862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
57962306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
58062306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
58162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
58262306a36Sopenharmony_ci	},
58362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_ACT,
58462306a36Sopenharmony_ci	.result = ACCEPT,
58562306a36Sopenharmony_ci	.retval = TEST_DATA_LEN,
58662306a36Sopenharmony_ci},
58762306a36Sopenharmony_ci{
58862306a36Sopenharmony_ci	"calls: callee using args1",
58962306a36Sopenharmony_ci	.insns = {
59062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
59162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
59262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
59362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
59462306a36Sopenharmony_ci	},
59562306a36Sopenharmony_ci	.errstr_unpriv = "allowed for",
59662306a36Sopenharmony_ci	.result_unpriv = REJECT,
59762306a36Sopenharmony_ci	.result = ACCEPT,
59862306a36Sopenharmony_ci	.retval = POINTER_VALUE,
59962306a36Sopenharmony_ci},
60062306a36Sopenharmony_ci{
60162306a36Sopenharmony_ci	"calls: callee using wrong args2",
60262306a36Sopenharmony_ci	.insns = {
60362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
60462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
60562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
60662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
60762306a36Sopenharmony_ci	},
60862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
60962306a36Sopenharmony_ci	.errstr = "R2 !read_ok",
61062306a36Sopenharmony_ci	.result = REJECT,
61162306a36Sopenharmony_ci},
61262306a36Sopenharmony_ci{
61362306a36Sopenharmony_ci	"calls: callee using two args",
61462306a36Sopenharmony_ci	.insns = {
61562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
61662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6,
61762306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
61862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6,
61962306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
62062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
62162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
62262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
62362306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2),
62462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
62562306a36Sopenharmony_ci	},
62662306a36Sopenharmony_ci	.errstr_unpriv = "allowed for",
62762306a36Sopenharmony_ci	.result_unpriv = REJECT,
62862306a36Sopenharmony_ci	.result = ACCEPT,
62962306a36Sopenharmony_ci	.retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN,
63062306a36Sopenharmony_ci},
63162306a36Sopenharmony_ci{
63262306a36Sopenharmony_ci	"calls: callee changing pkt pointers",
63362306a36Sopenharmony_ci	.insns = {
63462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, offsetof(struct xdp_md, data)),
63562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1,
63662306a36Sopenharmony_ci		    offsetof(struct xdp_md, data_end)),
63762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_8, BPF_REG_6),
63862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8),
63962306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2),
64062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
64162306a36Sopenharmony_ci	/* clear_all_pkt_pointers() has to walk all frames
64262306a36Sopenharmony_ci	 * to make sure that pkt pointers in the caller
64362306a36Sopenharmony_ci	 * are cleared when callee is calling a helper that
64462306a36Sopenharmony_ci	 * adjusts packet size
64562306a36Sopenharmony_ci	 */
64662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
64762306a36Sopenharmony_ci	BPF_MOV32_IMM(BPF_REG_0, 0),
64862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
64962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 0),
65062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_xdp_adjust_head),
65162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
65262306a36Sopenharmony_ci	},
65362306a36Sopenharmony_ci	.result = REJECT,
65462306a36Sopenharmony_ci	.errstr = "R6 invalid mem access 'scalar'",
65562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
65662306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
65762306a36Sopenharmony_ci},
65862306a36Sopenharmony_ci{
65962306a36Sopenharmony_ci	"calls: ptr null check in subprog",
66062306a36Sopenharmony_ci	.insns = {
66162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
66262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
66362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
66462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
66562306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
66662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
66762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
66862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
66962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
67062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
67162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
67262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
67362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
67462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
67562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
67662306a36Sopenharmony_ci	},
67762306a36Sopenharmony_ci	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
67862306a36Sopenharmony_ci	.fixup_map_hash_48b = { 3 },
67962306a36Sopenharmony_ci	.result_unpriv = REJECT,
68062306a36Sopenharmony_ci	.result = ACCEPT,
68162306a36Sopenharmony_ci	.retval = 0,
68262306a36Sopenharmony_ci},
68362306a36Sopenharmony_ci{
68462306a36Sopenharmony_ci	"calls: two calls with args",
68562306a36Sopenharmony_ci	.insns = {
68662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
68762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
68862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
68962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
69062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
69162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
69262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
69362306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
69462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
69562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
69662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
69762306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
69862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
69962306a36Sopenharmony_ci	},
70062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
70162306a36Sopenharmony_ci	.result = ACCEPT,
70262306a36Sopenharmony_ci	.retval = TEST_DATA_LEN + TEST_DATA_LEN,
70362306a36Sopenharmony_ci},
70462306a36Sopenharmony_ci{
70562306a36Sopenharmony_ci	"calls: calls with stack arith",
70662306a36Sopenharmony_ci	.insns = {
70762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
70862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
70962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
71062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
71162306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
71262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
71362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
71462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64),
71562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
71662306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
71762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
71862306a36Sopenharmony_ci	},
71962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
72062306a36Sopenharmony_ci	.result = ACCEPT,
72162306a36Sopenharmony_ci	.retval = 42,
72262306a36Sopenharmony_ci},
72362306a36Sopenharmony_ci{
72462306a36Sopenharmony_ci	"calls: calls with misaligned stack access",
72562306a36Sopenharmony_ci	.insns = {
72662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
72762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
72862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
72962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
73062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61),
73162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
73262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
73362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63),
73462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
73562306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
73662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
73762306a36Sopenharmony_ci	},
73862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
73962306a36Sopenharmony_ci	.flags = F_LOAD_WITH_STRICT_ALIGNMENT,
74062306a36Sopenharmony_ci	.errstr = "misaligned stack access",
74162306a36Sopenharmony_ci	.result = REJECT,
74262306a36Sopenharmony_ci},
74362306a36Sopenharmony_ci{
74462306a36Sopenharmony_ci	"calls: calls control flow, jump test",
74562306a36Sopenharmony_ci	.insns = {
74662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
74762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
74862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 43),
74962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
75062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -3),
75162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
75262306a36Sopenharmony_ci	},
75362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
75462306a36Sopenharmony_ci	.result = ACCEPT,
75562306a36Sopenharmony_ci	.retval = 43,
75662306a36Sopenharmony_ci},
75762306a36Sopenharmony_ci{
75862306a36Sopenharmony_ci	"calls: calls control flow, jump test 2",
75962306a36Sopenharmony_ci	.insns = {
76062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 42),
76162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
76262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 43),
76362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
76462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
76562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
76662306a36Sopenharmony_ci	},
76762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
76862306a36Sopenharmony_ci	.errstr = "jump out of range from insn 1 to 4",
76962306a36Sopenharmony_ci	.result = REJECT,
77062306a36Sopenharmony_ci},
77162306a36Sopenharmony_ci{
77262306a36Sopenharmony_ci	"calls: two calls with bad jump",
77362306a36Sopenharmony_ci	.insns = {
77462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
77562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
77662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
77762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
77862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
77962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
78062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
78162306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
78262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
78362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
78462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
78562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
78662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3),
78762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
78862306a36Sopenharmony_ci	},
78962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
79062306a36Sopenharmony_ci	.errstr = "jump out of range from insn 11 to 9",
79162306a36Sopenharmony_ci	.result = REJECT,
79262306a36Sopenharmony_ci},
79362306a36Sopenharmony_ci{
79462306a36Sopenharmony_ci	"calls: recursive call. test1",
79562306a36Sopenharmony_ci	.insns = {
79662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
79762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
79862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1),
79962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
80062306a36Sopenharmony_ci	},
80162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
80262306a36Sopenharmony_ci	.errstr = "the call stack of 9 frames is too deep",
80362306a36Sopenharmony_ci	.result = REJECT,
80462306a36Sopenharmony_ci},
80562306a36Sopenharmony_ci{
80662306a36Sopenharmony_ci	"calls: recursive call. test2",
80762306a36Sopenharmony_ci	.insns = {
80862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
80962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
81062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3),
81162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
81262306a36Sopenharmony_ci	},
81362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
81462306a36Sopenharmony_ci	.errstr = "the call stack of 9 frames is too deep",
81562306a36Sopenharmony_ci	.result = REJECT,
81662306a36Sopenharmony_ci},
81762306a36Sopenharmony_ci{
81862306a36Sopenharmony_ci	"calls: unreachable code",
81962306a36Sopenharmony_ci	.insns = {
82062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
82162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
82262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
82362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
82462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
82562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
82662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
82762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
82862306a36Sopenharmony_ci	},
82962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
83062306a36Sopenharmony_ci	.errstr = "unreachable insn 6",
83162306a36Sopenharmony_ci	.result = REJECT,
83262306a36Sopenharmony_ci},
83362306a36Sopenharmony_ci{
83462306a36Sopenharmony_ci	"calls: invalid call",
83562306a36Sopenharmony_ci	.insns = {
83662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
83762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
83862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4),
83962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
84062306a36Sopenharmony_ci	},
84162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
84262306a36Sopenharmony_ci	.errstr = "invalid destination",
84362306a36Sopenharmony_ci	.result = REJECT,
84462306a36Sopenharmony_ci},
84562306a36Sopenharmony_ci{
84662306a36Sopenharmony_ci	"calls: invalid call 2",
84762306a36Sopenharmony_ci	.insns = {
84862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
84962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
85062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff),
85162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
85262306a36Sopenharmony_ci	},
85362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
85462306a36Sopenharmony_ci	.errstr = "invalid destination",
85562306a36Sopenharmony_ci	.result = REJECT,
85662306a36Sopenharmony_ci},
85762306a36Sopenharmony_ci{
85862306a36Sopenharmony_ci	"calls: jumping across function bodies. test1",
85962306a36Sopenharmony_ci	.insns = {
86062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
86162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
86262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
86362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3),
86462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
86562306a36Sopenharmony_ci	},
86662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
86762306a36Sopenharmony_ci	.errstr = "jump out of range",
86862306a36Sopenharmony_ci	.result = REJECT,
86962306a36Sopenharmony_ci},
87062306a36Sopenharmony_ci{
87162306a36Sopenharmony_ci	"calls: jumping across function bodies. test2",
87262306a36Sopenharmony_ci	.insns = {
87362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3),
87462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
87562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
87662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
87762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
87862306a36Sopenharmony_ci	},
87962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
88062306a36Sopenharmony_ci	.errstr = "jump out of range",
88162306a36Sopenharmony_ci	.result = REJECT,
88262306a36Sopenharmony_ci},
88362306a36Sopenharmony_ci{
88462306a36Sopenharmony_ci	"calls: call without exit",
88562306a36Sopenharmony_ci	.insns = {
88662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
88762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
88862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
88962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
89062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
89162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2),
89262306a36Sopenharmony_ci	},
89362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
89462306a36Sopenharmony_ci	.errstr = "not an exit",
89562306a36Sopenharmony_ci	.result = REJECT,
89662306a36Sopenharmony_ci},
89762306a36Sopenharmony_ci{
89862306a36Sopenharmony_ci	"calls: call into middle of ld_imm64",
89962306a36Sopenharmony_ci	.insns = {
90062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
90162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
90262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
90362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
90462306a36Sopenharmony_ci	BPF_LD_IMM64(BPF_REG_0, 0),
90562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
90662306a36Sopenharmony_ci	},
90762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
90862306a36Sopenharmony_ci	.errstr = "last insn",
90962306a36Sopenharmony_ci	.result = REJECT,
91062306a36Sopenharmony_ci},
91162306a36Sopenharmony_ci{
91262306a36Sopenharmony_ci	"calls: call into middle of other call",
91362306a36Sopenharmony_ci	.insns = {
91462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
91562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
91662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
91762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
91862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
91962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
92062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
92162306a36Sopenharmony_ci	},
92262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
92362306a36Sopenharmony_ci	.errstr = "last insn",
92462306a36Sopenharmony_ci	.result = REJECT,
92562306a36Sopenharmony_ci},
92662306a36Sopenharmony_ci{
92762306a36Sopenharmony_ci	"calls: subprog call with ld_abs in main prog",
92862306a36Sopenharmony_ci	.insns = {
92962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
93062306a36Sopenharmony_ci	BPF_LD_ABS(BPF_B, 0),
93162306a36Sopenharmony_ci	BPF_LD_ABS(BPF_H, 0),
93262306a36Sopenharmony_ci	BPF_LD_ABS(BPF_W, 0),
93362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
93462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
93562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
93662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
93762306a36Sopenharmony_ci	BPF_LD_ABS(BPF_B, 0),
93862306a36Sopenharmony_ci	BPF_LD_ABS(BPF_H, 0),
93962306a36Sopenharmony_ci	BPF_LD_ABS(BPF_W, 0),
94062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
94162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 1),
94262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_3, 2),
94362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push),
94462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
94562306a36Sopenharmony_ci	},
94662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
94762306a36Sopenharmony_ci	.result = ACCEPT,
94862306a36Sopenharmony_ci},
94962306a36Sopenharmony_ci{
95062306a36Sopenharmony_ci	"calls: two calls with bad fallthrough",
95162306a36Sopenharmony_ci	.insns = {
95262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
95362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
95462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
95562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
95662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
95762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
95862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
95962306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
96062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
96162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_0),
96262306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1,
96362306a36Sopenharmony_ci		    offsetof(struct __sk_buff, len)),
96462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
96562306a36Sopenharmony_ci	},
96662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
96762306a36Sopenharmony_ci	.errstr = "not an exit",
96862306a36Sopenharmony_ci	.result = REJECT,
96962306a36Sopenharmony_ci},
97062306a36Sopenharmony_ci{
97162306a36Sopenharmony_ci	"calls: two calls with stack read",
97262306a36Sopenharmony_ci	.insns = {
97362306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
97462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
97562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
97662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
97762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
97862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
97962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6),
98062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
98162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
98262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
98362306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0),
98462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
98562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
98662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
98762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
98862306a36Sopenharmony_ci	},
98962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
99062306a36Sopenharmony_ci	.result = ACCEPT,
99162306a36Sopenharmony_ci},
99262306a36Sopenharmony_ci{
99362306a36Sopenharmony_ci	"calls: two calls with stack write",
99462306a36Sopenharmony_ci	.insns = {
99562306a36Sopenharmony_ci	/* main prog */
99662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
99762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
99862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
99962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
100062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
100162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
100262306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
100362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci	/* subprog 1 */
100662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
100762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
100862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7),
100962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_8, BPF_REG_0),
101062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
101162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
101262306a36Sopenharmony_ci	BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
101362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_8),
101462306a36Sopenharmony_ci	/* write into stack frame of main prog */
101562306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
101662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	/* subprog 2 */
101962306a36Sopenharmony_ci	/* read from stack frame of main prog */
102062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0),
102162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
102262306a36Sopenharmony_ci	},
102362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
102462306a36Sopenharmony_ci	.result = ACCEPT,
102562306a36Sopenharmony_ci},
102662306a36Sopenharmony_ci{
102762306a36Sopenharmony_ci	"calls: stack overflow using two frames (pre-call access)",
102862306a36Sopenharmony_ci	.insns = {
102962306a36Sopenharmony_ci	/* prog 1 */
103062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
103162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1),
103262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	/* prog 2 */
103562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
103662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
103762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
103862306a36Sopenharmony_ci	},
103962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
104062306a36Sopenharmony_ci	.errstr = "combined stack size",
104162306a36Sopenharmony_ci	.result = REJECT,
104262306a36Sopenharmony_ci},
104362306a36Sopenharmony_ci{
104462306a36Sopenharmony_ci	"calls: stack overflow using two frames (post-call access)",
104562306a36Sopenharmony_ci	.insns = {
104662306a36Sopenharmony_ci	/* prog 1 */
104762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2),
104862306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
104962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci	/* prog 2 */
105262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
105362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
105462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
105562306a36Sopenharmony_ci	},
105662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
105762306a36Sopenharmony_ci	.errstr = "combined stack size",
105862306a36Sopenharmony_ci	.result = REJECT,
105962306a36Sopenharmony_ci},
106062306a36Sopenharmony_ci{
106162306a36Sopenharmony_ci	"calls: stack depth check using three frames. test1",
106262306a36Sopenharmony_ci	.insns = {
106362306a36Sopenharmony_ci	/* main */
106462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
106562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
106662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
106762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
106862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
106962306a36Sopenharmony_ci	/* A */
107062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
107162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
107262306a36Sopenharmony_ci	/* B */
107362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
107462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
107562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
107662306a36Sopenharmony_ci	},
107762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
107862306a36Sopenharmony_ci	/* stack_main=32, stack_A=256, stack_B=64
107962306a36Sopenharmony_ci	 * and max(main+A, main+A+B) < 512
108062306a36Sopenharmony_ci	 */
108162306a36Sopenharmony_ci	.result = ACCEPT,
108262306a36Sopenharmony_ci},
108362306a36Sopenharmony_ci{
108462306a36Sopenharmony_ci	"calls: stack depth check using three frames. test2",
108562306a36Sopenharmony_ci	.insns = {
108662306a36Sopenharmony_ci	/* main */
108762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
108862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */
108962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0),
109062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
109162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
109262306a36Sopenharmony_ci	/* A */
109362306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
109462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
109562306a36Sopenharmony_ci	/* B */
109662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */
109762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
109862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
109962306a36Sopenharmony_ci	},
110062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
110162306a36Sopenharmony_ci	/* stack_main=32, stack_A=64, stack_B=256
110262306a36Sopenharmony_ci	 * and max(main+A, main+A+B) < 512
110362306a36Sopenharmony_ci	 */
110462306a36Sopenharmony_ci	.result = ACCEPT,
110562306a36Sopenharmony_ci},
110662306a36Sopenharmony_ci{
110762306a36Sopenharmony_ci	"calls: stack depth check using three frames. test3",
110862306a36Sopenharmony_ci	.insns = {
110962306a36Sopenharmony_ci	/* main */
111062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
111162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
111262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
111362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */
111462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1),
111562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0),
111662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
111762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
111862306a36Sopenharmony_ci	/* A */
111962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1),
112062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
112162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0),
112262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -3),
112362306a36Sopenharmony_ci	/* B */
112462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1),
112562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */
112662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0),
112762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
112862306a36Sopenharmony_ci	},
112962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
113062306a36Sopenharmony_ci	/* stack_main=64, stack_A=224, stack_B=256
113162306a36Sopenharmony_ci	 * and max(main+A, main+A+B) > 512
113262306a36Sopenharmony_ci	 */
113362306a36Sopenharmony_ci	.errstr = "combined stack",
113462306a36Sopenharmony_ci	.result = REJECT,
113562306a36Sopenharmony_ci},
113662306a36Sopenharmony_ci{
113762306a36Sopenharmony_ci	"calls: stack depth check using three frames. test4",
113862306a36Sopenharmony_ci	/* void main(void) {
113962306a36Sopenharmony_ci	 *   func1(0);
114062306a36Sopenharmony_ci	 *   func1(1);
114162306a36Sopenharmony_ci	 *   func2(1);
114262306a36Sopenharmony_ci	 * }
114362306a36Sopenharmony_ci	 * void func1(int alloc_or_recurse) {
114462306a36Sopenharmony_ci	 *   if (alloc_or_recurse) {
114562306a36Sopenharmony_ci	 *     frame_pointer[-300] = 1;
114662306a36Sopenharmony_ci	 *   } else {
114762306a36Sopenharmony_ci	 *     func2(alloc_or_recurse);
114862306a36Sopenharmony_ci	 *   }
114962306a36Sopenharmony_ci	 * }
115062306a36Sopenharmony_ci	 * void func2(int alloc_or_recurse) {
115162306a36Sopenharmony_ci	 *   if (alloc_or_recurse) {
115262306a36Sopenharmony_ci	 *     frame_pointer[-300] = 1;
115362306a36Sopenharmony_ci	 *   }
115462306a36Sopenharmony_ci	 * }
115562306a36Sopenharmony_ci	 */
115662306a36Sopenharmony_ci	.insns = {
115762306a36Sopenharmony_ci	/* main */
115862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 0),
115962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */
116062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 1),
116162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */
116262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 1),
116362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */
116462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
116562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
116662306a36Sopenharmony_ci	/* A */
116762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2),
116862306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
116962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
117062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
117162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
117262306a36Sopenharmony_ci	/* B */
117362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
117462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0),
117562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
117662306a36Sopenharmony_ci	},
117762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
117862306a36Sopenharmony_ci	.result = REJECT,
117962306a36Sopenharmony_ci	.errstr = "combined stack",
118062306a36Sopenharmony_ci},
118162306a36Sopenharmony_ci{
118262306a36Sopenharmony_ci	"calls: stack depth check using three frames. test5",
118362306a36Sopenharmony_ci	.insns = {
118462306a36Sopenharmony_ci	/* main */
118562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */
118662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
118762306a36Sopenharmony_ci	/* A */
118862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */
118962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
119062306a36Sopenharmony_ci	/* B */
119162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */
119262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
119362306a36Sopenharmony_ci	/* C */
119462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */
119562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
119662306a36Sopenharmony_ci	/* D */
119762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */
119862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
119962306a36Sopenharmony_ci	/* E */
120062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */
120162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
120262306a36Sopenharmony_ci	/* F */
120362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */
120462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
120562306a36Sopenharmony_ci	/* G */
120662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */
120762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
120862306a36Sopenharmony_ci	/* H */
120962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
121062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
121162306a36Sopenharmony_ci	},
121262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
121362306a36Sopenharmony_ci	.errstr = "call stack",
121462306a36Sopenharmony_ci	.result = REJECT,
121562306a36Sopenharmony_ci},
121662306a36Sopenharmony_ci{
121762306a36Sopenharmony_ci	"calls: stack depth check in dead code",
121862306a36Sopenharmony_ci	.insns = {
121962306a36Sopenharmony_ci	/* main */
122062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_1, 0),
122162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */
122262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
122362306a36Sopenharmony_ci	/* A */
122462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
122562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), /* call B */
122662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
122762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
122862306a36Sopenharmony_ci	/* B */
122962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */
123062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
123162306a36Sopenharmony_ci	/* C */
123262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */
123362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
123462306a36Sopenharmony_ci	/* D */
123562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */
123662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
123762306a36Sopenharmony_ci	/* E */
123862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */
123962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
124062306a36Sopenharmony_ci	/* F */
124162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */
124262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
124362306a36Sopenharmony_ci	/* G */
124462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */
124562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
124662306a36Sopenharmony_ci	/* H */
124762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
124862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
124962306a36Sopenharmony_ci	},
125062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
125162306a36Sopenharmony_ci	.errstr = "call stack",
125262306a36Sopenharmony_ci	.result = REJECT,
125362306a36Sopenharmony_ci},
125462306a36Sopenharmony_ci{
125562306a36Sopenharmony_ci	"calls: spill into caller stack frame",
125662306a36Sopenharmony_ci	.insns = {
125762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
125862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
125962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
126062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
126162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
126262306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0),
126362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
126462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
126562306a36Sopenharmony_ci	},
126662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
126762306a36Sopenharmony_ci	.errstr = "cannot spill",
126862306a36Sopenharmony_ci	.result = REJECT,
126962306a36Sopenharmony_ci},
127062306a36Sopenharmony_ci{
127162306a36Sopenharmony_ci	"calls: write into caller stack frame",
127262306a36Sopenharmony_ci	.insns = {
127362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
127462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
127562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
127662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
127762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
127862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
127962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42),
128062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
128162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
128262306a36Sopenharmony_ci	},
128362306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
128462306a36Sopenharmony_ci	.result = ACCEPT,
128562306a36Sopenharmony_ci	.retval = 42,
128662306a36Sopenharmony_ci},
128762306a36Sopenharmony_ci{
128862306a36Sopenharmony_ci	"calls: write into callee stack frame",
128962306a36Sopenharmony_ci	.insns = {
129062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
129162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42),
129262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
129362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
129462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8),
129562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
129662306a36Sopenharmony_ci	},
129762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
129862306a36Sopenharmony_ci	.errstr = "cannot return stack pointer",
129962306a36Sopenharmony_ci	.result = REJECT,
130062306a36Sopenharmony_ci},
130162306a36Sopenharmony_ci{
130262306a36Sopenharmony_ci	"calls: two calls with stack write and void return",
130362306a36Sopenharmony_ci	.insns = {
130462306a36Sopenharmony_ci	/* main prog */
130562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
130662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
130762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
130862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
130962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
131062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
131162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
131262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	/* subprog 1 */
131562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
131662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
131762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
131862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
131962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
132062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	/* subprog 2 */
132362306a36Sopenharmony_ci	/* write into stack frame of main prog */
132462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
132562306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* void return */
132662306a36Sopenharmony_ci	},
132762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
132862306a36Sopenharmony_ci	.result = ACCEPT,
132962306a36Sopenharmony_ci},
133062306a36Sopenharmony_ci{
133162306a36Sopenharmony_ci	"calls: ambiguous return value",
133262306a36Sopenharmony_ci	.insns = {
133362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
133462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
133562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
133662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
133762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
133862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
133962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
134062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1),
134162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
134262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
134362306a36Sopenharmony_ci	},
134462306a36Sopenharmony_ci	.errstr_unpriv = "allowed for",
134562306a36Sopenharmony_ci	.result_unpriv = REJECT,
134662306a36Sopenharmony_ci	.errstr = "R0 !read_ok",
134762306a36Sopenharmony_ci	.result = REJECT,
134862306a36Sopenharmony_ci},
134962306a36Sopenharmony_ci{
135062306a36Sopenharmony_ci	"calls: two calls that return map_value",
135162306a36Sopenharmony_ci	.insns = {
135262306a36Sopenharmony_ci	/* main prog */
135362306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
135462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
135562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
135662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
135762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
135862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8),
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
136162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
136262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
136362306a36Sopenharmony_ci	/* write into map value */
136462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
136562306a36Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
136662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16),
136762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
136862306a36Sopenharmony_ci	/* write into map value */
136962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
137062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
137162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	/* subprog 1 */
137462306a36Sopenharmony_ci	/* call 3rd function twice */
137562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
137662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
137762306a36Sopenharmony_ci	/* first time with fp-8 */
137862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
137962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
138062306a36Sopenharmony_ci	/* second time with fp-16 */
138162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
138262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	/* subprog 2 */
138562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
138662306a36Sopenharmony_ci	/* lookup from map */
138762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
138862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
138962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
139062306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
139162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
139262306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
139362306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
139462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
139562306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
139662306a36Sopenharmony_ci	},
139762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
139862306a36Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
139962306a36Sopenharmony_ci	.result = ACCEPT,
140062306a36Sopenharmony_ci},
140162306a36Sopenharmony_ci{
140262306a36Sopenharmony_ci	"calls: two calls that return map_value with bool condition",
140362306a36Sopenharmony_ci	.insns = {
140462306a36Sopenharmony_ci	/* main prog */
140562306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
140662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
140762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
140862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
140962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
141062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
141162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
141262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
141362306a36Sopenharmony_ci
141462306a36Sopenharmony_ci	/* subprog 1 */
141562306a36Sopenharmony_ci	/* call 3rd function twice */
141662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
141762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
141862306a36Sopenharmony_ci	/* first time with fp-8 */
141962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
142062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
142162306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
142262306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
142362306a36Sopenharmony_ci	/* write into map value */
142462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
142562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
142662306a36Sopenharmony_ci	/* second time with fp-16 */
142762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
142862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
142962306a36Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
143062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
143162306a36Sopenharmony_ci	/* write into map value */
143262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
143362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	/* subprog 2 */
143662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
143762306a36Sopenharmony_ci	/* lookup from map */
143862306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
143962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
144062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
144162306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
144262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
144362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
144462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
144562306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
144662306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
144762306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
144862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
144962306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* return 1 */
145062306a36Sopenharmony_ci	},
145162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
145262306a36Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
145362306a36Sopenharmony_ci	.result = ACCEPT,
145462306a36Sopenharmony_ci},
145562306a36Sopenharmony_ci{
145662306a36Sopenharmony_ci	"calls: two calls that return map_value with incorrect bool check",
145762306a36Sopenharmony_ci	.insns = {
145862306a36Sopenharmony_ci	/* main prog */
145962306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
146062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
146162306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
146262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
146362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
146462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
146562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
146662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
146762306a36Sopenharmony_ci
146862306a36Sopenharmony_ci	/* subprog 1 */
146962306a36Sopenharmony_ci	/* call 3rd function twice */
147062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
147162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
147262306a36Sopenharmony_ci	/* first time with fp-8 */
147362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9),
147462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2),
147562306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
147662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0),
147762306a36Sopenharmony_ci	/* write into map value */
147862306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
147962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
148062306a36Sopenharmony_ci	/* second time with fp-16 */
148162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
148262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
148362306a36Sopenharmony_ci	/* fetch secound map_value_ptr from the stack */
148462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0),
148562306a36Sopenharmony_ci	/* write into map value */
148662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
148762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	/* subprog 2 */
149062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
149162306a36Sopenharmony_ci	/* lookup from map */
149262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
149362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
149462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
149562306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
149662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
149762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
149862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
149962306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* return 0 */
150062306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog */
150162306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
150262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 1),
150362306a36Sopenharmony_ci	BPF_EXIT_INSN(), /* return 1 */
150462306a36Sopenharmony_ci	},
150562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
150662306a36Sopenharmony_ci	.fixup_map_hash_8b = { 23 },
150762306a36Sopenharmony_ci	.result = REJECT,
150862306a36Sopenharmony_ci	.errstr = "R0 invalid mem access 'scalar'",
150962306a36Sopenharmony_ci	.result_unpriv = REJECT,
151062306a36Sopenharmony_ci	.errstr_unpriv = "invalid read from stack R7 off=-16 size=8",
151162306a36Sopenharmony_ci},
151262306a36Sopenharmony_ci{
151362306a36Sopenharmony_ci	"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1",
151462306a36Sopenharmony_ci	.insns = {
151562306a36Sopenharmony_ci	/* main prog */
151662306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
151762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
151862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
151962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
152062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
152162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
152262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
152362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_ci	/* subprog 1 */
152662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
152762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
152862306a36Sopenharmony_ci	/* 1st lookup from map */
152962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
153062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
153162306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
153262306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
153362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
153462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
153562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
153662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
153762306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
153862306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
153962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
154062306a36Sopenharmony_ci
154162306a36Sopenharmony_ci	/* 2nd lookup from map */
154262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
154362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
154462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
154562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
154662306a36Sopenharmony_ci		     BPF_FUNC_map_lookup_elem),
154762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
154862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
154962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
155062306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
155162306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
155262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
155562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
155662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
155762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
155862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
155962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
156062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_ci	/* subprog 2 */
156362306a36Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
156462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
156562306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
156662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
156762306a36Sopenharmony_ci	/* write into map value */
156862306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
156962306a36Sopenharmony_ci
157062306a36Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
157162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
157262306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
157362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
157462306a36Sopenharmony_ci	/* write into map value */
157562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
157662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
157762306a36Sopenharmony_ci	},
157862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
157962306a36Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
158062306a36Sopenharmony_ci	.result = REJECT,
158162306a36Sopenharmony_ci	.errstr = "invalid access to map value, value_size=8 off=2 size=8",
158262306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
158362306a36Sopenharmony_ci},
158462306a36Sopenharmony_ci{
158562306a36Sopenharmony_ci	"calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2",
158662306a36Sopenharmony_ci	.insns = {
158762306a36Sopenharmony_ci	/* main prog */
158862306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
158962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
159062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
159162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
159262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
159362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
159462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
159562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci	/* subprog 1 */
159862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
159962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
160062306a36Sopenharmony_ci	/* 1st lookup from map */
160162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
160262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
160362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
160462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
160562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
160662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
160762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
160862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
160962306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
161062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
161162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_ci	/* 2nd lookup from map */
161462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */
161562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
161662306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
161762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */
161862306a36Sopenharmony_ci		     BPF_FUNC_map_lookup_elem),
161962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
162062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
162162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
162262306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
162362306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
162462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
162562306a36Sopenharmony_ci
162662306a36Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
162762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */
162862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
162962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
163062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
163162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),  /* 34 */
163262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci	/* subprog 2 */
163562306a36Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
163662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
163762306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
163862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
163962306a36Sopenharmony_ci	/* write into map value */
164062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
164362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
164462306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
164562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
164662306a36Sopenharmony_ci	/* write into map value */
164762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
164862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
164962306a36Sopenharmony_ci	},
165062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
165162306a36Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
165262306a36Sopenharmony_ci	.result = ACCEPT,
165362306a36Sopenharmony_ci},
165462306a36Sopenharmony_ci{
165562306a36Sopenharmony_ci	"calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3",
165662306a36Sopenharmony_ci	.insns = {
165762306a36Sopenharmony_ci	/* main prog */
165862306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
165962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
166062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
166162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
166262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
166362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2),
166462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
166562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
166662306a36Sopenharmony_ci
166762306a36Sopenharmony_ci	/* subprog 1 */
166862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
166962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
167062306a36Sopenharmony_ci	/* 1st lookup from map */
167162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0),
167262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
167362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
167462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
167562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
167662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
167762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
167862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
167962306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-8 */
168062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
168162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_ci	/* 2nd lookup from map */
168462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
168562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24),
168662306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
168762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
168862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
168962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),  // 26
169062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
169162306a36Sopenharmony_ci	/* write map_value_ptr into stack frame of main prog at fp-16 */
169262306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
169362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
169662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30
169762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
169862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
169962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
170062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34
170162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -30),
170262306a36Sopenharmony_ci
170362306a36Sopenharmony_ci	/* subprog 2 */
170462306a36Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
170562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
170662306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
170762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
170862306a36Sopenharmony_ci	/* write into map value */
170962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
171262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
171362306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
171462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
171562306a36Sopenharmony_ci	/* write into map value */
171662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0),
171762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, -8),
171862306a36Sopenharmony_ci	},
171962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
172062306a36Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
172162306a36Sopenharmony_ci	.result = REJECT,
172262306a36Sopenharmony_ci	.errstr = "invalid access to map value, value_size=8 off=2 size=8",
172362306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
172462306a36Sopenharmony_ci},
172562306a36Sopenharmony_ci{
172662306a36Sopenharmony_ci	"calls: two calls that receive map_value_ptr_or_null via arg. test1",
172762306a36Sopenharmony_ci	.insns = {
172862306a36Sopenharmony_ci	/* main prog */
172962306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
173062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
173162306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
173262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
173362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
173462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
173562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
173662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
173762306a36Sopenharmony_ci
173862306a36Sopenharmony_ci	/* subprog 1 */
173962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
174062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
174162306a36Sopenharmony_ci	/* 1st lookup from map */
174262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
174362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
174462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
174562306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
174662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
174762306a36Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
174862306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
174962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
175062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
175162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
175262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci	/* 2nd lookup from map */
175562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
175662306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
175762306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
175862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
175962306a36Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
176062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
176162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
176262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
176362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
176462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
176562306a36Sopenharmony_ci
176662306a36Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
176762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
176862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
176962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
177062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
177162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
177262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
177362306a36Sopenharmony_ci
177462306a36Sopenharmony_ci	/* subprog 2 */
177562306a36Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
177662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
177762306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
177862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
177962306a36Sopenharmony_ci	/* write into map value */
178062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_ci	/* if arg4 == 1 do *arg3 = 0 */
178362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2),
178462306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
178562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
178662306a36Sopenharmony_ci	/* write into map value */
178762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
178862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
178962306a36Sopenharmony_ci	},
179062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
179162306a36Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
179262306a36Sopenharmony_ci	.result = ACCEPT,
179362306a36Sopenharmony_ci},
179462306a36Sopenharmony_ci{
179562306a36Sopenharmony_ci	"calls: two calls that receive map_value_ptr_or_null via arg. test2",
179662306a36Sopenharmony_ci	.insns = {
179762306a36Sopenharmony_ci	/* main prog */
179862306a36Sopenharmony_ci	/* pass fp-16, fp-8 into a function */
179962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
180062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
180162306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
180262306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16),
180362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
180462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
180562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci	/* subprog 1 */
180862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
180962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_2),
181062306a36Sopenharmony_ci	/* 1st lookup from map */
181162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
181262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
181362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
181462306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
181562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
181662306a36Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
181762306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
181862306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
181962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
182062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
182162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci	/* 2nd lookup from map */
182462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
182562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
182662306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
182762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
182862306a36Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-16 */
182962306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0),
183062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
183162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
183262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
183362306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci	/* call 3rd func with fp-8, 0|1, fp-16, 0|1 */
183662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
183762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_8),
183862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_3, BPF_REG_7),
183962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_9),
184062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
184162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
184262306a36Sopenharmony_ci
184362306a36Sopenharmony_ci	/* subprog 2 */
184462306a36Sopenharmony_ci	/* if arg2 == 1 do *arg1 = 0 */
184562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2),
184662306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
184762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
184862306a36Sopenharmony_ci	/* write into map value */
184962306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_ci	/* if arg4 == 0 do *arg3 = 0 */
185262306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2),
185362306a36Sopenharmony_ci	/* fetch map_value_ptr from the stack of this function */
185462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
185562306a36Sopenharmony_ci	/* write into map value */
185662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
185762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
185862306a36Sopenharmony_ci	},
185962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
186062306a36Sopenharmony_ci	.fixup_map_hash_8b = { 12, 22 },
186162306a36Sopenharmony_ci	.result = REJECT,
186262306a36Sopenharmony_ci	.errstr = "R0 invalid mem access 'scalar'",
186362306a36Sopenharmony_ci},
186462306a36Sopenharmony_ci{
186562306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack",
186662306a36Sopenharmony_ci	.insns = {
186762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
186862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
186962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
187062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
187162306a36Sopenharmony_ci
187262306a36Sopenharmony_ci	/* subprog 1 */
187362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
187462306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
187562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
187662306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
187762306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
187862306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
187962306a36Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
188062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
188162306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
188262306a36Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
188362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
188462306a36Sopenharmony_ci	/* write 4 bytes into packet */
188562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
188662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
188762306a36Sopenharmony_ci	},
188862306a36Sopenharmony_ci	.result = ACCEPT,
188962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
189062306a36Sopenharmony_ci	.retval = POINTER_VALUE,
189162306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
189262306a36Sopenharmony_ci},
189362306a36Sopenharmony_ci{
189462306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 2",
189562306a36Sopenharmony_ci	.insns = {
189662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
189762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
189862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
189962306a36Sopenharmony_ci	/* Marking is still kept, but not in all cases safe. */
190062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
190162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
190262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
190362306a36Sopenharmony_ci
190462306a36Sopenharmony_ci	/* subprog 1 */
190562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
190662306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
190762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
190862306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
190962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
191062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
191162306a36Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
191262306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
191362306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
191462306a36Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
191562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
191662306a36Sopenharmony_ci	/* write 4 bytes into packet */
191762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
191862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
191962306a36Sopenharmony_ci	},
192062306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
192162306a36Sopenharmony_ci	.errstr = "invalid access to packet",
192262306a36Sopenharmony_ci	.result = REJECT,
192362306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
192462306a36Sopenharmony_ci},
192562306a36Sopenharmony_ci{
192662306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 3",
192762306a36Sopenharmony_ci	.insns = {
192862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
192962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
193062306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
193162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
193262306a36Sopenharmony_ci	/* Marking is still kept and safe here. */
193362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
193462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
193562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
193662306a36Sopenharmony_ci
193762306a36Sopenharmony_ci	/* subprog 1 */
193862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
193962306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
194062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
194162306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
194262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
194362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
194462306a36Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
194562306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
194662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
194762306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
194862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
194962306a36Sopenharmony_ci	/* now the pkt range is verified, read pkt_ptr from stack */
195062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0),
195162306a36Sopenharmony_ci	/* write 4 bytes into packet */
195262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
195362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
195462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
195562306a36Sopenharmony_ci	},
195662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
195762306a36Sopenharmony_ci	.result = ACCEPT,
195862306a36Sopenharmony_ci	.retval = 1,
195962306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
196062306a36Sopenharmony_ci},
196162306a36Sopenharmony_ci{
196262306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 4",
196362306a36Sopenharmony_ci	.insns = {
196462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
196562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
196662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
196762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
196862306a36Sopenharmony_ci	/* Check marking propagated. */
196962306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
197062306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0),
197162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci	/* subprog 1 */
197462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
197562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
197662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
197762306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
197862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
197962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
198062306a36Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
198162306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
198262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
198362306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
198462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
198562306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
198662306a36Sopenharmony_ci	/* write 4 bytes into packet */
198762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
198862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
198962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
199062306a36Sopenharmony_ci	},
199162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
199262306a36Sopenharmony_ci	.result = ACCEPT,
199362306a36Sopenharmony_ci	.retval = 1,
199462306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
199562306a36Sopenharmony_ci},
199662306a36Sopenharmony_ci{
199762306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 5",
199862306a36Sopenharmony_ci	.insns = {
199962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
200062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
200162306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0),
200262306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
200362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
200462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
200562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
200662306a36Sopenharmony_ci
200762306a36Sopenharmony_ci	/* subprog 1 */
200862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
200962306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
201062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
201162306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
201262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
201362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
201462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
201562306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
201662306a36Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
201762306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
201862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
201962306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
202062306a36Sopenharmony_ci	/* write 4 bytes into packet */
202162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
202262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
202362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
202462306a36Sopenharmony_ci	},
202562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
202662306a36Sopenharmony_ci	.errstr = "same insn cannot be used with different",
202762306a36Sopenharmony_ci	.result = REJECT,
202862306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
202962306a36Sopenharmony_ci},
203062306a36Sopenharmony_ci{
203162306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 6",
203262306a36Sopenharmony_ci	.insns = {
203362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
203462306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
203562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
203662306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
203762306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
203862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
203962306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
204062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
204162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci	/* subprog 1 */
204462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
204562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
204662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
204762306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
204862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
204962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
205062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
205162306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
205262306a36Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
205362306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
205462306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
205562306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
205662306a36Sopenharmony_ci	/* write 4 bytes into packet */
205762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
205862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
205962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
206062306a36Sopenharmony_ci	},
206162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
206262306a36Sopenharmony_ci	.errstr = "R4 invalid mem access",
206362306a36Sopenharmony_ci	.result = REJECT,
206462306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
206562306a36Sopenharmony_ci},
206662306a36Sopenharmony_ci{
206762306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 7",
206862306a36Sopenharmony_ci	.insns = {
206962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_2, 0),
207062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
207162306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
207262306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
207362306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
207462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
207562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
207662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_ci	/* subprog 1 */
207962306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
208062306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
208162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
208262306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
208362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
208462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
208562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
208662306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
208762306a36Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
208862306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
208962306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
209062306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
209162306a36Sopenharmony_ci	/* write 4 bytes into packet */
209262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
209362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
209462306a36Sopenharmony_ci	BPF_EXIT_INSN(),
209562306a36Sopenharmony_ci	},
209662306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
209762306a36Sopenharmony_ci	.errstr = "R4 invalid mem access",
209862306a36Sopenharmony_ci	.result = REJECT,
209962306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
210062306a36Sopenharmony_ci},
210162306a36Sopenharmony_ci{
210262306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 8",
210362306a36Sopenharmony_ci	.insns = {
210462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
210562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
210662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
210762306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
210862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
210962306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
211062306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
211162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
211262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
211362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
211462306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
211562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
211662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
211762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
211862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
211962306a36Sopenharmony_ci
212062306a36Sopenharmony_ci	/* subprog 1 */
212162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
212262306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
212362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
212462306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
212562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
212662306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
212762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
212862306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3),
212962306a36Sopenharmony_ci	/* spill checked pkt_ptr into stack of caller */
213062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
213162306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
213262306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
213362306a36Sopenharmony_ci	/* write 4 bytes into packet */
213462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
213562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
213662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
213762306a36Sopenharmony_ci	},
213862306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
213962306a36Sopenharmony_ci	.result = ACCEPT,
214062306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
214162306a36Sopenharmony_ci},
214262306a36Sopenharmony_ci{
214362306a36Sopenharmony_ci	"calls: pkt_ptr spill into caller stack 9",
214462306a36Sopenharmony_ci	.insns = {
214562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
214662306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
214762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
214862306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
214962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
215062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
215162306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1),
215262306a36Sopenharmony_ci	BPF_EXIT_INSN(),
215362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_4, BPF_REG_10),
215462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8),
215562306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
215662306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
215762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8),
215862306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0),
215962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
216062306a36Sopenharmony_ci
216162306a36Sopenharmony_ci	/* subprog 1 */
216262306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1,
216362306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data)),
216462306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
216562306a36Sopenharmony_ci		    offsetof(struct __sk_buff, data_end)),
216662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
216762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
216862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 0),
216962306a36Sopenharmony_ci	/* spill unchecked pkt_ptr into stack of caller */
217062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0),
217162306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2),
217262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_5, 1),
217362306a36Sopenharmony_ci	/* don't read back pkt_ptr from stack here */
217462306a36Sopenharmony_ci	/* write 4 bytes into packet */
217562306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
217662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
217762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
217862306a36Sopenharmony_ci	},
217962306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
218062306a36Sopenharmony_ci	.errstr = "invalid access to packet",
218162306a36Sopenharmony_ci	.result = REJECT,
218262306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
218362306a36Sopenharmony_ci},
218462306a36Sopenharmony_ci{
218562306a36Sopenharmony_ci	"calls: caller stack init to zero or map_value_or_null",
218662306a36Sopenharmony_ci	.insns = {
218762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
218862306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
218962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
219062306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
219162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
219262306a36Sopenharmony_ci	/* fetch map_value_or_null or const_zero from stack */
219362306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
219462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1),
219562306a36Sopenharmony_ci	/* store into map_value */
219662306a36Sopenharmony_ci	BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
219762306a36Sopenharmony_ci	BPF_EXIT_INSN(),
219862306a36Sopenharmony_ci
219962306a36Sopenharmony_ci	/* subprog 1 */
220062306a36Sopenharmony_ci	/* if (ctx == 0) return; */
220162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8),
220262306a36Sopenharmony_ci	/* else bpf_map_lookup() and *(fp - 8) = r0 */
220362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_2),
220462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
220562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
220662306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
220762306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
220862306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
220962306a36Sopenharmony_ci	/* write map_value_ptr_or_null into stack frame of main prog at fp-8 */
221062306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0),
221162306a36Sopenharmony_ci	BPF_EXIT_INSN(),
221262306a36Sopenharmony_ci	},
221362306a36Sopenharmony_ci	.fixup_map_hash_8b = { 13 },
221462306a36Sopenharmony_ci	.result = ACCEPT,
221562306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_XDP,
221662306a36Sopenharmony_ci},
221762306a36Sopenharmony_ci{
221862306a36Sopenharmony_ci	"calls: stack init to zero and pruning",
221962306a36Sopenharmony_ci	.insns = {
222062306a36Sopenharmony_ci	/* first make allocated_stack 16 byte */
222162306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0),
222262306a36Sopenharmony_ci	/* now fork the execution such that the false branch
222362306a36Sopenharmony_ci	 * of JGT insn will be verified second and it skisp zero
222462306a36Sopenharmony_ci	 * init of fp-8 stack slot. If stack liveness marking
222562306a36Sopenharmony_ci	 * is missing live_read marks from call map_lookup
222662306a36Sopenharmony_ci	 * processing then pruning will incorrectly assume
222762306a36Sopenharmony_ci	 * that fp-8 stack slot was unused in the fall-through
222862306a36Sopenharmony_ci	 * branch and will accept the program incorrectly
222962306a36Sopenharmony_ci	 */
223062306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_get_prandom_u32),
223162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JGT, BPF_REG_0, 2, 2),
223262306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
223362306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JA, 0, 0, 0),
223462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
223562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
223662306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1, 0),
223762306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
223862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
223962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
224062306a36Sopenharmony_ci	},
224162306a36Sopenharmony_ci	.fixup_map_hash_48b = { 7 },
224262306a36Sopenharmony_ci	.errstr_unpriv = "invalid indirect read from stack R2 off -8+0 size 8",
224362306a36Sopenharmony_ci	.result_unpriv = REJECT,
224462306a36Sopenharmony_ci	/* in privileged mode reads from uninitialized stack locations are permitted */
224562306a36Sopenharmony_ci	.result = ACCEPT,
224662306a36Sopenharmony_ci},
224762306a36Sopenharmony_ci{
224862306a36Sopenharmony_ci	"calls: ctx read at start of subprog",
224962306a36Sopenharmony_ci	.insns = {
225062306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
225162306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5),
225262306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0),
225362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
225462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2),
225562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
225662306a36Sopenharmony_ci	BPF_EXIT_INSN(),
225762306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0),
225862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
225962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
226062306a36Sopenharmony_ci	},
226162306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
226262306a36Sopenharmony_ci	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
226362306a36Sopenharmony_ci	.result_unpriv = REJECT,
226462306a36Sopenharmony_ci	.result = ACCEPT,
226562306a36Sopenharmony_ci},
226662306a36Sopenharmony_ci{
226762306a36Sopenharmony_ci	"calls: cross frame pruning",
226862306a36Sopenharmony_ci	.insns = {
226962306a36Sopenharmony_ci	/* r8 = !!random();
227062306a36Sopenharmony_ci	 * call pruner()
227162306a36Sopenharmony_ci	 * if (r8)
227262306a36Sopenharmony_ci	 *     do something bad;
227362306a36Sopenharmony_ci	 */
227462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
227562306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
227662306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
227762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
227862306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_8),
227962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
228062306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1),
228162306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0),
228262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
228362306a36Sopenharmony_ci	BPF_EXIT_INSN(),
228462306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
228562306a36Sopenharmony_ci	BPF_EXIT_INSN(),
228662306a36Sopenharmony_ci	},
228762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
228862306a36Sopenharmony_ci	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
228962306a36Sopenharmony_ci	.errstr = "!read_ok",
229062306a36Sopenharmony_ci	.result = REJECT,
229162306a36Sopenharmony_ci},
229262306a36Sopenharmony_ci{
229362306a36Sopenharmony_ci	"calls: cross frame pruning - liveness propagation",
229462306a36Sopenharmony_ci	.insns = {
229562306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
229662306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 0),
229762306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
229862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_8, 1),
229962306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
230062306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 0),
230162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
230262306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_9, 1),
230362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
230462306a36Sopenharmony_ci	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4),
230562306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1),
230662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_2, 0),
230762306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
230862306a36Sopenharmony_ci	BPF_EXIT_INSN(),
230962306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0),
231062306a36Sopenharmony_ci	BPF_EXIT_INSN(),
231162306a36Sopenharmony_ci	},
231262306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
231362306a36Sopenharmony_ci	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
231462306a36Sopenharmony_ci	.errstr = "!read_ok",
231562306a36Sopenharmony_ci	.result = REJECT,
231662306a36Sopenharmony_ci},
231762306a36Sopenharmony_ci/* Make sure that verifier.c:states_equal() considers IDs from all
231862306a36Sopenharmony_ci * frames when building 'idmap' for check_ids().
231962306a36Sopenharmony_ci */
232062306a36Sopenharmony_ci{
232162306a36Sopenharmony_ci	"calls: check_ids() across call boundary",
232262306a36Sopenharmony_ci	.insns = {
232362306a36Sopenharmony_ci	/* Function main() */
232462306a36Sopenharmony_ci	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
232562306a36Sopenharmony_ci	/* fp[-24] = map_lookup_elem(...) ; get a MAP_VALUE_PTR_OR_NULL with some ID */
232662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
232762306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
232862306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1,
232962306a36Sopenharmony_ci		      0),
233062306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
233162306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_0, -24),
233262306a36Sopenharmony_ci	/* fp[-32] = map_lookup_elem(...) ; get a MAP_VALUE_PTR_OR_NULL with some ID */
233362306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
233462306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
233562306a36Sopenharmony_ci	BPF_LD_MAP_FD(BPF_REG_1,
233662306a36Sopenharmony_ci		      0),
233762306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem),
233862306a36Sopenharmony_ci	BPF_STX_MEM(BPF_DW, BPF_REG_FP, BPF_REG_0, -32),
233962306a36Sopenharmony_ci	/* call foo(&fp[-24], &fp[-32])   ; both arguments have IDs in the current
234062306a36Sopenharmony_ci	 *                                ; stack frame
234162306a36Sopenharmony_ci	 */
234262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_1, BPF_REG_FP),
234362306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -24),
234462306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_2, BPF_REG_FP),
234562306a36Sopenharmony_ci	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -32),
234662306a36Sopenharmony_ci	BPF_CALL_REL(2),
234762306a36Sopenharmony_ci	/* exit 0 */
234862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
234962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
235062306a36Sopenharmony_ci	/* Function foo()
235162306a36Sopenharmony_ci	 *
235262306a36Sopenharmony_ci	 * r9 = &frame[0].fp[-24]  ; save arguments in the callee saved registers,
235362306a36Sopenharmony_ci	 * r8 = &frame[0].fp[-32]  ; arguments are pointers to pointers to map value
235462306a36Sopenharmony_ci	 */
235562306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_9, BPF_REG_1),
235662306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_8, BPF_REG_2),
235762306a36Sopenharmony_ci	/* r7 = ktime_get_ns() */
235862306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns),
235962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
236062306a36Sopenharmony_ci	/* r6 = ktime_get_ns() */
236162306a36Sopenharmony_ci	BPF_EMIT_CALL(BPF_FUNC_ktime_get_ns),
236262306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
236362306a36Sopenharmony_ci	/* if r6 > r7 goto +1      ; no new information about the state is derived from
236462306a36Sopenharmony_ci	 *                         ; this check, thus produced verifier states differ
236562306a36Sopenharmony_ci	 *                         ; only in 'insn_idx'
236662306a36Sopenharmony_ci	 * r9 = r8
236762306a36Sopenharmony_ci	 */
236862306a36Sopenharmony_ci	BPF_JMP_REG(BPF_JGT, BPF_REG_6, BPF_REG_7, 1),
236962306a36Sopenharmony_ci	BPF_MOV64_REG(BPF_REG_9, BPF_REG_8),
237062306a36Sopenharmony_ci	/* r9 = *r9                ; verifier get's to this point via two paths:
237162306a36Sopenharmony_ci	 *                         ; (I) one including r9 = r8, verified first;
237262306a36Sopenharmony_ci	 *                         ; (II) one excluding r9 = r8, verified next.
237362306a36Sopenharmony_ci	 *                         ; After load of *r9 to r9 the frame[0].fp[-24].id == r9.id.
237462306a36Sopenharmony_ci	 *                         ; Suppose that checkpoint is created here via path (I).
237562306a36Sopenharmony_ci	 *                         ; When verifying via (II) the r9.id must be compared against
237662306a36Sopenharmony_ci	 *                         ; frame[0].fp[-24].id, otherwise (I) and (II) would be
237762306a36Sopenharmony_ci	 *                         ; incorrectly deemed equivalent.
237862306a36Sopenharmony_ci	 * if r9 == 0 goto <exit>
237962306a36Sopenharmony_ci	 */
238062306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_9, 0),
238162306a36Sopenharmony_ci	BPF_JMP_IMM(BPF_JEQ, BPF_REG_9, 0, 1),
238262306a36Sopenharmony_ci	/* r8 = *r8                ; read map value via r8, this is not safe
238362306a36Sopenharmony_ci	 * r0 = *r8                ; because r8 might be not equal to r9.
238462306a36Sopenharmony_ci	 */
238562306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_8, BPF_REG_8, 0),
238662306a36Sopenharmony_ci	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_8, 0),
238762306a36Sopenharmony_ci	/* exit 0 */
238862306a36Sopenharmony_ci	BPF_MOV64_IMM(BPF_REG_0, 0),
238962306a36Sopenharmony_ci	BPF_EXIT_INSN(),
239062306a36Sopenharmony_ci	},
239162306a36Sopenharmony_ci	.flags = BPF_F_TEST_STATE_FREQ,
239262306a36Sopenharmony_ci	.fixup_map_hash_8b = { 3, 9 },
239362306a36Sopenharmony_ci	.result = REJECT,
239462306a36Sopenharmony_ci	.errstr = "R8 invalid mem access 'map_value_or_null'",
239562306a36Sopenharmony_ci	.result_unpriv = REJECT,
239662306a36Sopenharmony_ci	.errstr_unpriv = "",
239762306a36Sopenharmony_ci	.prog_type = BPF_PROG_TYPE_CGROUP_SKB,
239862306a36Sopenharmony_ci},
2399