xref: /linux/tools/testing/selftests/bpf/verifier/dead_code.c (revision e6ac2450d6dee3121cd8bbf2907b78a68a8a353d)
148729226SJakub Kicinski {
248729226SJakub Kicinski 	"dead code: start",
348729226SJakub Kicinski 	.insns = {
448729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
548729226SJakub Kicinski 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
648729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
748729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
848729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, -4),
948729226SJakub Kicinski 	BPF_EXIT_INSN(),
1048729226SJakub Kicinski 	},
1148729226SJakub Kicinski 	.result = ACCEPT,
1248729226SJakub Kicinski 	.retval = 7,
1348729226SJakub Kicinski },
1448729226SJakub Kicinski {
1548729226SJakub Kicinski 	"dead code: mid 1",
1648729226SJakub Kicinski 	.insns = {
1748729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
1848729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
1948729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 0),
2048729226SJakub Kicinski 	BPF_EXIT_INSN(),
2148729226SJakub Kicinski 	},
2248729226SJakub Kicinski 	.result = ACCEPT,
2348729226SJakub Kicinski 	.retval = 7,
2448729226SJakub Kicinski },
2548729226SJakub Kicinski {
2648729226SJakub Kicinski 	"dead code: mid 2",
2748729226SJakub Kicinski 	.insns = {
2848729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
2948729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 4),
3048729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
3148729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
3248729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
3348729226SJakub Kicinski 	BPF_EXIT_INSN(),
3448729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
3548729226SJakub Kicinski 	BPF_EXIT_INSN(),
3648729226SJakub Kicinski 	},
3748729226SJakub Kicinski 	.result = ACCEPT,
3848729226SJakub Kicinski 	.retval = 1,
3948729226SJakub Kicinski },
4048729226SJakub Kicinski {
4148729226SJakub Kicinski 	"dead code: end 1",
4248729226SJakub Kicinski 	.insns = {
4348729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
4448729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
4548729226SJakub Kicinski 	BPF_EXIT_INSN(),
4648729226SJakub Kicinski 	BPF_EXIT_INSN(),
4748729226SJakub Kicinski 	},
4848729226SJakub Kicinski 	.result = ACCEPT,
4948729226SJakub Kicinski 	.retval = 7,
5048729226SJakub Kicinski },
5148729226SJakub Kicinski {
5248729226SJakub Kicinski 	"dead code: end 2",
5348729226SJakub Kicinski 	.insns = {
5448729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
5548729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
5648729226SJakub Kicinski 	BPF_EXIT_INSN(),
5748729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
5848729226SJakub Kicinski 	BPF_EXIT_INSN(),
5948729226SJakub Kicinski 	},
6048729226SJakub Kicinski 	.result = ACCEPT,
6148729226SJakub Kicinski 	.retval = 7,
6248729226SJakub Kicinski },
6348729226SJakub Kicinski {
6448729226SJakub Kicinski 	"dead code: end 3",
6548729226SJakub Kicinski 	.insns = {
6648729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
6748729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
6848729226SJakub Kicinski 	BPF_EXIT_INSN(),
6948729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
7048729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
7148729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
7248729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, -5),
7348729226SJakub Kicinski 	},
7448729226SJakub Kicinski 	.result = ACCEPT,
7548729226SJakub Kicinski 	.retval = 7,
7648729226SJakub Kicinski },
7748729226SJakub Kicinski {
7848729226SJakub Kicinski 	"dead code: tail of main + func",
7948729226SJakub Kicinski 	.insns = {
8048729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
8148729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
8248729226SJakub Kicinski 	BPF_EXIT_INSN(),
8348729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
8448729226SJakub Kicinski 	BPF_EXIT_INSN(),
8548729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
8648729226SJakub Kicinski 	BPF_EXIT_INSN(),
8748729226SJakub Kicinski 	},
88*e6ac2450SMartin KaFai Lau 	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
8948729226SJakub Kicinski 	.result_unpriv = REJECT,
9048729226SJakub Kicinski 	.result = ACCEPT,
9148729226SJakub Kicinski 	.retval = 7,
9248729226SJakub Kicinski },
9348729226SJakub Kicinski {
9448729226SJakub Kicinski 	"dead code: tail of main + two functions",
9548729226SJakub Kicinski 	.insns = {
9648729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
9748729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
9848729226SJakub Kicinski 	BPF_EXIT_INSN(),
9948729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10048729226SJakub Kicinski 	BPF_EXIT_INSN(),
10148729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
10248729226SJakub Kicinski 	BPF_EXIT_INSN(),
10348729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
10448729226SJakub Kicinski 	BPF_EXIT_INSN(),
10548729226SJakub Kicinski 	},
106*e6ac2450SMartin KaFai Lau 	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
10748729226SJakub Kicinski 	.result_unpriv = REJECT,
10848729226SJakub Kicinski 	.result = ACCEPT,
10948729226SJakub Kicinski 	.retval = 7,
11048729226SJakub Kicinski },
11148729226SJakub Kicinski {
11248729226SJakub Kicinski 	"dead code: function in the middle and mid of another func",
11348729226SJakub Kicinski 	.insns = {
11448729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 7),
11548729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
11648729226SJakub Kicinski 	BPF_EXIT_INSN(),
11748729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
11848729226SJakub Kicinski 	BPF_EXIT_INSN(),
11948729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
12048729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 7, 1),
12148729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -5),
12248729226SJakub Kicinski 	BPF_EXIT_INSN(),
12348729226SJakub Kicinski 	},
124*e6ac2450SMartin KaFai Lau 	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
12548729226SJakub Kicinski 	.result_unpriv = REJECT,
12648729226SJakub Kicinski 	.result = ACCEPT,
12748729226SJakub Kicinski 	.retval = 7,
12848729226SJakub Kicinski },
12948729226SJakub Kicinski {
13048729226SJakub Kicinski 	"dead code: middle of main before call",
13148729226SJakub Kicinski 	.insns = {
13248729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 2),
13348729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 2, 1),
13448729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 5),
13548729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
13648729226SJakub Kicinski 	BPF_EXIT_INSN(),
13748729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
13848729226SJakub Kicinski 	BPF_EXIT_INSN(),
13948729226SJakub Kicinski 	},
140*e6ac2450SMartin KaFai Lau 	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
14148729226SJakub Kicinski 	.result_unpriv = REJECT,
14248729226SJakub Kicinski 	.result = ACCEPT,
14348729226SJakub Kicinski 	.retval = 2,
14448729226SJakub Kicinski },
14548729226SJakub Kicinski {
14648729226SJakub Kicinski 	"dead code: start of a function",
14748729226SJakub Kicinski 	.insns = {
14848729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 2),
14948729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
15048729226SJakub Kicinski 	BPF_EXIT_INSN(),
15148729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 0),
15248729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
15348729226SJakub Kicinski 	BPF_EXIT_INSN(),
15448729226SJakub Kicinski 	},
155*e6ac2450SMartin KaFai Lau 	.errstr_unpriv = "loading/calling other bpf or kernel functions are allowed for",
15648729226SJakub Kicinski 	.result_unpriv = REJECT,
15748729226SJakub Kicinski 	.result = ACCEPT,
15848729226SJakub Kicinski 	.retval = 2,
15948729226SJakub Kicinski },
160