xref: /linux/lib/test_bpf.c (revision 4949009eb8d40a441dcddcd96e101e77d31cf1b2)
1 /*
2  * Testsuite for BPF interpreter and BPF JIT compiler
3  *
4  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  */
15 
16 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 
18 #include <linux/init.h>
19 #include <linux/module.h>
20 #include <linux/filter.h>
21 #include <linux/skbuff.h>
22 #include <linux/netdevice.h>
23 #include <linux/if_vlan.h>
24 
25 /* General test specific settings */
26 #define MAX_SUBTESTS	3
27 #define MAX_TESTRUNS	10000
28 #define MAX_DATA	128
29 #define MAX_INSNS	512
30 #define MAX_K		0xffffFFFF
31 
32 /* Few constants used to init test 'skb' */
33 #define SKB_TYPE	3
34 #define SKB_MARK	0x1234aaaa
35 #define SKB_HASH	0x1234aaab
36 #define SKB_QUEUE_MAP	123
37 #define SKB_VLAN_TCI	0xffff
38 #define SKB_DEV_IFINDEX	577
39 #define SKB_DEV_TYPE	588
40 
41 /* Redefine REGs to make tests less verbose */
42 #define R0		BPF_REG_0
43 #define R1		BPF_REG_1
44 #define R2		BPF_REG_2
45 #define R3		BPF_REG_3
46 #define R4		BPF_REG_4
47 #define R5		BPF_REG_5
48 #define R6		BPF_REG_6
49 #define R7		BPF_REG_7
50 #define R8		BPF_REG_8
51 #define R9		BPF_REG_9
52 #define R10		BPF_REG_10
53 
54 /* Flags that can be passed to test cases */
55 #define FLAG_NO_DATA		BIT(0)
56 #define FLAG_EXPECTED_FAIL	BIT(1)
57 
58 enum {
59 	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
60 	INTERNAL = BIT(7),	/* Extended instruction set.  */
61 };
62 
63 #define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
64 
65 struct bpf_test {
66 	const char *descr;
67 	union {
68 		struct sock_filter insns[MAX_INSNS];
69 		struct bpf_insn insns_int[MAX_INSNS];
70 	} u;
71 	__u8 aux;
72 	__u8 data[MAX_DATA];
73 	struct {
74 		int data_size;
75 		__u32 result;
76 	} test[MAX_SUBTESTS];
77 };
78 
79 static struct bpf_test tests[] = {
80 	{
81 		"TAX",
82 		.u.insns = {
83 			BPF_STMT(BPF_LD | BPF_IMM, 1),
84 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
85 			BPF_STMT(BPF_LD | BPF_IMM, 2),
86 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
87 			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
88 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
89 			BPF_STMT(BPF_LD | BPF_LEN, 0),
90 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
91 			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
92 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
93 			BPF_STMT(BPF_RET | BPF_A, 0)
94 		},
95 		CLASSIC,
96 		{ 10, 20, 30, 40, 50 },
97 		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
98 	},
99 	{
100 		"TXA",
101 		.u.insns = {
102 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
103 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
104 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
105 			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
106 		},
107 		CLASSIC,
108 		{ 10, 20, 30, 40, 50 },
109 		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
110 	},
111 	{
112 		"ADD_SUB_MUL_K",
113 		.u.insns = {
114 			BPF_STMT(BPF_LD | BPF_IMM, 1),
115 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
116 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
117 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
118 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
119 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
120 			BPF_STMT(BPF_RET | BPF_A, 0)
121 		},
122 		CLASSIC | FLAG_NO_DATA,
123 		{ },
124 		{ { 0, 0xfffffffd } }
125 	},
126 	{
127 		"DIV_MOD_KX",
128 		.u.insns = {
129 			BPF_STMT(BPF_LD | BPF_IMM, 8),
130 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
131 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
132 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
133 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
134 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
135 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
136 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
137 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
138 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
139 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
140 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
141 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
142 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
143 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
144 			BPF_STMT(BPF_RET | BPF_A, 0)
145 		},
146 		CLASSIC | FLAG_NO_DATA,
147 		{ },
148 		{ { 0, 0x20000000 } }
149 	},
150 	{
151 		"AND_OR_LSH_K",
152 		.u.insns = {
153 			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
154 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
155 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
156 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
157 			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
158 			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
159 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
160 			BPF_STMT(BPF_RET | BPF_A, 0)
161 		},
162 		CLASSIC | FLAG_NO_DATA,
163 		{ },
164 		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
165 	},
166 	{
167 		"LD_IMM_0",
168 		.u.insns = {
169 			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
170 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
171 			BPF_STMT(BPF_RET | BPF_K, 0),
172 			BPF_STMT(BPF_RET | BPF_K, 1),
173 		},
174 		CLASSIC,
175 		{ },
176 		{ { 1, 1 } },
177 	},
178 	{
179 		"LD_IND",
180 		.u.insns = {
181 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
182 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
183 			BPF_STMT(BPF_RET | BPF_K, 1)
184 		},
185 		CLASSIC,
186 		{ },
187 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
188 	},
189 	{
190 		"LD_ABS",
191 		.u.insns = {
192 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
193 			BPF_STMT(BPF_RET | BPF_K, 1)
194 		},
195 		CLASSIC,
196 		{ },
197 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
198 	},
199 	{
200 		"LD_ABS_LL",
201 		.u.insns = {
202 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
203 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
204 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
205 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
206 			BPF_STMT(BPF_RET | BPF_A, 0)
207 		},
208 		CLASSIC,
209 		{ 1, 2, 3 },
210 		{ { 1, 0 }, { 2, 3 } },
211 	},
212 	{
213 		"LD_IND_LL",
214 		.u.insns = {
215 			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
216 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
217 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
218 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
219 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
220 			BPF_STMT(BPF_RET | BPF_A, 0)
221 		},
222 		CLASSIC,
223 		{ 1, 2, 3, 0xff },
224 		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
225 	},
226 	{
227 		"LD_ABS_NET",
228 		.u.insns = {
229 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
230 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
231 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
232 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
233 			BPF_STMT(BPF_RET | BPF_A, 0)
234 		},
235 		CLASSIC,
236 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
237 		{ { 15, 0 }, { 16, 3 } },
238 	},
239 	{
240 		"LD_IND_NET",
241 		.u.insns = {
242 			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
243 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
244 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
245 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
246 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
247 			BPF_STMT(BPF_RET | BPF_A, 0)
248 		},
249 		CLASSIC,
250 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
251 		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
252 	},
253 	{
254 		"LD_PKTTYPE",
255 		.u.insns = {
256 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
257 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
258 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
259 			BPF_STMT(BPF_RET | BPF_K, 1),
260 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
261 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
262 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
263 			BPF_STMT(BPF_RET | BPF_K, 1),
264 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
265 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
266 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
267 			BPF_STMT(BPF_RET | BPF_K, 1),
268 			BPF_STMT(BPF_RET | BPF_A, 0)
269 		},
270 		CLASSIC,
271 		{ },
272 		{ { 1, 3 }, { 10, 3 } },
273 	},
274 	{
275 		"LD_MARK",
276 		.u.insns = {
277 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
278 				 SKF_AD_OFF + SKF_AD_MARK),
279 			BPF_STMT(BPF_RET | BPF_A, 0)
280 		},
281 		CLASSIC,
282 		{ },
283 		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
284 	},
285 	{
286 		"LD_RXHASH",
287 		.u.insns = {
288 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
289 				 SKF_AD_OFF + SKF_AD_RXHASH),
290 			BPF_STMT(BPF_RET | BPF_A, 0)
291 		},
292 		CLASSIC,
293 		{ },
294 		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
295 	},
296 	{
297 		"LD_QUEUE",
298 		.u.insns = {
299 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
300 				 SKF_AD_OFF + SKF_AD_QUEUE),
301 			BPF_STMT(BPF_RET | BPF_A, 0)
302 		},
303 		CLASSIC,
304 		{ },
305 		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
306 	},
307 	{
308 		"LD_PROTOCOL",
309 		.u.insns = {
310 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
311 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
312 			BPF_STMT(BPF_RET | BPF_K, 0),
313 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
314 				 SKF_AD_OFF + SKF_AD_PROTOCOL),
315 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
316 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
317 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
318 			BPF_STMT(BPF_RET | BPF_K, 0),
319 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
320 			BPF_STMT(BPF_RET | BPF_A, 0)
321 		},
322 		CLASSIC,
323 		{ 10, 20, 30 },
324 		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
325 	},
326 	{
327 		"LD_VLAN_TAG",
328 		.u.insns = {
329 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
330 				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
331 			BPF_STMT(BPF_RET | BPF_A, 0)
332 		},
333 		CLASSIC,
334 		{ },
335 		{
336 			{ 1, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT },
337 			{ 10, SKB_VLAN_TCI & ~VLAN_TAG_PRESENT }
338 		},
339 	},
340 	{
341 		"LD_VLAN_TAG_PRESENT",
342 		.u.insns = {
343 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
344 				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
345 			BPF_STMT(BPF_RET | BPF_A, 0)
346 		},
347 		CLASSIC,
348 		{ },
349 		{
350 			{ 1, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) },
351 			{ 10, !!(SKB_VLAN_TCI & VLAN_TAG_PRESENT) }
352 		},
353 	},
354 	{
355 		"LD_IFINDEX",
356 		.u.insns = {
357 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
358 				 SKF_AD_OFF + SKF_AD_IFINDEX),
359 			BPF_STMT(BPF_RET | BPF_A, 0)
360 		},
361 		CLASSIC,
362 		{ },
363 		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
364 	},
365 	{
366 		"LD_HATYPE",
367 		.u.insns = {
368 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
369 				 SKF_AD_OFF + SKF_AD_HATYPE),
370 			BPF_STMT(BPF_RET | BPF_A, 0)
371 		},
372 		CLASSIC,
373 		{ },
374 		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
375 	},
376 	{
377 		"LD_CPU",
378 		.u.insns = {
379 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
380 				 SKF_AD_OFF + SKF_AD_CPU),
381 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
382 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
383 				 SKF_AD_OFF + SKF_AD_CPU),
384 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
385 			BPF_STMT(BPF_RET | BPF_A, 0)
386 		},
387 		CLASSIC,
388 		{ },
389 		{ { 1, 0 }, { 10, 0 } },
390 	},
391 	{
392 		"LD_NLATTR",
393 		.u.insns = {
394 			BPF_STMT(BPF_LDX | BPF_IMM, 2),
395 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
396 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
397 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
398 				 SKF_AD_OFF + SKF_AD_NLATTR),
399 			BPF_STMT(BPF_RET | BPF_A, 0)
400 		},
401 		CLASSIC,
402 #ifdef __BIG_ENDIAN
403 		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
404 #else
405 		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
406 #endif
407 		{ { 4, 0 }, { 20, 6 } },
408 	},
409 	{
410 		"LD_NLATTR_NEST",
411 		.u.insns = {
412 			BPF_STMT(BPF_LD | BPF_IMM, 2),
413 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
414 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
415 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
416 			BPF_STMT(BPF_LD | BPF_IMM, 2),
417 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
418 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
419 			BPF_STMT(BPF_LD | BPF_IMM, 2),
420 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
421 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
422 			BPF_STMT(BPF_LD | BPF_IMM, 2),
423 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
424 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
425 			BPF_STMT(BPF_LD | BPF_IMM, 2),
426 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
427 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
428 			BPF_STMT(BPF_LD | BPF_IMM, 2),
429 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
430 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
431 			BPF_STMT(BPF_LD | BPF_IMM, 2),
432 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
433 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
434 			BPF_STMT(BPF_LD | BPF_IMM, 2),
435 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
436 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
437 			BPF_STMT(BPF_RET | BPF_A, 0)
438 		},
439 		CLASSIC,
440 #ifdef __BIG_ENDIAN
441 		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
442 #else
443 		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
444 #endif
445 		{ { 4, 0 }, { 20, 10 } },
446 	},
447 	{
448 		"LD_PAYLOAD_OFF",
449 		.u.insns = {
450 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
451 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
452 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
453 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
454 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
455 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
456 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
457 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
458 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
459 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
460 			BPF_STMT(BPF_RET | BPF_A, 0)
461 		},
462 		CLASSIC,
463 		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
464 		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
465 		 * id 9737, seq 1, length 64
466 		 */
467 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 		  0x08, 0x00,
470 		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
471 		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
472 		{ { 30, 0 }, { 100, 42 } },
473 	},
474 	{
475 		"LD_ANC_XOR",
476 		.u.insns = {
477 			BPF_STMT(BPF_LD | BPF_IMM, 10),
478 			BPF_STMT(BPF_LDX | BPF_IMM, 300),
479 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
480 				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
481 			BPF_STMT(BPF_RET | BPF_A, 0)
482 		},
483 		CLASSIC,
484 		{ },
485 		{ { 4, 10 ^ 300 }, { 20, 10 ^ 300 } },
486 	},
487 	{
488 		"SPILL_FILL",
489 		.u.insns = {
490 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
491 			BPF_STMT(BPF_LD | BPF_IMM, 2),
492 			BPF_STMT(BPF_ALU | BPF_RSH, 1),
493 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
494 			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
495 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
496 			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
497 			BPF_STMT(BPF_STX, 15), /* M3 = len */
498 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
499 			BPF_STMT(BPF_LD | BPF_MEM, 2),
500 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
501 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
502 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
503 			BPF_STMT(BPF_RET | BPF_A, 0)
504 		},
505 		CLASSIC,
506 		{ },
507 		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
508 	},
509 	{
510 		"JEQ",
511 		.u.insns = {
512 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
513 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
514 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
515 			BPF_STMT(BPF_RET | BPF_K, 1),
516 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
517 		},
518 		CLASSIC,
519 		{ 3, 3, 3, 3, 3 },
520 		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
521 	},
522 	{
523 		"JGT",
524 		.u.insns = {
525 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
526 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
527 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
528 			BPF_STMT(BPF_RET | BPF_K, 1),
529 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
530 		},
531 		CLASSIC,
532 		{ 4, 4, 4, 3, 3 },
533 		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
534 	},
535 	{
536 		"JGE",
537 		.u.insns = {
538 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
539 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
540 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
541 			BPF_STMT(BPF_RET | BPF_K, 10),
542 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
543 			BPF_STMT(BPF_RET | BPF_K, 20),
544 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
545 			BPF_STMT(BPF_RET | BPF_K, 30),
546 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
547 			BPF_STMT(BPF_RET | BPF_K, 40),
548 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
549 		},
550 		CLASSIC,
551 		{ 1, 2, 3, 4, 5 },
552 		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
553 	},
554 	{
555 		"JSET",
556 		.u.insns = {
557 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
558 			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
559 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
560 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
561 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
562 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
563 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
564 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
565 			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
566 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
567 			BPF_STMT(BPF_RET | BPF_K, 10),
568 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
569 			BPF_STMT(BPF_RET | BPF_K, 20),
570 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
571 			BPF_STMT(BPF_RET | BPF_K, 30),
572 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
573 			BPF_STMT(BPF_RET | BPF_K, 30),
574 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
575 			BPF_STMT(BPF_RET | BPF_K, 30),
576 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
577 			BPF_STMT(BPF_RET | BPF_K, 30),
578 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
579 			BPF_STMT(BPF_RET | BPF_K, 30),
580 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
581 		},
582 		CLASSIC,
583 		{ 0, 0xAA, 0x55, 1 },
584 		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
585 	},
586 	{
587 		"tcpdump port 22",
588 		.u.insns = {
589 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
590 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
591 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
592 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
593 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
594 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
595 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
596 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
597 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
598 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
599 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
600 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
601 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
602 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
603 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
604 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
605 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
606 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
607 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
608 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
609 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
610 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
611 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
612 			BPF_STMT(BPF_RET | BPF_K, 0),
613 		},
614 		CLASSIC,
615 		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
616 		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
617 		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
618 		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
619 		 */
620 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
621 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
622 		  0x08, 0x00,
623 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
624 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
625 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
626 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
627 		  0xc2, 0x24,
628 		  0x00, 0x16 /* dst port */ },
629 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
630 	},
631 	{
632 		"tcpdump complex",
633 		.u.insns = {
634 			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
635 			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
636 			 * (len > 115 or len < 30000000000)' -d
637 			 */
638 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
639 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
640 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
641 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
642 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
643 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
644 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
645 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
646 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
647 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
648 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
649 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
650 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
651 			BPF_STMT(BPF_ST, 1),
652 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
653 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
654 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
655 			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
656 			BPF_STMT(BPF_LD | BPF_MEM, 1),
657 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
658 			BPF_STMT(BPF_ST, 5),
659 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
660 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
661 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
662 			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
663 			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
664 			BPF_STMT(BPF_LD | BPF_MEM, 5),
665 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
666 			BPF_STMT(BPF_LD | BPF_LEN, 0),
667 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
668 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
669 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
670 			BPF_STMT(BPF_RET | BPF_K, 0),
671 		},
672 		CLASSIC,
673 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
674 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
675 		  0x08, 0x00,
676 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
677 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
678 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
679 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
680 		  0xc2, 0x24,
681 		  0x00, 0x16 /* dst port */ },
682 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
683 	},
684 	{
685 		"RET_A",
686 		.u.insns = {
687 			/* check that unitialized X and A contain zeros */
688 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
689 			BPF_STMT(BPF_RET | BPF_A, 0)
690 		},
691 		CLASSIC,
692 		{ },
693 		{ {1, 0}, {2, 0} },
694 	},
695 	{
696 		"INT: ADD trivial",
697 		.u.insns_int = {
698 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
699 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
700 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
701 			BPF_ALU64_REG(BPF_SUB, R1, R2),
702 			BPF_ALU64_IMM(BPF_ADD, R1, -1),
703 			BPF_ALU64_IMM(BPF_MUL, R1, 3),
704 			BPF_ALU64_REG(BPF_MOV, R0, R1),
705 			BPF_EXIT_INSN(),
706 		},
707 		INTERNAL,
708 		{ },
709 		{ { 0, 0xfffffffd } }
710 	},
711 	{
712 		"INT: MUL_X",
713 		.u.insns_int = {
714 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
715 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
716 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
717 			BPF_ALU64_REG(BPF_MUL, R1, R2),
718 			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
719 			BPF_EXIT_INSN(),
720 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
721 			BPF_EXIT_INSN(),
722 		},
723 		INTERNAL,
724 		{ },
725 		{ { 0, 1 } }
726 	},
727 	{
728 		"INT: MUL_X2",
729 		.u.insns_int = {
730 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
731 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
732 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
733 			BPF_ALU64_REG(BPF_MUL, R1, R2),
734 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
735 			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
736 			BPF_EXIT_INSN(),
737 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
738 			BPF_EXIT_INSN(),
739 		},
740 		INTERNAL,
741 		{ },
742 		{ { 0, 1 } }
743 	},
744 	{
745 		"INT: MUL32_X",
746 		.u.insns_int = {
747 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
748 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
749 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
750 			BPF_ALU32_REG(BPF_MUL, R1, R2),
751 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
752 			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
753 			BPF_EXIT_INSN(),
754 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
755 			BPF_EXIT_INSN(),
756 		},
757 		INTERNAL,
758 		{ },
759 		{ { 0, 1 } }
760 	},
761 	{
762 		/* Have to test all register combinations, since
763 		 * JITing of different registers will produce
764 		 * different asm code.
765 		 */
766 		"INT: ADD 64-bit",
767 		.u.insns_int = {
768 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
769 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
770 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
771 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
772 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
773 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
774 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
775 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
776 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
777 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
778 			BPF_ALU64_IMM(BPF_ADD, R0, 20),
779 			BPF_ALU64_IMM(BPF_ADD, R1, 20),
780 			BPF_ALU64_IMM(BPF_ADD, R2, 20),
781 			BPF_ALU64_IMM(BPF_ADD, R3, 20),
782 			BPF_ALU64_IMM(BPF_ADD, R4, 20),
783 			BPF_ALU64_IMM(BPF_ADD, R5, 20),
784 			BPF_ALU64_IMM(BPF_ADD, R6, 20),
785 			BPF_ALU64_IMM(BPF_ADD, R7, 20),
786 			BPF_ALU64_IMM(BPF_ADD, R8, 20),
787 			BPF_ALU64_IMM(BPF_ADD, R9, 20),
788 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
789 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
790 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
791 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
792 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
793 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
794 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
795 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
796 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
797 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
798 			BPF_ALU64_REG(BPF_ADD, R0, R0),
799 			BPF_ALU64_REG(BPF_ADD, R0, R1),
800 			BPF_ALU64_REG(BPF_ADD, R0, R2),
801 			BPF_ALU64_REG(BPF_ADD, R0, R3),
802 			BPF_ALU64_REG(BPF_ADD, R0, R4),
803 			BPF_ALU64_REG(BPF_ADD, R0, R5),
804 			BPF_ALU64_REG(BPF_ADD, R0, R6),
805 			BPF_ALU64_REG(BPF_ADD, R0, R7),
806 			BPF_ALU64_REG(BPF_ADD, R0, R8),
807 			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
808 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
809 			BPF_EXIT_INSN(),
810 			BPF_ALU64_REG(BPF_ADD, R1, R0),
811 			BPF_ALU64_REG(BPF_ADD, R1, R1),
812 			BPF_ALU64_REG(BPF_ADD, R1, R2),
813 			BPF_ALU64_REG(BPF_ADD, R1, R3),
814 			BPF_ALU64_REG(BPF_ADD, R1, R4),
815 			BPF_ALU64_REG(BPF_ADD, R1, R5),
816 			BPF_ALU64_REG(BPF_ADD, R1, R6),
817 			BPF_ALU64_REG(BPF_ADD, R1, R7),
818 			BPF_ALU64_REG(BPF_ADD, R1, R8),
819 			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
820 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
821 			BPF_EXIT_INSN(),
822 			BPF_ALU64_REG(BPF_ADD, R2, R0),
823 			BPF_ALU64_REG(BPF_ADD, R2, R1),
824 			BPF_ALU64_REG(BPF_ADD, R2, R2),
825 			BPF_ALU64_REG(BPF_ADD, R2, R3),
826 			BPF_ALU64_REG(BPF_ADD, R2, R4),
827 			BPF_ALU64_REG(BPF_ADD, R2, R5),
828 			BPF_ALU64_REG(BPF_ADD, R2, R6),
829 			BPF_ALU64_REG(BPF_ADD, R2, R7),
830 			BPF_ALU64_REG(BPF_ADD, R2, R8),
831 			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
832 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
833 			BPF_EXIT_INSN(),
834 			BPF_ALU64_REG(BPF_ADD, R3, R0),
835 			BPF_ALU64_REG(BPF_ADD, R3, R1),
836 			BPF_ALU64_REG(BPF_ADD, R3, R2),
837 			BPF_ALU64_REG(BPF_ADD, R3, R3),
838 			BPF_ALU64_REG(BPF_ADD, R3, R4),
839 			BPF_ALU64_REG(BPF_ADD, R3, R5),
840 			BPF_ALU64_REG(BPF_ADD, R3, R6),
841 			BPF_ALU64_REG(BPF_ADD, R3, R7),
842 			BPF_ALU64_REG(BPF_ADD, R3, R8),
843 			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
844 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
845 			BPF_EXIT_INSN(),
846 			BPF_ALU64_REG(BPF_ADD, R4, R0),
847 			BPF_ALU64_REG(BPF_ADD, R4, R1),
848 			BPF_ALU64_REG(BPF_ADD, R4, R2),
849 			BPF_ALU64_REG(BPF_ADD, R4, R3),
850 			BPF_ALU64_REG(BPF_ADD, R4, R4),
851 			BPF_ALU64_REG(BPF_ADD, R4, R5),
852 			BPF_ALU64_REG(BPF_ADD, R4, R6),
853 			BPF_ALU64_REG(BPF_ADD, R4, R7),
854 			BPF_ALU64_REG(BPF_ADD, R4, R8),
855 			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
856 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
857 			BPF_EXIT_INSN(),
858 			BPF_ALU64_REG(BPF_ADD, R5, R0),
859 			BPF_ALU64_REG(BPF_ADD, R5, R1),
860 			BPF_ALU64_REG(BPF_ADD, R5, R2),
861 			BPF_ALU64_REG(BPF_ADD, R5, R3),
862 			BPF_ALU64_REG(BPF_ADD, R5, R4),
863 			BPF_ALU64_REG(BPF_ADD, R5, R5),
864 			BPF_ALU64_REG(BPF_ADD, R5, R6),
865 			BPF_ALU64_REG(BPF_ADD, R5, R7),
866 			BPF_ALU64_REG(BPF_ADD, R5, R8),
867 			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
868 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
869 			BPF_EXIT_INSN(),
870 			BPF_ALU64_REG(BPF_ADD, R6, R0),
871 			BPF_ALU64_REG(BPF_ADD, R6, R1),
872 			BPF_ALU64_REG(BPF_ADD, R6, R2),
873 			BPF_ALU64_REG(BPF_ADD, R6, R3),
874 			BPF_ALU64_REG(BPF_ADD, R6, R4),
875 			BPF_ALU64_REG(BPF_ADD, R6, R5),
876 			BPF_ALU64_REG(BPF_ADD, R6, R6),
877 			BPF_ALU64_REG(BPF_ADD, R6, R7),
878 			BPF_ALU64_REG(BPF_ADD, R6, R8),
879 			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
880 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
881 			BPF_EXIT_INSN(),
882 			BPF_ALU64_REG(BPF_ADD, R7, R0),
883 			BPF_ALU64_REG(BPF_ADD, R7, R1),
884 			BPF_ALU64_REG(BPF_ADD, R7, R2),
885 			BPF_ALU64_REG(BPF_ADD, R7, R3),
886 			BPF_ALU64_REG(BPF_ADD, R7, R4),
887 			BPF_ALU64_REG(BPF_ADD, R7, R5),
888 			BPF_ALU64_REG(BPF_ADD, R7, R6),
889 			BPF_ALU64_REG(BPF_ADD, R7, R7),
890 			BPF_ALU64_REG(BPF_ADD, R7, R8),
891 			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
892 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
893 			BPF_EXIT_INSN(),
894 			BPF_ALU64_REG(BPF_ADD, R8, R0),
895 			BPF_ALU64_REG(BPF_ADD, R8, R1),
896 			BPF_ALU64_REG(BPF_ADD, R8, R2),
897 			BPF_ALU64_REG(BPF_ADD, R8, R3),
898 			BPF_ALU64_REG(BPF_ADD, R8, R4),
899 			BPF_ALU64_REG(BPF_ADD, R8, R5),
900 			BPF_ALU64_REG(BPF_ADD, R8, R6),
901 			BPF_ALU64_REG(BPF_ADD, R8, R7),
902 			BPF_ALU64_REG(BPF_ADD, R8, R8),
903 			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
904 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
905 			BPF_EXIT_INSN(),
906 			BPF_ALU64_REG(BPF_ADD, R9, R0),
907 			BPF_ALU64_REG(BPF_ADD, R9, R1),
908 			BPF_ALU64_REG(BPF_ADD, R9, R2),
909 			BPF_ALU64_REG(BPF_ADD, R9, R3),
910 			BPF_ALU64_REG(BPF_ADD, R9, R4),
911 			BPF_ALU64_REG(BPF_ADD, R9, R5),
912 			BPF_ALU64_REG(BPF_ADD, R9, R6),
913 			BPF_ALU64_REG(BPF_ADD, R9, R7),
914 			BPF_ALU64_REG(BPF_ADD, R9, R8),
915 			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
916 			BPF_ALU64_REG(BPF_MOV, R0, R9),
917 			BPF_EXIT_INSN(),
918 		},
919 		INTERNAL,
920 		{ },
921 		{ { 0, 2957380 } }
922 	},
923 	{
924 		"INT: ADD 32-bit",
925 		.u.insns_int = {
926 			BPF_ALU32_IMM(BPF_MOV, R0, 20),
927 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
928 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
929 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
930 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
931 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
932 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
933 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
934 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
935 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
936 			BPF_ALU64_IMM(BPF_ADD, R1, 10),
937 			BPF_ALU64_IMM(BPF_ADD, R2, 10),
938 			BPF_ALU64_IMM(BPF_ADD, R3, 10),
939 			BPF_ALU64_IMM(BPF_ADD, R4, 10),
940 			BPF_ALU64_IMM(BPF_ADD, R5, 10),
941 			BPF_ALU64_IMM(BPF_ADD, R6, 10),
942 			BPF_ALU64_IMM(BPF_ADD, R7, 10),
943 			BPF_ALU64_IMM(BPF_ADD, R8, 10),
944 			BPF_ALU64_IMM(BPF_ADD, R9, 10),
945 			BPF_ALU32_REG(BPF_ADD, R0, R1),
946 			BPF_ALU32_REG(BPF_ADD, R0, R2),
947 			BPF_ALU32_REG(BPF_ADD, R0, R3),
948 			BPF_ALU32_REG(BPF_ADD, R0, R4),
949 			BPF_ALU32_REG(BPF_ADD, R0, R5),
950 			BPF_ALU32_REG(BPF_ADD, R0, R6),
951 			BPF_ALU32_REG(BPF_ADD, R0, R7),
952 			BPF_ALU32_REG(BPF_ADD, R0, R8),
953 			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
954 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
955 			BPF_EXIT_INSN(),
956 			BPF_ALU32_REG(BPF_ADD, R1, R0),
957 			BPF_ALU32_REG(BPF_ADD, R1, R1),
958 			BPF_ALU32_REG(BPF_ADD, R1, R2),
959 			BPF_ALU32_REG(BPF_ADD, R1, R3),
960 			BPF_ALU32_REG(BPF_ADD, R1, R4),
961 			BPF_ALU32_REG(BPF_ADD, R1, R5),
962 			BPF_ALU32_REG(BPF_ADD, R1, R6),
963 			BPF_ALU32_REG(BPF_ADD, R1, R7),
964 			BPF_ALU32_REG(BPF_ADD, R1, R8),
965 			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
966 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
967 			BPF_EXIT_INSN(),
968 			BPF_ALU32_REG(BPF_ADD, R2, R0),
969 			BPF_ALU32_REG(BPF_ADD, R2, R1),
970 			BPF_ALU32_REG(BPF_ADD, R2, R2),
971 			BPF_ALU32_REG(BPF_ADD, R2, R3),
972 			BPF_ALU32_REG(BPF_ADD, R2, R4),
973 			BPF_ALU32_REG(BPF_ADD, R2, R5),
974 			BPF_ALU32_REG(BPF_ADD, R2, R6),
975 			BPF_ALU32_REG(BPF_ADD, R2, R7),
976 			BPF_ALU32_REG(BPF_ADD, R2, R8),
977 			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
978 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
979 			BPF_EXIT_INSN(),
980 			BPF_ALU32_REG(BPF_ADD, R3, R0),
981 			BPF_ALU32_REG(BPF_ADD, R3, R1),
982 			BPF_ALU32_REG(BPF_ADD, R3, R2),
983 			BPF_ALU32_REG(BPF_ADD, R3, R3),
984 			BPF_ALU32_REG(BPF_ADD, R3, R4),
985 			BPF_ALU32_REG(BPF_ADD, R3, R5),
986 			BPF_ALU32_REG(BPF_ADD, R3, R6),
987 			BPF_ALU32_REG(BPF_ADD, R3, R7),
988 			BPF_ALU32_REG(BPF_ADD, R3, R8),
989 			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
990 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
991 			BPF_EXIT_INSN(),
992 			BPF_ALU32_REG(BPF_ADD, R4, R0),
993 			BPF_ALU32_REG(BPF_ADD, R4, R1),
994 			BPF_ALU32_REG(BPF_ADD, R4, R2),
995 			BPF_ALU32_REG(BPF_ADD, R4, R3),
996 			BPF_ALU32_REG(BPF_ADD, R4, R4),
997 			BPF_ALU32_REG(BPF_ADD, R4, R5),
998 			BPF_ALU32_REG(BPF_ADD, R4, R6),
999 			BPF_ALU32_REG(BPF_ADD, R4, R7),
1000 			BPF_ALU32_REG(BPF_ADD, R4, R8),
1001 			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1002 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1003 			BPF_EXIT_INSN(),
1004 			BPF_ALU32_REG(BPF_ADD, R5, R0),
1005 			BPF_ALU32_REG(BPF_ADD, R5, R1),
1006 			BPF_ALU32_REG(BPF_ADD, R5, R2),
1007 			BPF_ALU32_REG(BPF_ADD, R5, R3),
1008 			BPF_ALU32_REG(BPF_ADD, R5, R4),
1009 			BPF_ALU32_REG(BPF_ADD, R5, R5),
1010 			BPF_ALU32_REG(BPF_ADD, R5, R6),
1011 			BPF_ALU32_REG(BPF_ADD, R5, R7),
1012 			BPF_ALU32_REG(BPF_ADD, R5, R8),
1013 			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1014 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1015 			BPF_EXIT_INSN(),
1016 			BPF_ALU32_REG(BPF_ADD, R6, R0),
1017 			BPF_ALU32_REG(BPF_ADD, R6, R1),
1018 			BPF_ALU32_REG(BPF_ADD, R6, R2),
1019 			BPF_ALU32_REG(BPF_ADD, R6, R3),
1020 			BPF_ALU32_REG(BPF_ADD, R6, R4),
1021 			BPF_ALU32_REG(BPF_ADD, R6, R5),
1022 			BPF_ALU32_REG(BPF_ADD, R6, R6),
1023 			BPF_ALU32_REG(BPF_ADD, R6, R7),
1024 			BPF_ALU32_REG(BPF_ADD, R6, R8),
1025 			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1026 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1027 			BPF_EXIT_INSN(),
1028 			BPF_ALU32_REG(BPF_ADD, R7, R0),
1029 			BPF_ALU32_REG(BPF_ADD, R7, R1),
1030 			BPF_ALU32_REG(BPF_ADD, R7, R2),
1031 			BPF_ALU32_REG(BPF_ADD, R7, R3),
1032 			BPF_ALU32_REG(BPF_ADD, R7, R4),
1033 			BPF_ALU32_REG(BPF_ADD, R7, R5),
1034 			BPF_ALU32_REG(BPF_ADD, R7, R6),
1035 			BPF_ALU32_REG(BPF_ADD, R7, R7),
1036 			BPF_ALU32_REG(BPF_ADD, R7, R8),
1037 			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1038 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1039 			BPF_EXIT_INSN(),
1040 			BPF_ALU32_REG(BPF_ADD, R8, R0),
1041 			BPF_ALU32_REG(BPF_ADD, R8, R1),
1042 			BPF_ALU32_REG(BPF_ADD, R8, R2),
1043 			BPF_ALU32_REG(BPF_ADD, R8, R3),
1044 			BPF_ALU32_REG(BPF_ADD, R8, R4),
1045 			BPF_ALU32_REG(BPF_ADD, R8, R5),
1046 			BPF_ALU32_REG(BPF_ADD, R8, R6),
1047 			BPF_ALU32_REG(BPF_ADD, R8, R7),
1048 			BPF_ALU32_REG(BPF_ADD, R8, R8),
1049 			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1050 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1051 			BPF_EXIT_INSN(),
1052 			BPF_ALU32_REG(BPF_ADD, R9, R0),
1053 			BPF_ALU32_REG(BPF_ADD, R9, R1),
1054 			BPF_ALU32_REG(BPF_ADD, R9, R2),
1055 			BPF_ALU32_REG(BPF_ADD, R9, R3),
1056 			BPF_ALU32_REG(BPF_ADD, R9, R4),
1057 			BPF_ALU32_REG(BPF_ADD, R9, R5),
1058 			BPF_ALU32_REG(BPF_ADD, R9, R6),
1059 			BPF_ALU32_REG(BPF_ADD, R9, R7),
1060 			BPF_ALU32_REG(BPF_ADD, R9, R8),
1061 			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1062 			BPF_ALU32_REG(BPF_MOV, R0, R9),
1063 			BPF_EXIT_INSN(),
1064 		},
1065 		INTERNAL,
1066 		{ },
1067 		{ { 0, 2957380 } }
1068 	},
1069 	{	/* Mainly checking JIT here. */
1070 		"INT: SUB",
1071 		.u.insns_int = {
1072 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1073 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1074 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1075 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1076 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1077 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1078 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1079 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1080 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1081 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1082 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1083 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1084 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1085 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1086 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1087 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1088 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1089 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1090 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1091 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1092 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1093 			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1094 			BPF_EXIT_INSN(),
1095 			BPF_ALU64_REG(BPF_SUB, R1, R0),
1096 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1097 			BPF_ALU64_REG(BPF_SUB, R1, R3),
1098 			BPF_ALU64_REG(BPF_SUB, R1, R4),
1099 			BPF_ALU64_REG(BPF_SUB, R1, R5),
1100 			BPF_ALU64_REG(BPF_SUB, R1, R6),
1101 			BPF_ALU64_REG(BPF_SUB, R1, R7),
1102 			BPF_ALU64_REG(BPF_SUB, R1, R8),
1103 			BPF_ALU64_REG(BPF_SUB, R1, R9),
1104 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1105 			BPF_ALU64_REG(BPF_SUB, R2, R0),
1106 			BPF_ALU64_REG(BPF_SUB, R2, R1),
1107 			BPF_ALU64_REG(BPF_SUB, R2, R3),
1108 			BPF_ALU64_REG(BPF_SUB, R2, R4),
1109 			BPF_ALU64_REG(BPF_SUB, R2, R5),
1110 			BPF_ALU64_REG(BPF_SUB, R2, R6),
1111 			BPF_ALU64_REG(BPF_SUB, R2, R7),
1112 			BPF_ALU64_REG(BPF_SUB, R2, R8),
1113 			BPF_ALU64_REG(BPF_SUB, R2, R9),
1114 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1115 			BPF_ALU64_REG(BPF_SUB, R3, R0),
1116 			BPF_ALU64_REG(BPF_SUB, R3, R1),
1117 			BPF_ALU64_REG(BPF_SUB, R3, R2),
1118 			BPF_ALU64_REG(BPF_SUB, R3, R4),
1119 			BPF_ALU64_REG(BPF_SUB, R3, R5),
1120 			BPF_ALU64_REG(BPF_SUB, R3, R6),
1121 			BPF_ALU64_REG(BPF_SUB, R3, R7),
1122 			BPF_ALU64_REG(BPF_SUB, R3, R8),
1123 			BPF_ALU64_REG(BPF_SUB, R3, R9),
1124 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1125 			BPF_ALU64_REG(BPF_SUB, R4, R0),
1126 			BPF_ALU64_REG(BPF_SUB, R4, R1),
1127 			BPF_ALU64_REG(BPF_SUB, R4, R2),
1128 			BPF_ALU64_REG(BPF_SUB, R4, R3),
1129 			BPF_ALU64_REG(BPF_SUB, R4, R5),
1130 			BPF_ALU64_REG(BPF_SUB, R4, R6),
1131 			BPF_ALU64_REG(BPF_SUB, R4, R7),
1132 			BPF_ALU64_REG(BPF_SUB, R4, R8),
1133 			BPF_ALU64_REG(BPF_SUB, R4, R9),
1134 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1135 			BPF_ALU64_REG(BPF_SUB, R5, R0),
1136 			BPF_ALU64_REG(BPF_SUB, R5, R1),
1137 			BPF_ALU64_REG(BPF_SUB, R5, R2),
1138 			BPF_ALU64_REG(BPF_SUB, R5, R3),
1139 			BPF_ALU64_REG(BPF_SUB, R5, R4),
1140 			BPF_ALU64_REG(BPF_SUB, R5, R6),
1141 			BPF_ALU64_REG(BPF_SUB, R5, R7),
1142 			BPF_ALU64_REG(BPF_SUB, R5, R8),
1143 			BPF_ALU64_REG(BPF_SUB, R5, R9),
1144 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1145 			BPF_ALU64_REG(BPF_SUB, R6, R0),
1146 			BPF_ALU64_REG(BPF_SUB, R6, R1),
1147 			BPF_ALU64_REG(BPF_SUB, R6, R2),
1148 			BPF_ALU64_REG(BPF_SUB, R6, R3),
1149 			BPF_ALU64_REG(BPF_SUB, R6, R4),
1150 			BPF_ALU64_REG(BPF_SUB, R6, R5),
1151 			BPF_ALU64_REG(BPF_SUB, R6, R7),
1152 			BPF_ALU64_REG(BPF_SUB, R6, R8),
1153 			BPF_ALU64_REG(BPF_SUB, R6, R9),
1154 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1155 			BPF_ALU64_REG(BPF_SUB, R7, R0),
1156 			BPF_ALU64_REG(BPF_SUB, R7, R1),
1157 			BPF_ALU64_REG(BPF_SUB, R7, R2),
1158 			BPF_ALU64_REG(BPF_SUB, R7, R3),
1159 			BPF_ALU64_REG(BPF_SUB, R7, R4),
1160 			BPF_ALU64_REG(BPF_SUB, R7, R5),
1161 			BPF_ALU64_REG(BPF_SUB, R7, R6),
1162 			BPF_ALU64_REG(BPF_SUB, R7, R8),
1163 			BPF_ALU64_REG(BPF_SUB, R7, R9),
1164 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1165 			BPF_ALU64_REG(BPF_SUB, R8, R0),
1166 			BPF_ALU64_REG(BPF_SUB, R8, R1),
1167 			BPF_ALU64_REG(BPF_SUB, R8, R2),
1168 			BPF_ALU64_REG(BPF_SUB, R8, R3),
1169 			BPF_ALU64_REG(BPF_SUB, R8, R4),
1170 			BPF_ALU64_REG(BPF_SUB, R8, R5),
1171 			BPF_ALU64_REG(BPF_SUB, R8, R6),
1172 			BPF_ALU64_REG(BPF_SUB, R8, R7),
1173 			BPF_ALU64_REG(BPF_SUB, R8, R9),
1174 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1175 			BPF_ALU64_REG(BPF_SUB, R9, R0),
1176 			BPF_ALU64_REG(BPF_SUB, R9, R1),
1177 			BPF_ALU64_REG(BPF_SUB, R9, R2),
1178 			BPF_ALU64_REG(BPF_SUB, R9, R3),
1179 			BPF_ALU64_REG(BPF_SUB, R9, R4),
1180 			BPF_ALU64_REG(BPF_SUB, R9, R5),
1181 			BPF_ALU64_REG(BPF_SUB, R9, R6),
1182 			BPF_ALU64_REG(BPF_SUB, R9, R7),
1183 			BPF_ALU64_REG(BPF_SUB, R9, R8),
1184 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1185 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1186 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
1187 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1188 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1189 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1190 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1191 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1192 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1193 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1194 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1195 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1196 			BPF_EXIT_INSN(),
1197 		},
1198 		INTERNAL,
1199 		{ },
1200 		{ { 0, 11 } }
1201 	},
1202 	{	/* Mainly checking JIT here. */
1203 		"INT: XOR",
1204 		.u.insns_int = {
1205 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1206 			BPF_ALU64_REG(BPF_XOR, R1, R1),
1207 			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1208 			BPF_EXIT_INSN(),
1209 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1210 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1211 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1212 			BPF_ALU64_REG(BPF_XOR, R2, R2),
1213 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1214 			BPF_EXIT_INSN(),
1215 			BPF_ALU64_REG(BPF_SUB, R2, R2),
1216 			BPF_ALU64_REG(BPF_XOR, R3, R3),
1217 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1218 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1219 			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1220 			BPF_EXIT_INSN(),
1221 			BPF_ALU64_REG(BPF_SUB, R3, R3),
1222 			BPF_ALU64_REG(BPF_XOR, R4, R4),
1223 			BPF_ALU64_IMM(BPF_MOV, R2, 1),
1224 			BPF_ALU64_IMM(BPF_MOV, R5, -1),
1225 			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1226 			BPF_EXIT_INSN(),
1227 			BPF_ALU64_REG(BPF_SUB, R4, R4),
1228 			BPF_ALU64_REG(BPF_XOR, R5, R5),
1229 			BPF_ALU64_IMM(BPF_MOV, R3, 1),
1230 			BPF_ALU64_IMM(BPF_MOV, R7, -1),
1231 			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1232 			BPF_EXIT_INSN(),
1233 			BPF_ALU64_IMM(BPF_MOV, R5, 1),
1234 			BPF_ALU64_REG(BPF_SUB, R5, R5),
1235 			BPF_ALU64_REG(BPF_XOR, R6, R6),
1236 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1237 			BPF_ALU64_IMM(BPF_MOV, R8, -1),
1238 			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1239 			BPF_EXIT_INSN(),
1240 			BPF_ALU64_REG(BPF_SUB, R6, R6),
1241 			BPF_ALU64_REG(BPF_XOR, R7, R7),
1242 			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1243 			BPF_EXIT_INSN(),
1244 			BPF_ALU64_REG(BPF_SUB, R7, R7),
1245 			BPF_ALU64_REG(BPF_XOR, R8, R8),
1246 			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1247 			BPF_EXIT_INSN(),
1248 			BPF_ALU64_REG(BPF_SUB, R8, R8),
1249 			BPF_ALU64_REG(BPF_XOR, R9, R9),
1250 			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1251 			BPF_EXIT_INSN(),
1252 			BPF_ALU64_REG(BPF_SUB, R9, R9),
1253 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1254 			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1255 			BPF_EXIT_INSN(),
1256 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1257 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1258 			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1259 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1260 			BPF_EXIT_INSN(),
1261 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1262 			BPF_EXIT_INSN(),
1263 		},
1264 		INTERNAL,
1265 		{ },
1266 		{ { 0, 1 } }
1267 	},
1268 	{	/* Mainly checking JIT here. */
1269 		"INT: MUL",
1270 		.u.insns_int = {
1271 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1272 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1273 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1274 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1275 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1276 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1277 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1278 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1279 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1280 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1281 			BPF_ALU64_REG(BPF_MUL, R0, R0),
1282 			BPF_ALU64_REG(BPF_MUL, R0, R1),
1283 			BPF_ALU64_REG(BPF_MUL, R0, R2),
1284 			BPF_ALU64_REG(BPF_MUL, R0, R3),
1285 			BPF_ALU64_REG(BPF_MUL, R0, R4),
1286 			BPF_ALU64_REG(BPF_MUL, R0, R5),
1287 			BPF_ALU64_REG(BPF_MUL, R0, R6),
1288 			BPF_ALU64_REG(BPF_MUL, R0, R7),
1289 			BPF_ALU64_REG(BPF_MUL, R0, R8),
1290 			BPF_ALU64_REG(BPF_MUL, R0, R9),
1291 			BPF_ALU64_IMM(BPF_MUL, R0, 10),
1292 			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1293 			BPF_EXIT_INSN(),
1294 			BPF_ALU64_REG(BPF_MUL, R1, R0),
1295 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1296 			BPF_ALU64_REG(BPF_MUL, R1, R3),
1297 			BPF_ALU64_REG(BPF_MUL, R1, R4),
1298 			BPF_ALU64_REG(BPF_MUL, R1, R5),
1299 			BPF_ALU64_REG(BPF_MUL, R1, R6),
1300 			BPF_ALU64_REG(BPF_MUL, R1, R7),
1301 			BPF_ALU64_REG(BPF_MUL, R1, R8),
1302 			BPF_ALU64_REG(BPF_MUL, R1, R9),
1303 			BPF_ALU64_IMM(BPF_MUL, R1, 10),
1304 			BPF_ALU64_REG(BPF_MOV, R2, R1),
1305 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1306 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1307 			BPF_EXIT_INSN(),
1308 			BPF_ALU64_IMM(BPF_LSH, R1, 32),
1309 			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1310 			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1311 			BPF_EXIT_INSN(),
1312 			BPF_ALU64_REG(BPF_MUL, R2, R0),
1313 			BPF_ALU64_REG(BPF_MUL, R2, R1),
1314 			BPF_ALU64_REG(BPF_MUL, R2, R3),
1315 			BPF_ALU64_REG(BPF_MUL, R2, R4),
1316 			BPF_ALU64_REG(BPF_MUL, R2, R5),
1317 			BPF_ALU64_REG(BPF_MUL, R2, R6),
1318 			BPF_ALU64_REG(BPF_MUL, R2, R7),
1319 			BPF_ALU64_REG(BPF_MUL, R2, R8),
1320 			BPF_ALU64_REG(BPF_MUL, R2, R9),
1321 			BPF_ALU64_IMM(BPF_MUL, R2, 10),
1322 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1323 			BPF_ALU64_REG(BPF_MOV, R0, R2),
1324 			BPF_EXIT_INSN(),
1325 		},
1326 		INTERNAL,
1327 		{ },
1328 		{ { 0, 0x35d97ef2 } }
1329 	},
1330 	{
1331 		"INT: ALU MIX",
1332 		.u.insns_int = {
1333 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1334 			BPF_ALU64_IMM(BPF_ADD, R0, -1),
1335 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1336 			BPF_ALU64_IMM(BPF_XOR, R2, 3),
1337 			BPF_ALU64_REG(BPF_DIV, R0, R2),
1338 			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1339 			BPF_EXIT_INSN(),
1340 			BPF_ALU64_IMM(BPF_MOD, R0, 3),
1341 			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1342 			BPF_EXIT_INSN(),
1343 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1344 			BPF_EXIT_INSN(),
1345 		},
1346 		INTERNAL,
1347 		{ },
1348 		{ { 0, -1 } }
1349 	},
1350 	{
1351 		"INT: shifts by register",
1352 		.u.insns_int = {
1353 			BPF_MOV64_IMM(R0, -1234),
1354 			BPF_MOV64_IMM(R1, 1),
1355 			BPF_ALU32_REG(BPF_RSH, R0, R1),
1356 			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1357 			BPF_EXIT_INSN(),
1358 			BPF_MOV64_IMM(R2, 1),
1359 			BPF_ALU64_REG(BPF_LSH, R0, R2),
1360 			BPF_MOV32_IMM(R4, -1234),
1361 			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1362 			BPF_EXIT_INSN(),
1363 			BPF_ALU64_IMM(BPF_AND, R4, 63),
1364 			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1365 			BPF_MOV64_IMM(R3, 47),
1366 			BPF_ALU64_REG(BPF_ARSH, R0, R3),
1367 			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1368 			BPF_EXIT_INSN(),
1369 			BPF_MOV64_IMM(R2, 1),
1370 			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1371 			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1372 			BPF_EXIT_INSN(),
1373 			BPF_MOV64_IMM(R4, 4),
1374 			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1375 			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1376 			BPF_EXIT_INSN(),
1377 			BPF_MOV64_IMM(R4, 5),
1378 			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1379 			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1380 			BPF_EXIT_INSN(),
1381 			BPF_MOV64_IMM(R0, -1),
1382 			BPF_EXIT_INSN(),
1383 		},
1384 		INTERNAL,
1385 		{ },
1386 		{ { 0, -1 } }
1387 	},
1388 	{
1389 		"INT: DIV + ABS",
1390 		.u.insns_int = {
1391 			BPF_ALU64_REG(BPF_MOV, R6, R1),
1392 			BPF_LD_ABS(BPF_B, 3),
1393 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1394 			BPF_ALU32_REG(BPF_DIV, R0, R2),
1395 			BPF_ALU64_REG(BPF_MOV, R8, R0),
1396 			BPF_LD_ABS(BPF_B, 4),
1397 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1398 			BPF_LD_IND(BPF_B, R8, -70),
1399 			BPF_EXIT_INSN(),
1400 		},
1401 		INTERNAL,
1402 		{ 10, 20, 30, 40, 50 },
1403 		{ { 4, 0 }, { 5, 10 } }
1404 	},
1405 	{
1406 		"INT: DIV by zero",
1407 		.u.insns_int = {
1408 			BPF_ALU64_REG(BPF_MOV, R6, R1),
1409 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
1410 			BPF_LD_ABS(BPF_B, 3),
1411 			BPF_ALU32_REG(BPF_DIV, R0, R7),
1412 			BPF_EXIT_INSN(),
1413 		},
1414 		INTERNAL,
1415 		{ 10, 20, 30, 40, 50 },
1416 		{ { 3, 0 }, { 4, 0 } }
1417 	},
1418 	{
1419 		"check: missing ret",
1420 		.u.insns = {
1421 			BPF_STMT(BPF_LD | BPF_IMM, 1),
1422 		},
1423 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1424 		{ },
1425 		{ }
1426 	},
1427 	{
1428 		"check: div_k_0",
1429 		.u.insns = {
1430 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
1431 			BPF_STMT(BPF_RET | BPF_K, 0)
1432 		},
1433 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1434 		{ },
1435 		{ }
1436 	},
1437 	{
1438 		"check: unknown insn",
1439 		.u.insns = {
1440 			/* seccomp insn, rejected in socket filter */
1441 			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
1442 			BPF_STMT(BPF_RET | BPF_K, 0)
1443 		},
1444 		CLASSIC | FLAG_EXPECTED_FAIL,
1445 		{ },
1446 		{ }
1447 	},
1448 	{
1449 		"check: out of range spill/fill",
1450 		.u.insns = {
1451 			BPF_STMT(BPF_STX, 16),
1452 			BPF_STMT(BPF_RET | BPF_K, 0)
1453 		},
1454 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1455 		{ },
1456 		{ }
1457 	},
1458 	{
1459 		"JUMPS + HOLES",
1460 		.u.insns = {
1461 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1462 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
1463 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1464 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1465 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1466 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1467 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1468 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1469 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1470 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1471 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1472 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1473 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1474 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1475 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1476 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
1477 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1478 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
1479 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1480 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1481 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1482 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1483 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1484 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1485 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1486 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1487 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1488 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1489 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1490 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1491 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1492 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1493 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1494 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1495 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
1496 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
1497 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1498 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1499 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1500 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1501 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1502 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1503 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1504 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1505 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1506 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1507 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1508 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1509 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1510 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1511 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1512 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1513 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
1514 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
1515 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1516 			BPF_STMT(BPF_RET | BPF_A, 0),
1517 			BPF_STMT(BPF_RET | BPF_A, 0),
1518 		},
1519 		CLASSIC,
1520 		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
1521 		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
1522 		  0x08, 0x00,
1523 		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
1524 		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
1525 		  0xc0, 0xa8, 0x33, 0x01,
1526 		  0xc0, 0xa8, 0x33, 0x02,
1527 		  0xbb, 0xb6,
1528 		  0xa9, 0xfa,
1529 		  0x00, 0x14, 0x00, 0x00,
1530 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1531 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1532 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1533 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1534 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1535 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1536 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
1537 		  0xcc, 0xcc, 0xcc, 0xcc },
1538 		{ { 88, 0x001b } }
1539 	},
1540 	{
1541 		"check: RET X",
1542 		.u.insns = {
1543 			BPF_STMT(BPF_RET | BPF_X, 0),
1544 		},
1545 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1546 		{ },
1547 		{ },
1548 	},
1549 	{
1550 		"check: LDX + RET X",
1551 		.u.insns = {
1552 			BPF_STMT(BPF_LDX | BPF_IMM, 42),
1553 			BPF_STMT(BPF_RET | BPF_X, 0),
1554 		},
1555 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1556 		{ },
1557 		{ },
1558 	},
1559 	{	/* Mainly checking JIT here. */
1560 		"M[]: alt STX + LDX",
1561 		.u.insns = {
1562 			BPF_STMT(BPF_LDX | BPF_IMM, 100),
1563 			BPF_STMT(BPF_STX, 0),
1564 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
1565 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1566 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1567 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1568 			BPF_STMT(BPF_STX, 1),
1569 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
1570 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1571 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1572 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1573 			BPF_STMT(BPF_STX, 2),
1574 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
1575 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1576 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1577 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1578 			BPF_STMT(BPF_STX, 3),
1579 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
1580 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1581 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1582 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1583 			BPF_STMT(BPF_STX, 4),
1584 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
1585 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1586 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1587 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1588 			BPF_STMT(BPF_STX, 5),
1589 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
1590 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1591 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1592 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1593 			BPF_STMT(BPF_STX, 6),
1594 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
1595 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1596 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1597 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1598 			BPF_STMT(BPF_STX, 7),
1599 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
1600 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1601 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1602 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1603 			BPF_STMT(BPF_STX, 8),
1604 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
1605 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1606 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1607 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1608 			BPF_STMT(BPF_STX, 9),
1609 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
1610 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1611 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1612 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1613 			BPF_STMT(BPF_STX, 10),
1614 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
1615 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1616 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1617 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1618 			BPF_STMT(BPF_STX, 11),
1619 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
1620 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1621 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1622 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1623 			BPF_STMT(BPF_STX, 12),
1624 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
1625 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1626 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1627 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1628 			BPF_STMT(BPF_STX, 13),
1629 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
1630 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1631 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1632 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1633 			BPF_STMT(BPF_STX, 14),
1634 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
1635 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1636 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1637 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1638 			BPF_STMT(BPF_STX, 15),
1639 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
1640 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1641 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
1642 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
1643 			BPF_STMT(BPF_RET | BPF_A, 0),
1644 		},
1645 		CLASSIC | FLAG_NO_DATA,
1646 		{ },
1647 		{ { 0, 116 } },
1648 	},
1649 	{	/* Mainly checking JIT here. */
1650 		"M[]: full STX + full LDX",
1651 		.u.insns = {
1652 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
1653 			BPF_STMT(BPF_STX, 0),
1654 			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
1655 			BPF_STMT(BPF_STX, 1),
1656 			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
1657 			BPF_STMT(BPF_STX, 2),
1658 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
1659 			BPF_STMT(BPF_STX, 3),
1660 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
1661 			BPF_STMT(BPF_STX, 4),
1662 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
1663 			BPF_STMT(BPF_STX, 5),
1664 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
1665 			BPF_STMT(BPF_STX, 6),
1666 			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
1667 			BPF_STMT(BPF_STX, 7),
1668 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
1669 			BPF_STMT(BPF_STX, 8),
1670 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
1671 			BPF_STMT(BPF_STX, 9),
1672 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
1673 			BPF_STMT(BPF_STX, 10),
1674 			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
1675 			BPF_STMT(BPF_STX, 11),
1676 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
1677 			BPF_STMT(BPF_STX, 12),
1678 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
1679 			BPF_STMT(BPF_STX, 13),
1680 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
1681 			BPF_STMT(BPF_STX, 14),
1682 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
1683 			BPF_STMT(BPF_STX, 15),
1684 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
1685 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1686 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
1687 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1688 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
1689 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1690 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
1691 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1692 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
1693 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1694 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
1695 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1696 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
1697 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1698 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
1699 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1700 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
1701 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1702 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
1703 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1704 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
1705 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1706 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
1707 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1708 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
1709 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1710 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
1711 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1712 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
1713 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1714 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
1715 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
1716 			BPF_STMT(BPF_RET | BPF_A, 0),
1717 		},
1718 		CLASSIC | FLAG_NO_DATA,
1719 		{ },
1720 		{ { 0, 0x2a5a5e5 } },
1721 	},
1722 	{
1723 		"check: SKF_AD_MAX",
1724 		.u.insns = {
1725 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
1726 				 SKF_AD_OFF + SKF_AD_MAX),
1727 			BPF_STMT(BPF_RET | BPF_A, 0),
1728 		},
1729 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1730 		{ },
1731 		{ },
1732 	},
1733 	{	/* Passes checker but fails during runtime. */
1734 		"LD [SKF_AD_OFF-1]",
1735 		.u.insns = {
1736 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
1737 				 SKF_AD_OFF - 1),
1738 			BPF_STMT(BPF_RET | BPF_K, 1),
1739 		},
1740 		CLASSIC,
1741 		{ },
1742 		{ { 1, 0 } },
1743 	},
1744 	{
1745 		"load 64-bit immediate",
1746 		.u.insns_int = {
1747 			BPF_LD_IMM64(R1, 0x567800001234LL),
1748 			BPF_MOV64_REG(R2, R1),
1749 			BPF_MOV64_REG(R3, R2),
1750 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1751 			BPF_ALU64_IMM(BPF_LSH, R3, 32),
1752 			BPF_ALU64_IMM(BPF_RSH, R3, 32),
1753 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1754 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
1755 			BPF_EXIT_INSN(),
1756 			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
1757 			BPF_EXIT_INSN(),
1758 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1759 			BPF_EXIT_INSN(),
1760 		},
1761 		INTERNAL,
1762 		{ },
1763 		{ { 0, 1 } }
1764 	},
1765 	{
1766 		"nmap reduced",
1767 		.u.insns_int = {
1768 			BPF_MOV64_REG(R6, R1),
1769 			BPF_LD_ABS(BPF_H, 12),
1770 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 28),
1771 			BPF_LD_ABS(BPF_H, 12),
1772 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 26),
1773 			BPF_MOV32_IMM(R0, 18),
1774 			BPF_STX_MEM(BPF_W, R10, R0, -64),
1775 			BPF_LDX_MEM(BPF_W, R7, R10, -64),
1776 			BPF_LD_IND(BPF_W, R7, 14),
1777 			BPF_STX_MEM(BPF_W, R10, R0, -60),
1778 			BPF_MOV32_IMM(R0, 280971478),
1779 			BPF_STX_MEM(BPF_W, R10, R0, -56),
1780 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
1781 			BPF_LDX_MEM(BPF_W, R0, R10, -60),
1782 			BPF_ALU32_REG(BPF_SUB, R0, R7),
1783 			BPF_JMP_IMM(BPF_JNE, R0, 0, 15),
1784 			BPF_LD_ABS(BPF_H, 12),
1785 			BPF_JMP_IMM(BPF_JNE, R0, 0x806, 13),
1786 			BPF_MOV32_IMM(R0, 22),
1787 			BPF_STX_MEM(BPF_W, R10, R0, -56),
1788 			BPF_LDX_MEM(BPF_W, R7, R10, -56),
1789 			BPF_LD_IND(BPF_H, R7, 14),
1790 			BPF_STX_MEM(BPF_W, R10, R0, -52),
1791 			BPF_MOV32_IMM(R0, 17366),
1792 			BPF_STX_MEM(BPF_W, R10, R0, -48),
1793 			BPF_LDX_MEM(BPF_W, R7, R10, -48),
1794 			BPF_LDX_MEM(BPF_W, R0, R10, -52),
1795 			BPF_ALU32_REG(BPF_SUB, R0, R7),
1796 			BPF_JMP_IMM(BPF_JNE, R0, 0, 2),
1797 			BPF_MOV32_IMM(R0, 256),
1798 			BPF_EXIT_INSN(),
1799 			BPF_MOV32_IMM(R0, 0),
1800 			BPF_EXIT_INSN(),
1801 		},
1802 		INTERNAL,
1803 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0, 0,
1804 		  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1805 		  0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6},
1806 		{ { 38, 256 } }
1807 	},
1808 };
1809 
1810 static struct net_device dev;
1811 
1812 static struct sk_buff *populate_skb(char *buf, int size)
1813 {
1814 	struct sk_buff *skb;
1815 
1816 	if (size >= MAX_DATA)
1817 		return NULL;
1818 
1819 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
1820 	if (!skb)
1821 		return NULL;
1822 
1823 	memcpy(__skb_put(skb, size), buf, size);
1824 
1825 	/* Initialize a fake skb with test pattern. */
1826 	skb_reset_mac_header(skb);
1827 	skb->protocol = htons(ETH_P_IP);
1828 	skb->pkt_type = SKB_TYPE;
1829 	skb->mark = SKB_MARK;
1830 	skb->hash = SKB_HASH;
1831 	skb->queue_mapping = SKB_QUEUE_MAP;
1832 	skb->vlan_tci = SKB_VLAN_TCI;
1833 	skb->dev = &dev;
1834 	skb->dev->ifindex = SKB_DEV_IFINDEX;
1835 	skb->dev->type = SKB_DEV_TYPE;
1836 	skb_set_network_header(skb, min(size, ETH_HLEN));
1837 
1838 	return skb;
1839 }
1840 
1841 static void *generate_test_data(struct bpf_test *test, int sub)
1842 {
1843 	if (test->aux & FLAG_NO_DATA)
1844 		return NULL;
1845 
1846 	/* Test case expects an skb, so populate one. Various
1847 	 * subtests generate skbs of different sizes based on
1848 	 * the same data.
1849 	 */
1850 	return populate_skb(test->data, test->test[sub].data_size);
1851 }
1852 
1853 static void release_test_data(const struct bpf_test *test, void *data)
1854 {
1855 	if (test->aux & FLAG_NO_DATA)
1856 		return;
1857 
1858 	kfree_skb(data);
1859 }
1860 
1861 static int probe_filter_length(struct sock_filter *fp)
1862 {
1863 	int len = 0;
1864 
1865 	for (len = MAX_INSNS - 1; len > 0; --len)
1866 		if (fp[len].code != 0 || fp[len].k != 0)
1867 			break;
1868 
1869 	return len + 1;
1870 }
1871 
1872 static struct bpf_prog *generate_filter(int which, int *err)
1873 {
1874 	struct bpf_prog *fp;
1875 	struct sock_fprog_kern fprog;
1876 	unsigned int flen = probe_filter_length(tests[which].u.insns);
1877 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
1878 
1879 	switch (test_type) {
1880 	case CLASSIC:
1881 		fprog.filter = tests[which].u.insns;
1882 		fprog.len = flen;
1883 
1884 		*err = bpf_prog_create(&fp, &fprog);
1885 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
1886 			if (*err == -EINVAL) {
1887 				pr_cont("PASS\n");
1888 				/* Verifier rejected filter as expected. */
1889 				*err = 0;
1890 				return NULL;
1891 			} else {
1892 				pr_cont("UNEXPECTED_PASS\n");
1893 				/* Verifier didn't reject the test that's
1894 				 * bad enough, just return!
1895 				 */
1896 				*err = -EINVAL;
1897 				return NULL;
1898 			}
1899 		}
1900 		/* We don't expect to fail. */
1901 		if (*err) {
1902 			pr_cont("FAIL to attach err=%d len=%d\n",
1903 				*err, fprog.len);
1904 			return NULL;
1905 		}
1906 		break;
1907 
1908 	case INTERNAL:
1909 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
1910 		if (fp == NULL) {
1911 			pr_cont("UNEXPECTED_FAIL no memory left\n");
1912 			*err = -ENOMEM;
1913 			return NULL;
1914 		}
1915 
1916 		fp->len = flen;
1917 		memcpy(fp->insnsi, tests[which].u.insns_int,
1918 		       fp->len * sizeof(struct bpf_insn));
1919 
1920 		bpf_prog_select_runtime(fp);
1921 		break;
1922 	}
1923 
1924 	*err = 0;
1925 	return fp;
1926 }
1927 
1928 static void release_filter(struct bpf_prog *fp, int which)
1929 {
1930 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
1931 
1932 	switch (test_type) {
1933 	case CLASSIC:
1934 		bpf_prog_destroy(fp);
1935 		break;
1936 	case INTERNAL:
1937 		bpf_prog_free(fp);
1938 		break;
1939 	}
1940 }
1941 
1942 static int __run_one(const struct bpf_prog *fp, const void *data,
1943 		     int runs, u64 *duration)
1944 {
1945 	u64 start, finish;
1946 	int ret = 0, i;
1947 
1948 	start = ktime_to_us(ktime_get());
1949 
1950 	for (i = 0; i < runs; i++)
1951 		ret = BPF_PROG_RUN(fp, data);
1952 
1953 	finish = ktime_to_us(ktime_get());
1954 
1955 	*duration = (finish - start) * 1000ULL;
1956 	do_div(*duration, runs);
1957 
1958 	return ret;
1959 }
1960 
1961 static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
1962 {
1963 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
1964 
1965 	for (i = 0; i < MAX_SUBTESTS; i++) {
1966 		void *data;
1967 		u64 duration;
1968 		u32 ret;
1969 
1970 		if (test->test[i].data_size == 0 &&
1971 		    test->test[i].result == 0)
1972 			break;
1973 
1974 		data = generate_test_data(test, i);
1975 		ret = __run_one(fp, data, runs, &duration);
1976 		release_test_data(test, data);
1977 
1978 		if (ret == test->test[i].result) {
1979 			pr_cont("%lld ", duration);
1980 		} else {
1981 			pr_cont("ret %d != %d ", ret,
1982 				test->test[i].result);
1983 			err_cnt++;
1984 		}
1985 	}
1986 
1987 	return err_cnt;
1988 }
1989 
1990 static __init int test_bpf(void)
1991 {
1992 	int i, err_cnt = 0, pass_cnt = 0;
1993 
1994 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
1995 		struct bpf_prog *fp;
1996 		int err;
1997 
1998 		pr_info("#%d %s ", i, tests[i].descr);
1999 
2000 		fp = generate_filter(i, &err);
2001 		if (fp == NULL) {
2002 			if (err == 0) {
2003 				pass_cnt++;
2004 				continue;
2005 			}
2006 
2007 			return err;
2008 		}
2009 		err = run_one(fp, &tests[i]);
2010 		release_filter(fp, i);
2011 
2012 		if (err) {
2013 			pr_cont("FAIL (%d times)\n", err);
2014 			err_cnt++;
2015 		} else {
2016 			pr_cont("PASS\n");
2017 			pass_cnt++;
2018 		}
2019 	}
2020 
2021 	pr_info("Summary: %d PASSED, %d FAILED\n", pass_cnt, err_cnt);
2022 	return err_cnt ? -EINVAL : 0;
2023 }
2024 
2025 static int __init test_bpf_init(void)
2026 {
2027 	return test_bpf();
2028 }
2029 
2030 static void __exit test_bpf_exit(void)
2031 {
2032 }
2033 
2034 module_init(test_bpf_init);
2035 module_exit(test_bpf_exit);
2036 
2037 MODULE_LICENSE("GPL");
2038