xref: /linux/tools/testing/selftests/bpf/verifier/dead_code.c (revision 48729226238d4d56bdb8de9d54b911f179dd54b7)
1*48729226SJakub Kicinski {
2*48729226SJakub Kicinski 	"dead code: start",
3*48729226SJakub Kicinski 	.insns = {
4*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
5*48729226SJakub Kicinski 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
6*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
7*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
8*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, -4),
9*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
10*48729226SJakub Kicinski 	},
11*48729226SJakub Kicinski 	.result = ACCEPT,
12*48729226SJakub Kicinski 	.retval = 7,
13*48729226SJakub Kicinski },
14*48729226SJakub Kicinski {
15*48729226SJakub Kicinski 	"dead code: mid 1",
16*48729226SJakub Kicinski 	.insns = {
17*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
18*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
19*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 0),
20*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
21*48729226SJakub Kicinski 	},
22*48729226SJakub Kicinski 	.result = ACCEPT,
23*48729226SJakub Kicinski 	.retval = 7,
24*48729226SJakub Kicinski },
25*48729226SJakub Kicinski {
26*48729226SJakub Kicinski 	"dead code: mid 2",
27*48729226SJakub Kicinski 	.insns = {
28*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
29*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 4),
30*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
31*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 2),
32*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
33*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
34*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
35*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
36*48729226SJakub Kicinski 	},
37*48729226SJakub Kicinski 	.result = ACCEPT,
38*48729226SJakub Kicinski 	.retval = 1,
39*48729226SJakub Kicinski },
40*48729226SJakub Kicinski {
41*48729226SJakub Kicinski 	"dead code: end 1",
42*48729226SJakub Kicinski 	.insns = {
43*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
44*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
45*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
46*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
47*48729226SJakub Kicinski 	},
48*48729226SJakub Kicinski 	.result = ACCEPT,
49*48729226SJakub Kicinski 	.retval = 7,
50*48729226SJakub Kicinski },
51*48729226SJakub Kicinski {
52*48729226SJakub Kicinski 	"dead code: end 2",
53*48729226SJakub Kicinski 	.insns = {
54*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
55*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
56*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
57*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
58*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
59*48729226SJakub Kicinski 	},
60*48729226SJakub Kicinski 	.result = ACCEPT,
61*48729226SJakub Kicinski 	.retval = 7,
62*48729226SJakub Kicinski },
63*48729226SJakub Kicinski {
64*48729226SJakub Kicinski 	"dead code: end 3",
65*48729226SJakub Kicinski 	.insns = {
66*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
67*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
68*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
69*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 10, 1),
70*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
71*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
72*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, -5),
73*48729226SJakub Kicinski 	},
74*48729226SJakub Kicinski 	.result = ACCEPT,
75*48729226SJakub Kicinski 	.retval = 7,
76*48729226SJakub Kicinski },
77*48729226SJakub Kicinski {
78*48729226SJakub Kicinski 	"dead code: tail of main + func",
79*48729226SJakub Kicinski 	.insns = {
80*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
81*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
82*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
83*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
84*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
85*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
86*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
87*48729226SJakub Kicinski 	},
88*48729226SJakub Kicinski 	.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
89*48729226SJakub Kicinski 	.result_unpriv = REJECT,
90*48729226SJakub Kicinski 	.result = ACCEPT,
91*48729226SJakub Kicinski 	.retval = 7,
92*48729226SJakub Kicinski },
93*48729226SJakub Kicinski {
94*48729226SJakub Kicinski 	"dead code: tail of main + two functions",
95*48729226SJakub Kicinski 	.insns = {
96*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
97*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 8, 1),
98*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
99*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
100*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
101*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
102*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
103*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
104*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
105*48729226SJakub Kicinski 	},
106*48729226SJakub Kicinski 	.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
107*48729226SJakub Kicinski 	.result_unpriv = REJECT,
108*48729226SJakub Kicinski 	.result = ACCEPT,
109*48729226SJakub Kicinski 	.retval = 7,
110*48729226SJakub Kicinski },
111*48729226SJakub Kicinski {
112*48729226SJakub Kicinski 	"dead code: function in the middle and mid of another func",
113*48729226SJakub Kicinski 	.insns = {
114*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 7),
115*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3),
116*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
117*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 12),
118*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
119*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 7),
120*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 7, 1),
121*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -5),
122*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
123*48729226SJakub Kicinski 	},
124*48729226SJakub Kicinski 	.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
125*48729226SJakub Kicinski 	.result_unpriv = REJECT,
126*48729226SJakub Kicinski 	.result = ACCEPT,
127*48729226SJakub Kicinski 	.retval = 7,
128*48729226SJakub Kicinski },
129*48729226SJakub Kicinski {
130*48729226SJakub Kicinski 	"dead code: middle of main before call",
131*48729226SJakub Kicinski 	.insns = {
132*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 2),
133*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 2, 1),
134*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 5),
135*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
136*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
137*48729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
138*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
139*48729226SJakub Kicinski 	},
140*48729226SJakub Kicinski 	.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
141*48729226SJakub Kicinski 	.result_unpriv = REJECT,
142*48729226SJakub Kicinski 	.result = ACCEPT,
143*48729226SJakub Kicinski 	.retval = 2,
144*48729226SJakub Kicinski },
145*48729226SJakub Kicinski {
146*48729226SJakub Kicinski 	"dead code: start of a function",
147*48729226SJakub Kicinski 	.insns = {
148*48729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 2),
149*48729226SJakub Kicinski 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1),
150*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
151*48729226SJakub Kicinski 	BPF_JMP_IMM(BPF_JA, 0, 0, 0),
152*48729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
153*48729226SJakub Kicinski 	BPF_EXIT_INSN(),
154*48729226SJakub Kicinski 	},
155*48729226SJakub Kicinski 	.errstr_unpriv = "function calls to other bpf functions are allowed for root only",
156*48729226SJakub Kicinski 	.result_unpriv = REJECT,
157*48729226SJakub Kicinski 	.result = ACCEPT,
158*48729226SJakub Kicinski 	.retval = 2,
159*48729226SJakub Kicinski },
160