Merge tag 'arc-5.2-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[linux-2.6-microblaze.git] / tools / testing / selftests / bpf / verifier / subreg.c
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 },