• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* This file contains sub-register zero extension checks for insns defining
2  * sub-registers, meaning:
3  *   - All insns under BPF_ALU class. Their BPF_ALU32 variants or narrow width
4  *     forms (BPF_END) could define sub-registers.
5  *   - Narrow direct loads, BPF_B/H/W | BPF_LDX.
6  *   - BPF_LD is not exposed to JIT back-ends, so no need for testing.
7  *
8  * "get_prandom_u32" is used to initialize low 32-bit of some registers to
9  * prevent potential optimizations done by verifier or JIT back-ends which could
10  * optimize register back into constant when range info shows one register is a
11  * constant.
12  */
13 {
14 	"add32 reg zero extend check",
15 	.insns = {
16 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
17 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
18 	BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
19 	BPF_ALU32_REG(BPF_ADD, BPF_REG_0, BPF_REG_1),
20 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
21 	BPF_EXIT_INSN(),
22 	},
23 	.result = ACCEPT,
24 	.retval = 0,
25 },
26 {
27 	"add32 imm zero extend check",
28 	.insns = {
29 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
30 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
31 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
32 	/* An insn could have no effect on the low 32-bit, for example:
33 	 *   a = a + 0
34 	 *   a = a | 0
35 	 *   a = a & -1
36 	 * But, they should still zero high 32-bit.
37 	 */
38 	BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, 0),
39 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
40 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
41 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
42 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
43 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
44 	BPF_ALU32_IMM(BPF_ADD, BPF_REG_0, -2),
45 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
46 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
47 	BPF_EXIT_INSN(),
48 	},
49 	.result = ACCEPT,
50 	.retval = 0,
51 },
52 {
53 	"sub32 reg zero extend check",
54 	.insns = {
55 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
56 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
57 	BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL),
58 	BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_1),
59 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
60 	BPF_EXIT_INSN(),
61 	},
62 	.result = ACCEPT,
63 	.retval = 0,
64 },
65 {
66 	"sub32 imm zero extend check",
67 	.insns = {
68 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
69 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
70 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
71 	BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 0),
72 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
73 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
74 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
75 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
76 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
77 	BPF_ALU32_IMM(BPF_SUB, BPF_REG_0, 1),
78 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
79 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
80 	BPF_EXIT_INSN(),
81 	},
82 	.result = ACCEPT,
83 	.retval = 0,
84 },
85 {
86 	"mul32 reg zero extend check",
87 	.insns = {
88 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
89 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
90 	BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL),
91 	BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
92 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
93 	BPF_EXIT_INSN(),
94 	},
95 	.result = ACCEPT,
96 	.retval = 0,
97 },
98 {
99 	"mul32 imm zero extend check",
100 	.insns = {
101 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
102 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
103 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
104 	BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 1),
105 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
106 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
107 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
108 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
109 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
110 	BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, -1),
111 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
112 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
113 	BPF_EXIT_INSN(),
114 	},
115 	.result = ACCEPT,
116 	.retval = 0,
117 },
118 {
119 	"div32 reg zero extend check",
120 	.insns = {
121 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
122 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
123 	BPF_MOV64_IMM(BPF_REG_0, -1),
124 	BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
125 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
126 	BPF_EXIT_INSN(),
127 	},
128 	.result = ACCEPT,
129 	.retval = 0,
130 },
131 {
132 	"div32 imm zero extend check",
133 	.insns = {
134 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
135 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
136 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
137 	BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 1),
138 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
139 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
140 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
141 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
142 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
143 	BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, 2),
144 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
145 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
146 	BPF_EXIT_INSN(),
147 	},
148 	.result = ACCEPT,
149 	.retval = 0,
150 },
151 {
152 	"or32 reg zero extend check",
153 	.insns = {
154 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
155 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
156 	BPF_LD_IMM64(BPF_REG_0, 0x100000001ULL),
157 	BPF_ALU32_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
158 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
159 	BPF_EXIT_INSN(),
160 	},
161 	.result = ACCEPT,
162 	.retval = 0,
163 },
164 {
165 	"or32 imm zero extend check",
166 	.insns = {
167 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
168 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
169 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
170 	BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 0),
171 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
172 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
173 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
174 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
175 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
176 	BPF_ALU32_IMM(BPF_OR, BPF_REG_0, 1),
177 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
178 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
179 	BPF_EXIT_INSN(),
180 	},
181 	.result = ACCEPT,
182 	.retval = 0,
183 },
184 {
185 	"and32 reg zero extend check",
186 	.insns = {
187 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
188 	BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
189 	BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0),
190 	BPF_LD_IMM64(BPF_REG_0, 0x1ffffffffULL),
191 	BPF_ALU32_REG(BPF_AND, BPF_REG_0, BPF_REG_1),
192 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
193 	BPF_EXIT_INSN(),
194 	},
195 	.result = ACCEPT,
196 	.retval = 0,
197 },
198 {
199 	"and32 imm zero extend check",
200 	.insns = {
201 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
202 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
203 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
204 	BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -1),
205 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
206 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
207 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
208 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
209 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
210 	BPF_ALU32_IMM(BPF_AND, BPF_REG_0, -2),
211 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
212 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
213 	BPF_EXIT_INSN(),
214 	},
215 	.result = ACCEPT,
216 	.retval = 0,
217 },
218 {
219 	"lsh32 reg zero extend check",
220 	.insns = {
221 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
222 	BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
223 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
224 	BPF_MOV64_IMM(BPF_REG_1, 1),
225 	BPF_ALU32_REG(BPF_LSH, BPF_REG_0, BPF_REG_1),
226 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
227 	BPF_EXIT_INSN(),
228 	},
229 	.result = ACCEPT,
230 	.retval = 0,
231 },
232 {
233 	"lsh32 imm zero extend check",
234 	.insns = {
235 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
236 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
237 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
238 	BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 0),
239 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
240 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
241 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
242 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
243 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
244 	BPF_ALU32_IMM(BPF_LSH, BPF_REG_0, 1),
245 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
246 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
247 	BPF_EXIT_INSN(),
248 	},
249 	.result = ACCEPT,
250 	.retval = 0,
251 },
252 {
253 	"rsh32 reg zero extend check",
254 	.insns = {
255 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
256 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
257 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
258 	BPF_MOV64_IMM(BPF_REG_1, 1),
259 	BPF_ALU32_REG(BPF_RSH, BPF_REG_0, BPF_REG_1),
260 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
261 	BPF_EXIT_INSN(),
262 	},
263 	.result = ACCEPT,
264 	.retval = 0,
265 },
266 {
267 	"rsh32 imm zero extend check",
268 	.insns = {
269 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
270 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
271 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
272 	BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 0),
273 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
274 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
275 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
276 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
277 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
278 	BPF_ALU32_IMM(BPF_RSH, BPF_REG_0, 1),
279 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
280 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
281 	BPF_EXIT_INSN(),
282 	},
283 	.result = ACCEPT,
284 	.retval = 0,
285 },
286 {
287 	"neg32 reg zero extend check",
288 	.insns = {
289 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
290 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
291 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
292 	BPF_ALU32_IMM(BPF_NEG, BPF_REG_0, 0),
293 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
294 	BPF_EXIT_INSN(),
295 	},
296 	.result = ACCEPT,
297 	.retval = 0,
298 },
299 {
300 	"mod32 reg zero extend check",
301 	.insns = {
302 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
303 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
304 	BPF_MOV64_IMM(BPF_REG_0, -1),
305 	BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
306 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
307 	BPF_EXIT_INSN(),
308 	},
309 	.result = ACCEPT,
310 	.retval = 0,
311 },
312 {
313 	"mod32 imm zero extend check",
314 	.insns = {
315 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
316 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
317 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
318 	BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 1),
319 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
320 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
321 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
322 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
323 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
324 	BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, 2),
325 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
326 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
327 	BPF_EXIT_INSN(),
328 	},
329 	.result = ACCEPT,
330 	.retval = 0,
331 },
332 {
333 	"xor32 reg zero extend check",
334 	.insns = {
335 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
336 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
337 	BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
338 	BPF_ALU32_REG(BPF_XOR, BPF_REG_0, BPF_REG_1),
339 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
340 	BPF_EXIT_INSN(),
341 	},
342 	.result = ACCEPT,
343 	.retval = 0,
344 },
345 {
346 	"xor32 imm zero extend check",
347 	.insns = {
348 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
349 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
350 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
351 	BPF_ALU32_IMM(BPF_XOR, BPF_REG_0, 1),
352 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
353 	BPF_EXIT_INSN(),
354 	},
355 	.result = ACCEPT,
356 	.retval = 0,
357 },
358 {
359 	"mov32 reg zero extend check",
360 	.insns = {
361 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
362 	BPF_LD_IMM64(BPF_REG_1, 0x100000000ULL),
363 	BPF_ALU64_REG(BPF_OR, BPF_REG_1, BPF_REG_0),
364 	BPF_LD_IMM64(BPF_REG_0, 0x100000000ULL),
365 	BPF_MOV32_REG(BPF_REG_0, BPF_REG_1),
366 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
367 	BPF_EXIT_INSN(),
368 	},
369 	.result = ACCEPT,
370 	.retval = 0,
371 },
372 {
373 	"mov32 imm zero extend check",
374 	.insns = {
375 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
376 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
377 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
378 	BPF_MOV32_IMM(BPF_REG_0, 0),
379 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
380 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
381 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
382 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
383 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
384 	BPF_MOV32_IMM(BPF_REG_0, 1),
385 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
386 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
387 	BPF_EXIT_INSN(),
388 	},
389 	.result = ACCEPT,
390 	.retval = 0,
391 },
392 {
393 	"arsh32 reg zero extend check",
394 	.insns = {
395 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
396 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
397 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
398 	BPF_MOV64_IMM(BPF_REG_1, 1),
399 	BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
400 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
401 	BPF_EXIT_INSN(),
402 	},
403 	.result = ACCEPT,
404 	.retval = 0,
405 },
406 {
407 	"arsh32 imm zero extend check",
408 	.insns = {
409 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
410 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
411 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
412 	BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 0),
413 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
414 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
415 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
416 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
417 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
418 	BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 1),
419 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
420 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
421 	BPF_EXIT_INSN(),
422 	},
423 	.result = ACCEPT,
424 	.retval = 0,
425 },
426 {
427 	"end16 (to_le) reg zero extend check",
428 	.insns = {
429 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
430 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
431 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
432 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
433 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
434 	BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 16),
435 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
436 	BPF_EXIT_INSN(),
437 	},
438 	.result = ACCEPT,
439 	.retval = 0,
440 },
441 {
442 	"end32 (to_le) reg zero extend check",
443 	.insns = {
444 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
445 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
446 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
447 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
448 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
449 	BPF_ENDIAN(BPF_TO_LE, BPF_REG_0, 32),
450 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
451 	BPF_EXIT_INSN(),
452 	},
453 	.result = ACCEPT,
454 	.retval = 0,
455 },
456 {
457 	"end16 (to_be) reg zero extend check",
458 	.insns = {
459 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
460 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
461 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
462 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
463 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
464 	BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 16),
465 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
466 	BPF_EXIT_INSN(),
467 	},
468 	.result = ACCEPT,
469 	.retval = 0,
470 },
471 {
472 	"end32 (to_be) reg zero extend check",
473 	.insns = {
474 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
475 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
476 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_6, 32),
477 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
478 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_6),
479 	BPF_ENDIAN(BPF_TO_BE, BPF_REG_0, 32),
480 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
481 	BPF_EXIT_INSN(),
482 	},
483 	.result = ACCEPT,
484 	.retval = 0,
485 },
486 {
487 	"ldx_b zero extend check",
488 	.insns = {
489 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
490 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
491 	BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
492 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
493 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
494 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
495 	BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0),
496 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
497 	BPF_EXIT_INSN(),
498 	},
499 	.result = ACCEPT,
500 	.retval = 0,
501 },
502 {
503 	"ldx_h zero extend check",
504 	.insns = {
505 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
506 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
507 	BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
508 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
509 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
510 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
511 	BPF_LDX_MEM(BPF_H, BPF_REG_0, BPF_REG_6, 0),
512 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
513 	BPF_EXIT_INSN(),
514 	},
515 	.result = ACCEPT,
516 	.retval = 0,
517 },
518 {
519 	"ldx_w zero extend check",
520 	.insns = {
521 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_10),
522 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, -4),
523 	BPF_ST_MEM(BPF_W, BPF_REG_6, 0, 0xfaceb00c),
524 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
525 	BPF_LD_IMM64(BPF_REG_1, 0x1000000000ULL),
526 	BPF_ALU64_REG(BPF_OR, BPF_REG_0, BPF_REG_1),
527 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 0),
528 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_0, 32),
529 	BPF_EXIT_INSN(),
530 	},
531 	.result = ACCEPT,
532 	.retval = 0,
533 },
534