xref: /OK3568_Linux_fs/kernel/lib/test_bpf.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Testsuite for BPF interpreter and BPF JIT compiler
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/init.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/filter.h>
13*4882a593Smuzhiyun #include <linux/bpf.h>
14*4882a593Smuzhiyun #include <linux/skbuff.h>
15*4882a593Smuzhiyun #include <linux/netdevice.h>
16*4882a593Smuzhiyun #include <linux/if_vlan.h>
17*4882a593Smuzhiyun #include <linux/random.h>
18*4882a593Smuzhiyun #include <linux/highmem.h>
19*4882a593Smuzhiyun #include <linux/sched.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* General test specific settings */
22*4882a593Smuzhiyun #define MAX_SUBTESTS	3
23*4882a593Smuzhiyun #define MAX_TESTRUNS	1000
24*4882a593Smuzhiyun #define MAX_DATA	128
25*4882a593Smuzhiyun #define MAX_INSNS	512
26*4882a593Smuzhiyun #define MAX_K		0xffffFFFF
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun /* Few constants used to init test 'skb' */
29*4882a593Smuzhiyun #define SKB_TYPE	3
30*4882a593Smuzhiyun #define SKB_MARK	0x1234aaaa
31*4882a593Smuzhiyun #define SKB_HASH	0x1234aaab
32*4882a593Smuzhiyun #define SKB_QUEUE_MAP	123
33*4882a593Smuzhiyun #define SKB_VLAN_TCI	0xffff
34*4882a593Smuzhiyun #define SKB_VLAN_PRESENT	1
35*4882a593Smuzhiyun #define SKB_DEV_IFINDEX	577
36*4882a593Smuzhiyun #define SKB_DEV_TYPE	588
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun /* Redefine REGs to make tests less verbose */
39*4882a593Smuzhiyun #define R0		BPF_REG_0
40*4882a593Smuzhiyun #define R1		BPF_REG_1
41*4882a593Smuzhiyun #define R2		BPF_REG_2
42*4882a593Smuzhiyun #define R3		BPF_REG_3
43*4882a593Smuzhiyun #define R4		BPF_REG_4
44*4882a593Smuzhiyun #define R5		BPF_REG_5
45*4882a593Smuzhiyun #define R6		BPF_REG_6
46*4882a593Smuzhiyun #define R7		BPF_REG_7
47*4882a593Smuzhiyun #define R8		BPF_REG_8
48*4882a593Smuzhiyun #define R9		BPF_REG_9
49*4882a593Smuzhiyun #define R10		BPF_REG_10
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* Flags that can be passed to test cases */
52*4882a593Smuzhiyun #define FLAG_NO_DATA		BIT(0)
53*4882a593Smuzhiyun #define FLAG_EXPECTED_FAIL	BIT(1)
54*4882a593Smuzhiyun #define FLAG_SKB_FRAG		BIT(2)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun enum {
57*4882a593Smuzhiyun 	CLASSIC  = BIT(6),	/* Old BPF instructions only. */
58*4882a593Smuzhiyun 	INTERNAL = BIT(7),	/* Extended instruction set.  */
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define TEST_TYPE_MASK		(CLASSIC | INTERNAL)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun struct bpf_test {
64*4882a593Smuzhiyun 	const char *descr;
65*4882a593Smuzhiyun 	union {
66*4882a593Smuzhiyun 		struct sock_filter insns[MAX_INSNS];
67*4882a593Smuzhiyun 		struct bpf_insn insns_int[MAX_INSNS];
68*4882a593Smuzhiyun 		struct {
69*4882a593Smuzhiyun 			void *insns;
70*4882a593Smuzhiyun 			unsigned int len;
71*4882a593Smuzhiyun 		} ptr;
72*4882a593Smuzhiyun 	} u;
73*4882a593Smuzhiyun 	__u8 aux;
74*4882a593Smuzhiyun 	__u8 data[MAX_DATA];
75*4882a593Smuzhiyun 	struct {
76*4882a593Smuzhiyun 		int data_size;
77*4882a593Smuzhiyun 		__u32 result;
78*4882a593Smuzhiyun 	} test[MAX_SUBTESTS];
79*4882a593Smuzhiyun 	int (*fill_helper)(struct bpf_test *self);
80*4882a593Smuzhiyun 	int expected_errcode; /* used when FLAG_EXPECTED_FAIL is set in the aux */
81*4882a593Smuzhiyun 	__u8 frag_data[MAX_DATA];
82*4882a593Smuzhiyun 	int stack_depth; /* for eBPF only, since tests don't call verifier */
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* Large test cases need separate allocation and fill handler. */
86*4882a593Smuzhiyun 
bpf_fill_maxinsns1(struct bpf_test * self)87*4882a593Smuzhiyun static int bpf_fill_maxinsns1(struct bpf_test *self)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
90*4882a593Smuzhiyun 	struct sock_filter *insn;
91*4882a593Smuzhiyun 	__u32 k = ~0;
92*4882a593Smuzhiyun 	int i;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
95*4882a593Smuzhiyun 	if (!insn)
96*4882a593Smuzhiyun 		return -ENOMEM;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	for (i = 0; i < len; i++, k--)
99*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, k);
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
102*4882a593Smuzhiyun 	self->u.ptr.len = len;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 	return 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
bpf_fill_maxinsns2(struct bpf_test * self)107*4882a593Smuzhiyun static int bpf_fill_maxinsns2(struct bpf_test *self)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
110*4882a593Smuzhiyun 	struct sock_filter *insn;
111*4882a593Smuzhiyun 	int i;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
114*4882a593Smuzhiyun 	if (!insn)
115*4882a593Smuzhiyun 		return -ENOMEM;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 	for (i = 0; i < len; i++)
118*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
121*4882a593Smuzhiyun 	self->u.ptr.len = len;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	return 0;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
bpf_fill_maxinsns3(struct bpf_test * self)126*4882a593Smuzhiyun static int bpf_fill_maxinsns3(struct bpf_test *self)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
129*4882a593Smuzhiyun 	struct sock_filter *insn;
130*4882a593Smuzhiyun 	struct rnd_state rnd;
131*4882a593Smuzhiyun 	int i;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
134*4882a593Smuzhiyun 	if (!insn)
135*4882a593Smuzhiyun 		return -ENOMEM;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 	prandom_seed_state(&rnd, 3141592653589793238ULL);
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	for (i = 0; i < len - 1; i++) {
140*4882a593Smuzhiyun 		__u32 k = prandom_u32_state(&rnd);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, k);
143*4882a593Smuzhiyun 	}
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
148*4882a593Smuzhiyun 	self->u.ptr.len = len;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	return 0;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
bpf_fill_maxinsns4(struct bpf_test * self)153*4882a593Smuzhiyun static int bpf_fill_maxinsns4(struct bpf_test *self)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS + 1;
156*4882a593Smuzhiyun 	struct sock_filter *insn;
157*4882a593Smuzhiyun 	int i;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
160*4882a593Smuzhiyun 	if (!insn)
161*4882a593Smuzhiyun 		return -ENOMEM;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	for (i = 0; i < len; i++)
164*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
167*4882a593Smuzhiyun 	self->u.ptr.len = len;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	return 0;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun 
bpf_fill_maxinsns5(struct bpf_test * self)172*4882a593Smuzhiyun static int bpf_fill_maxinsns5(struct bpf_test *self)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
175*4882a593Smuzhiyun 	struct sock_filter *insn;
176*4882a593Smuzhiyun 	int i;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
179*4882a593Smuzhiyun 	if (!insn)
180*4882a593Smuzhiyun 		return -ENOMEM;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	for (i = 1; i < len - 1; i++)
185*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_RET | BPF_K, 0xfefefefe);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
190*4882a593Smuzhiyun 	self->u.ptr.len = len;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	return 0;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
bpf_fill_maxinsns6(struct bpf_test * self)195*4882a593Smuzhiyun static int bpf_fill_maxinsns6(struct bpf_test *self)
196*4882a593Smuzhiyun {
197*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
198*4882a593Smuzhiyun 	struct sock_filter *insn;
199*4882a593Smuzhiyun 	int i;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
202*4882a593Smuzhiyun 	if (!insn)
203*4882a593Smuzhiyun 		return -ENOMEM;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	for (i = 0; i < len - 1; i++)
206*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
207*4882a593Smuzhiyun 				     SKF_AD_VLAN_TAG_PRESENT);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
212*4882a593Smuzhiyun 	self->u.ptr.len = len;
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 	return 0;
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun 
bpf_fill_maxinsns7(struct bpf_test * self)217*4882a593Smuzhiyun static int bpf_fill_maxinsns7(struct bpf_test *self)
218*4882a593Smuzhiyun {
219*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
220*4882a593Smuzhiyun 	struct sock_filter *insn;
221*4882a593Smuzhiyun 	int i;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
224*4882a593Smuzhiyun 	if (!insn)
225*4882a593Smuzhiyun 		return -ENOMEM;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	for (i = 0; i < len - 4; i++)
228*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
229*4882a593Smuzhiyun 				     SKF_AD_CPU);
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	insn[len - 4] = __BPF_STMT(BPF_MISC | BPF_TAX, 0);
232*4882a593Smuzhiyun 	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS, SKF_AD_OFF +
233*4882a593Smuzhiyun 				   SKF_AD_CPU);
234*4882a593Smuzhiyun 	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0);
235*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
238*4882a593Smuzhiyun 	self->u.ptr.len = len;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun 	return 0;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun 
bpf_fill_maxinsns8(struct bpf_test * self)243*4882a593Smuzhiyun static int bpf_fill_maxinsns8(struct bpf_test *self)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
246*4882a593Smuzhiyun 	struct sock_filter *insn;
247*4882a593Smuzhiyun 	int i, jmp_off = len - 3;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
250*4882a593Smuzhiyun 	if (!insn)
251*4882a593Smuzhiyun 		return -ENOMEM;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	insn[0] = __BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun 	for (i = 1; i < len - 1; i++)
256*4882a593Smuzhiyun 		insn[i] = __BPF_JUMP(BPF_JMP | BPF_JGT, 0xffffffff, jmp_off--, 0);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
261*4882a593Smuzhiyun 	self->u.ptr.len = len;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	return 0;
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun 
bpf_fill_maxinsns9(struct bpf_test * self)266*4882a593Smuzhiyun static int bpf_fill_maxinsns9(struct bpf_test *self)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
269*4882a593Smuzhiyun 	struct bpf_insn *insn;
270*4882a593Smuzhiyun 	int i;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
273*4882a593Smuzhiyun 	if (!insn)
274*4882a593Smuzhiyun 		return -ENOMEM;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun 	insn[0] = BPF_JMP_IMM(BPF_JA, 0, 0, len - 2);
277*4882a593Smuzhiyun 	insn[1] = BPF_ALU32_IMM(BPF_MOV, R0, 0xcbababab);
278*4882a593Smuzhiyun 	insn[2] = BPF_EXIT_INSN();
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	for (i = 3; i < len - 2; i++)
281*4882a593Smuzhiyun 		insn[i] = BPF_ALU32_IMM(BPF_MOV, R0, 0xfefefefe);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	insn[len - 2] = BPF_EXIT_INSN();
284*4882a593Smuzhiyun 	insn[len - 1] = BPF_JMP_IMM(BPF_JA, 0, 0, -(len - 1));
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
287*4882a593Smuzhiyun 	self->u.ptr.len = len;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	return 0;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
bpf_fill_maxinsns10(struct bpf_test * self)292*4882a593Smuzhiyun static int bpf_fill_maxinsns10(struct bpf_test *self)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS, hlen = len - 2;
295*4882a593Smuzhiyun 	struct bpf_insn *insn;
296*4882a593Smuzhiyun 	int i;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
299*4882a593Smuzhiyun 	if (!insn)
300*4882a593Smuzhiyun 		return -ENOMEM;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	for (i = 0; i < hlen / 2; i++)
303*4882a593Smuzhiyun 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 2 - 2 * i);
304*4882a593Smuzhiyun 	for (i = hlen - 1; i > hlen / 2; i--)
305*4882a593Smuzhiyun 		insn[i] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen - 1 - 2 * i);
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	insn[hlen / 2] = BPF_JMP_IMM(BPF_JA, 0, 0, hlen / 2 - 1);
308*4882a593Smuzhiyun 	insn[hlen]     = BPF_ALU32_IMM(BPF_MOV, R0, 0xabababac);
309*4882a593Smuzhiyun 	insn[hlen + 1] = BPF_EXIT_INSN();
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
312*4882a593Smuzhiyun 	self->u.ptr.len = len;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	return 0;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
__bpf_fill_ja(struct bpf_test * self,unsigned int len,unsigned int plen)317*4882a593Smuzhiyun static int __bpf_fill_ja(struct bpf_test *self, unsigned int len,
318*4882a593Smuzhiyun 			 unsigned int plen)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun 	struct sock_filter *insn;
321*4882a593Smuzhiyun 	unsigned int rlen;
322*4882a593Smuzhiyun 	int i, j;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
325*4882a593Smuzhiyun 	if (!insn)
326*4882a593Smuzhiyun 		return -ENOMEM;
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	rlen = (len % plen) - 1;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun 	for (i = 0; i + plen < len; i += plen)
331*4882a593Smuzhiyun 		for (j = 0; j < plen; j++)
332*4882a593Smuzhiyun 			insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA,
333*4882a593Smuzhiyun 						 plen - 1 - j, 0, 0);
334*4882a593Smuzhiyun 	for (j = 0; j < rlen; j++)
335*4882a593Smuzhiyun 		insn[i + j] = __BPF_JUMP(BPF_JMP | BPF_JA, rlen - 1 - j,
336*4882a593Smuzhiyun 					 0, 0);
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xababcbac);
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
341*4882a593Smuzhiyun 	self->u.ptr.len = len;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	return 0;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
bpf_fill_maxinsns11(struct bpf_test * self)346*4882a593Smuzhiyun static int bpf_fill_maxinsns11(struct bpf_test *self)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun 	/* Hits 70 passes on x86_64, so cannot get JITed there. */
349*4882a593Smuzhiyun 	return __bpf_fill_ja(self, BPF_MAXINSNS, 68);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
bpf_fill_maxinsns12(struct bpf_test * self)352*4882a593Smuzhiyun static int bpf_fill_maxinsns12(struct bpf_test *self)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
355*4882a593Smuzhiyun 	struct sock_filter *insn;
356*4882a593Smuzhiyun 	int i = 0;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
359*4882a593Smuzhiyun 	if (!insn)
360*4882a593Smuzhiyun 		return -ENOMEM;
361*4882a593Smuzhiyun 
362*4882a593Smuzhiyun 	insn[0] = __BPF_JUMP(BPF_JMP | BPF_JA, len - 2, 0, 0);
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	for (i = 1; i < len - 1; i++)
365*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xabababab);
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
370*4882a593Smuzhiyun 	self->u.ptr.len = len;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	return 0;
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
bpf_fill_maxinsns13(struct bpf_test * self)375*4882a593Smuzhiyun static int bpf_fill_maxinsns13(struct bpf_test *self)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
378*4882a593Smuzhiyun 	struct sock_filter *insn;
379*4882a593Smuzhiyun 	int i = 0;
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
382*4882a593Smuzhiyun 	if (!insn)
383*4882a593Smuzhiyun 		return -ENOMEM;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	for (i = 0; i < len - 3; i++)
386*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	insn[len - 3] = __BPF_STMT(BPF_LD | BPF_IMM, 0xabababab);
389*4882a593Smuzhiyun 	insn[len - 2] = __BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0);
390*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_A, 0);
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
393*4882a593Smuzhiyun 	self->u.ptr.len = len;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	return 0;
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun 
bpf_fill_ja(struct bpf_test * self)398*4882a593Smuzhiyun static int bpf_fill_ja(struct bpf_test *self)
399*4882a593Smuzhiyun {
400*4882a593Smuzhiyun 	/* Hits exactly 11 passes on x86_64 JIT. */
401*4882a593Smuzhiyun 	return __bpf_fill_ja(self, 12, 9);
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
bpf_fill_ld_abs_get_processor_id(struct bpf_test * self)404*4882a593Smuzhiyun static int bpf_fill_ld_abs_get_processor_id(struct bpf_test *self)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
407*4882a593Smuzhiyun 	struct sock_filter *insn;
408*4882a593Smuzhiyun 	int i;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
411*4882a593Smuzhiyun 	if (!insn)
412*4882a593Smuzhiyun 		return -ENOMEM;
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	for (i = 0; i < len - 1; i += 2) {
415*4882a593Smuzhiyun 		insn[i] = __BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 0);
416*4882a593Smuzhiyun 		insn[i + 1] = __BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
417*4882a593Smuzhiyun 					 SKF_AD_OFF + SKF_AD_CPU);
418*4882a593Smuzhiyun 	}
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 	insn[len - 1] = __BPF_STMT(BPF_RET | BPF_K, 0xbee);
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
423*4882a593Smuzhiyun 	self->u.ptr.len = len;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun 	return 0;
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun 
__bpf_fill_stxdw(struct bpf_test * self,int size)428*4882a593Smuzhiyun static int __bpf_fill_stxdw(struct bpf_test *self, int size)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun 	unsigned int len = BPF_MAXINSNS;
431*4882a593Smuzhiyun 	struct bpf_insn *insn;
432*4882a593Smuzhiyun 	int i;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun 	insn = kmalloc_array(len, sizeof(*insn), GFP_KERNEL);
435*4882a593Smuzhiyun 	if (!insn)
436*4882a593Smuzhiyun 		return -ENOMEM;
437*4882a593Smuzhiyun 
438*4882a593Smuzhiyun 	insn[0] = BPF_ALU32_IMM(BPF_MOV, R0, 1);
439*4882a593Smuzhiyun 	insn[1] = BPF_ST_MEM(size, R10, -40, 42);
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	for (i = 2; i < len - 2; i++)
442*4882a593Smuzhiyun 		insn[i] = BPF_STX_XADD(size, R10, R0, -40);
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun 	insn[len - 2] = BPF_LDX_MEM(size, R0, R10, -40);
445*4882a593Smuzhiyun 	insn[len - 1] = BPF_EXIT_INSN();
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 	self->u.ptr.insns = insn;
448*4882a593Smuzhiyun 	self->u.ptr.len = len;
449*4882a593Smuzhiyun 	self->stack_depth = 40;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	return 0;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
bpf_fill_stxw(struct bpf_test * self)454*4882a593Smuzhiyun static int bpf_fill_stxw(struct bpf_test *self)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun 	return __bpf_fill_stxdw(self, BPF_W);
457*4882a593Smuzhiyun }
458*4882a593Smuzhiyun 
bpf_fill_stxdw(struct bpf_test * self)459*4882a593Smuzhiyun static int bpf_fill_stxdw(struct bpf_test *self)
460*4882a593Smuzhiyun {
461*4882a593Smuzhiyun 	return __bpf_fill_stxdw(self, BPF_DW);
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun static struct bpf_test tests[] = {
465*4882a593Smuzhiyun 	{
466*4882a593Smuzhiyun 		"TAX",
467*4882a593Smuzhiyun 		.u.insns = {
468*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 1),
469*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
470*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
471*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
472*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_NEG, 0), /* A == -3 */
473*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
474*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_LEN, 0),
475*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
476*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0), /* X == len - 3 */
477*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 1),
478*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
479*4882a593Smuzhiyun 		},
480*4882a593Smuzhiyun 		CLASSIC,
481*4882a593Smuzhiyun 		{ 10, 20, 30, 40, 50 },
482*4882a593Smuzhiyun 		{ { 2, 10 }, { 3, 20 }, { 4, 30 } },
483*4882a593Smuzhiyun 	},
484*4882a593Smuzhiyun 	{
485*4882a593Smuzhiyun 		"TXA",
486*4882a593Smuzhiyun 		.u.insns = {
487*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
488*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
489*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
490*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0) /* A == len * 2 */
491*4882a593Smuzhiyun 		},
492*4882a593Smuzhiyun 		CLASSIC,
493*4882a593Smuzhiyun 		{ 10, 20, 30, 40, 50 },
494*4882a593Smuzhiyun 		{ { 1, 2 }, { 3, 6 }, { 4, 8 } },
495*4882a593Smuzhiyun 	},
496*4882a593Smuzhiyun 	{
497*4882a593Smuzhiyun 		"ADD_SUB_MUL_K",
498*4882a593Smuzhiyun 		.u.insns = {
499*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 1),
500*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 2),
501*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
502*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
503*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0xffffffff),
504*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 3),
505*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
506*4882a593Smuzhiyun 		},
507*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
508*4882a593Smuzhiyun 		{ },
509*4882a593Smuzhiyun 		{ { 0, 0xfffffffd } }
510*4882a593Smuzhiyun 	},
511*4882a593Smuzhiyun 	{
512*4882a593Smuzhiyun 		"DIV_MOD_KX",
513*4882a593Smuzhiyun 		.u.insns = {
514*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 8),
515*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 2),
516*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
517*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
518*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
519*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
520*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
521*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x70000000),
522*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
523*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
524*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
525*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
526*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffffffff),
527*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x70000000),
528*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
529*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
530*4882a593Smuzhiyun 		},
531*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
532*4882a593Smuzhiyun 		{ },
533*4882a593Smuzhiyun 		{ { 0, 0x20000000 } }
534*4882a593Smuzhiyun 	},
535*4882a593Smuzhiyun 	{
536*4882a593Smuzhiyun 		"AND_OR_LSH_K",
537*4882a593Smuzhiyun 		.u.insns = {
538*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xff),
539*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
540*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 27),
541*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
542*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xf),
543*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_OR | BPF_K, 0xf0),
544*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
545*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
546*4882a593Smuzhiyun 		},
547*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
548*4882a593Smuzhiyun 		{ },
549*4882a593Smuzhiyun 		{ { 0, 0x800000ff }, { 1, 0x800000ff } },
550*4882a593Smuzhiyun 	},
551*4882a593Smuzhiyun 	{
552*4882a593Smuzhiyun 		"LD_IMM_0",
553*4882a593Smuzhiyun 		.u.insns = {
554*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0), /* ld #0 */
555*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 1, 0),
556*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0),
557*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
558*4882a593Smuzhiyun 		},
559*4882a593Smuzhiyun 		CLASSIC,
560*4882a593Smuzhiyun 		{ },
561*4882a593Smuzhiyun 		{ { 1, 1 } },
562*4882a593Smuzhiyun 	},
563*4882a593Smuzhiyun 	{
564*4882a593Smuzhiyun 		"LD_IND",
565*4882a593Smuzhiyun 		.u.insns = {
566*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
567*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, MAX_K),
568*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1)
569*4882a593Smuzhiyun 		},
570*4882a593Smuzhiyun 		CLASSIC,
571*4882a593Smuzhiyun 		{ },
572*4882a593Smuzhiyun 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
573*4882a593Smuzhiyun 	},
574*4882a593Smuzhiyun 	{
575*4882a593Smuzhiyun 		"LD_ABS",
576*4882a593Smuzhiyun 		.u.insns = {
577*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS, 1000),
578*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1)
579*4882a593Smuzhiyun 		},
580*4882a593Smuzhiyun 		CLASSIC,
581*4882a593Smuzhiyun 		{ },
582*4882a593Smuzhiyun 		{ { 1, 0 }, { 10, 0 }, { 60, 0 } },
583*4882a593Smuzhiyun 	},
584*4882a593Smuzhiyun 	{
585*4882a593Smuzhiyun 		"LD_ABS_LL",
586*4882a593Smuzhiyun 		.u.insns = {
587*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF),
588*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
589*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_LL_OFF + 1),
590*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
591*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
592*4882a593Smuzhiyun 		},
593*4882a593Smuzhiyun 		CLASSIC,
594*4882a593Smuzhiyun 		{ 1, 2, 3 },
595*4882a593Smuzhiyun 		{ { 1, 0 }, { 2, 3 } },
596*4882a593Smuzhiyun 	},
597*4882a593Smuzhiyun 	{
598*4882a593Smuzhiyun 		"LD_IND_LL",
599*4882a593Smuzhiyun 		.u.insns = {
600*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, SKF_LL_OFF - 1),
601*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
602*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
603*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
604*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
605*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
606*4882a593Smuzhiyun 		},
607*4882a593Smuzhiyun 		CLASSIC,
608*4882a593Smuzhiyun 		{ 1, 2, 3, 0xff },
609*4882a593Smuzhiyun 		{ { 1, 1 }, { 3, 3 }, { 4, 0xff } },
610*4882a593Smuzhiyun 	},
611*4882a593Smuzhiyun 	{
612*4882a593Smuzhiyun 		"LD_ABS_NET",
613*4882a593Smuzhiyun 		.u.insns = {
614*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF),
615*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
616*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, SKF_NET_OFF + 1),
617*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
618*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
619*4882a593Smuzhiyun 		},
620*4882a593Smuzhiyun 		CLASSIC,
621*4882a593Smuzhiyun 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
622*4882a593Smuzhiyun 		{ { 15, 0 }, { 16, 3 } },
623*4882a593Smuzhiyun 	},
624*4882a593Smuzhiyun 	{
625*4882a593Smuzhiyun 		"LD_IND_NET",
626*4882a593Smuzhiyun 		.u.insns = {
627*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, SKF_NET_OFF - 15),
628*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
629*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
630*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
631*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 0),
632*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
633*4882a593Smuzhiyun 		},
634*4882a593Smuzhiyun 		CLASSIC,
635*4882a593Smuzhiyun 		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 },
636*4882a593Smuzhiyun 		{ { 14, 0 }, { 15, 1 }, { 17, 3 } },
637*4882a593Smuzhiyun 	},
638*4882a593Smuzhiyun 	{
639*4882a593Smuzhiyun 		"LD_PKTTYPE",
640*4882a593Smuzhiyun 		.u.insns = {
641*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
642*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
643*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
644*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
645*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
646*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
647*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
648*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
649*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
650*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PKTTYPE),
651*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, SKB_TYPE, 1, 0),
652*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
653*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
654*4882a593Smuzhiyun 		},
655*4882a593Smuzhiyun 		CLASSIC,
656*4882a593Smuzhiyun 		{ },
657*4882a593Smuzhiyun 		{ { 1, 3 }, { 10, 3 } },
658*4882a593Smuzhiyun 	},
659*4882a593Smuzhiyun 	{
660*4882a593Smuzhiyun 		"LD_MARK",
661*4882a593Smuzhiyun 		.u.insns = {
662*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
663*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_MARK),
664*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
665*4882a593Smuzhiyun 		},
666*4882a593Smuzhiyun 		CLASSIC,
667*4882a593Smuzhiyun 		{ },
668*4882a593Smuzhiyun 		{ { 1, SKB_MARK}, { 10, SKB_MARK} },
669*4882a593Smuzhiyun 	},
670*4882a593Smuzhiyun 	{
671*4882a593Smuzhiyun 		"LD_RXHASH",
672*4882a593Smuzhiyun 		.u.insns = {
673*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
674*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_RXHASH),
675*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
676*4882a593Smuzhiyun 		},
677*4882a593Smuzhiyun 		CLASSIC,
678*4882a593Smuzhiyun 		{ },
679*4882a593Smuzhiyun 		{ { 1, SKB_HASH}, { 10, SKB_HASH} },
680*4882a593Smuzhiyun 	},
681*4882a593Smuzhiyun 	{
682*4882a593Smuzhiyun 		"LD_QUEUE",
683*4882a593Smuzhiyun 		.u.insns = {
684*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
685*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_QUEUE),
686*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
687*4882a593Smuzhiyun 		},
688*4882a593Smuzhiyun 		CLASSIC,
689*4882a593Smuzhiyun 		{ },
690*4882a593Smuzhiyun 		{ { 1, SKB_QUEUE_MAP }, { 10, SKB_QUEUE_MAP } },
691*4882a593Smuzhiyun 	},
692*4882a593Smuzhiyun 	{
693*4882a593Smuzhiyun 		"LD_PROTOCOL",
694*4882a593Smuzhiyun 		.u.insns = {
695*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 1),
696*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 20, 1, 0),
697*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0),
698*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
699*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PROTOCOL),
700*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
701*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
702*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 30, 1, 0),
703*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0),
704*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
705*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
706*4882a593Smuzhiyun 		},
707*4882a593Smuzhiyun 		CLASSIC,
708*4882a593Smuzhiyun 		{ 10, 20, 30 },
709*4882a593Smuzhiyun 		{ { 10, ETH_P_IP }, { 100, ETH_P_IP } },
710*4882a593Smuzhiyun 	},
711*4882a593Smuzhiyun 	{
712*4882a593Smuzhiyun 		"LD_VLAN_TAG",
713*4882a593Smuzhiyun 		.u.insns = {
714*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
715*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_VLAN_TAG),
716*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
717*4882a593Smuzhiyun 		},
718*4882a593Smuzhiyun 		CLASSIC,
719*4882a593Smuzhiyun 		{ },
720*4882a593Smuzhiyun 		{
721*4882a593Smuzhiyun 			{ 1, SKB_VLAN_TCI },
722*4882a593Smuzhiyun 			{ 10, SKB_VLAN_TCI }
723*4882a593Smuzhiyun 		},
724*4882a593Smuzhiyun 	},
725*4882a593Smuzhiyun 	{
726*4882a593Smuzhiyun 		"LD_VLAN_TAG_PRESENT",
727*4882a593Smuzhiyun 		.u.insns = {
728*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
729*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
730*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
731*4882a593Smuzhiyun 		},
732*4882a593Smuzhiyun 		CLASSIC,
733*4882a593Smuzhiyun 		{ },
734*4882a593Smuzhiyun 		{
735*4882a593Smuzhiyun 			{ 1, SKB_VLAN_PRESENT },
736*4882a593Smuzhiyun 			{ 10, SKB_VLAN_PRESENT }
737*4882a593Smuzhiyun 		},
738*4882a593Smuzhiyun 	},
739*4882a593Smuzhiyun 	{
740*4882a593Smuzhiyun 		"LD_IFINDEX",
741*4882a593Smuzhiyun 		.u.insns = {
742*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
743*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_IFINDEX),
744*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
745*4882a593Smuzhiyun 		},
746*4882a593Smuzhiyun 		CLASSIC,
747*4882a593Smuzhiyun 		{ },
748*4882a593Smuzhiyun 		{ { 1, SKB_DEV_IFINDEX }, { 10, SKB_DEV_IFINDEX } },
749*4882a593Smuzhiyun 	},
750*4882a593Smuzhiyun 	{
751*4882a593Smuzhiyun 		"LD_HATYPE",
752*4882a593Smuzhiyun 		.u.insns = {
753*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
754*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_HATYPE),
755*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
756*4882a593Smuzhiyun 		},
757*4882a593Smuzhiyun 		CLASSIC,
758*4882a593Smuzhiyun 		{ },
759*4882a593Smuzhiyun 		{ { 1, SKB_DEV_TYPE }, { 10, SKB_DEV_TYPE } },
760*4882a593Smuzhiyun 	},
761*4882a593Smuzhiyun 	{
762*4882a593Smuzhiyun 		"LD_CPU",
763*4882a593Smuzhiyun 		.u.insns = {
764*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
765*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_CPU),
766*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
767*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
768*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_CPU),
769*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
770*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
771*4882a593Smuzhiyun 		},
772*4882a593Smuzhiyun 		CLASSIC,
773*4882a593Smuzhiyun 		{ },
774*4882a593Smuzhiyun 		{ { 1, 0 }, { 10, 0 } },
775*4882a593Smuzhiyun 	},
776*4882a593Smuzhiyun 	{
777*4882a593Smuzhiyun 		"LD_NLATTR",
778*4882a593Smuzhiyun 		.u.insns = {
779*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 2),
780*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
781*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
782*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
783*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR),
784*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
785*4882a593Smuzhiyun 		},
786*4882a593Smuzhiyun 		CLASSIC,
787*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
788*4882a593Smuzhiyun 		{ 0xff, 0xff, 0, 4, 0, 2, 0, 4, 0, 3 },
789*4882a593Smuzhiyun #else
790*4882a593Smuzhiyun 		{ 0xff, 0xff, 4, 0, 2, 0, 4, 0, 3, 0 },
791*4882a593Smuzhiyun #endif
792*4882a593Smuzhiyun 		{ { 4, 0 }, { 20, 6 } },
793*4882a593Smuzhiyun 	},
794*4882a593Smuzhiyun 	{
795*4882a593Smuzhiyun 		"LD_NLATTR_NEST",
796*4882a593Smuzhiyun 		.u.insns = {
797*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
798*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 3),
799*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
800*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
801*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
802*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
803*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
804*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
805*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
806*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
807*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
808*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
809*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
810*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
811*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
812*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
813*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
814*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
815*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
816*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
817*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
818*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
819*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
820*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
821*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_NLATTR_NEST),
822*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
823*4882a593Smuzhiyun 		},
824*4882a593Smuzhiyun 		CLASSIC,
825*4882a593Smuzhiyun #ifdef __BIG_ENDIAN
826*4882a593Smuzhiyun 		{ 0xff, 0xff, 0, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3 },
827*4882a593Smuzhiyun #else
828*4882a593Smuzhiyun 		{ 0xff, 0xff, 12, 0, 1, 0, 4, 0, 2, 0, 4, 0, 3, 0 },
829*4882a593Smuzhiyun #endif
830*4882a593Smuzhiyun 		{ { 4, 0 }, { 20, 10 } },
831*4882a593Smuzhiyun 	},
832*4882a593Smuzhiyun 	{
833*4882a593Smuzhiyun 		"LD_PAYLOAD_OFF",
834*4882a593Smuzhiyun 		.u.insns = {
835*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
836*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
837*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
838*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
839*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
840*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
841*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
842*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
843*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
844*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_PAY_OFFSET),
845*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
846*4882a593Smuzhiyun 		},
847*4882a593Smuzhiyun 		CLASSIC,
848*4882a593Smuzhiyun 		/* 00:00:00:00:00:00 > 00:00:00:00:00:00, ethtype IPv4 (0x0800),
849*4882a593Smuzhiyun 		 * length 98: 127.0.0.1 > 127.0.0.1: ICMP echo request,
850*4882a593Smuzhiyun 		 * id 9737, seq 1, length 64
851*4882a593Smuzhiyun 		 */
852*4882a593Smuzhiyun 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
853*4882a593Smuzhiyun 		  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854*4882a593Smuzhiyun 		  0x08, 0x00,
855*4882a593Smuzhiyun 		  0x45, 0x00, 0x00, 0x54, 0xac, 0x8b, 0x40, 0x00, 0x40,
856*4882a593Smuzhiyun 		  0x01, 0x90, 0x1b, 0x7f, 0x00, 0x00, 0x01 },
857*4882a593Smuzhiyun 		{ { 30, 0 }, { 100, 42 } },
858*4882a593Smuzhiyun 	},
859*4882a593Smuzhiyun 	{
860*4882a593Smuzhiyun 		"LD_ANC_XOR",
861*4882a593Smuzhiyun 		.u.insns = {
862*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 10),
863*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 300),
864*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
865*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_ALU_XOR_X),
866*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
867*4882a593Smuzhiyun 		},
868*4882a593Smuzhiyun 		CLASSIC,
869*4882a593Smuzhiyun 		{ },
870*4882a593Smuzhiyun 		{ { 4, 0xA ^ 300 }, { 20, 0xA ^ 300 } },
871*4882a593Smuzhiyun 	},
872*4882a593Smuzhiyun 	{
873*4882a593Smuzhiyun 		"SPILL_FILL",
874*4882a593Smuzhiyun 		.u.insns = {
875*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
876*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 2),
877*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_RSH, 1),
878*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
879*4882a593Smuzhiyun 			BPF_STMT(BPF_ST, 1), /* M1 = 1 ^ len */
880*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x80000000),
881*4882a593Smuzhiyun 			BPF_STMT(BPF_ST, 2), /* M2 = 1 ^ len ^ 0x80000000 */
882*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 15), /* M3 = len */
883*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
884*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_MEM, 2),
885*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
886*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
887*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_XOR | BPF_X, 0),
888*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
889*4882a593Smuzhiyun 		},
890*4882a593Smuzhiyun 		CLASSIC,
891*4882a593Smuzhiyun 		{ },
892*4882a593Smuzhiyun 		{ { 1, 0x80000001 }, { 2, 0x80000002 }, { 60, 0x80000000 ^ 60 } }
893*4882a593Smuzhiyun 	},
894*4882a593Smuzhiyun 	{
895*4882a593Smuzhiyun 		"JEQ",
896*4882a593Smuzhiyun 		.u.insns = {
897*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
898*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
899*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 0, 1),
900*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
901*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
902*4882a593Smuzhiyun 		},
903*4882a593Smuzhiyun 		CLASSIC,
904*4882a593Smuzhiyun 		{ 3, 3, 3, 3, 3 },
905*4882a593Smuzhiyun 		{ { 1, 0 }, { 3, 1 }, { 4, MAX_K } },
906*4882a593Smuzhiyun 	},
907*4882a593Smuzhiyun 	{
908*4882a593Smuzhiyun 		"JGT",
909*4882a593Smuzhiyun 		.u.insns = {
910*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
911*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
912*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_X, 0, 0, 1),
913*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
914*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
915*4882a593Smuzhiyun 		},
916*4882a593Smuzhiyun 		CLASSIC,
917*4882a593Smuzhiyun 		{ 4, 4, 4, 3, 3 },
918*4882a593Smuzhiyun 		{ { 2, 0 }, { 3, 1 }, { 4, MAX_K } },
919*4882a593Smuzhiyun 	},
920*4882a593Smuzhiyun 	{
921*4882a593Smuzhiyun 		"JGE (jt 0), test 1",
922*4882a593Smuzhiyun 		.u.insns = {
923*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
924*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
925*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
926*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
927*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
928*4882a593Smuzhiyun 		},
929*4882a593Smuzhiyun 		CLASSIC,
930*4882a593Smuzhiyun 		{ 4, 4, 4, 3, 3 },
931*4882a593Smuzhiyun 		{ { 2, 0 }, { 3, 1 }, { 4, 1 } },
932*4882a593Smuzhiyun 	},
933*4882a593Smuzhiyun 	{
934*4882a593Smuzhiyun 		"JGE (jt 0), test 2",
935*4882a593Smuzhiyun 		.u.insns = {
936*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
937*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 2),
938*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_X, 0, 0, 1),
939*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
940*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
941*4882a593Smuzhiyun 		},
942*4882a593Smuzhiyun 		CLASSIC,
943*4882a593Smuzhiyun 		{ 4, 4, 5, 3, 3 },
944*4882a593Smuzhiyun 		{ { 4, 1 }, { 5, 1 }, { 6, MAX_K } },
945*4882a593Smuzhiyun 	},
946*4882a593Smuzhiyun 	{
947*4882a593Smuzhiyun 		"JGE",
948*4882a593Smuzhiyun 		.u.insns = {
949*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
950*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, MAX_K),
951*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 1, 1, 0),
952*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 10),
953*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 2, 1, 0),
954*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 20),
955*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 3, 1, 0),
956*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
957*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 4, 1, 0),
958*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 40),
959*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
960*4882a593Smuzhiyun 		},
961*4882a593Smuzhiyun 		CLASSIC,
962*4882a593Smuzhiyun 		{ 1, 2, 3, 4, 5 },
963*4882a593Smuzhiyun 		{ { 1, 20 }, { 3, 40 }, { 5, MAX_K } },
964*4882a593Smuzhiyun 	},
965*4882a593Smuzhiyun 	{
966*4882a593Smuzhiyun 		"JSET",
967*4882a593Smuzhiyun 		.u.insns = {
968*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
969*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JA, 1, 1, 1),
970*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
971*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JA, 0, 0, 0),
972*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_LEN, 0),
973*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
974*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, 4),
975*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
976*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_IND, 0),
977*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 1, 0, 1),
978*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 10),
979*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x80000000, 0, 1),
980*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 20),
981*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
982*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
983*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
984*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
985*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
986*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
987*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
988*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
989*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0xffffff, 1, 0),
990*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 30),
991*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, MAX_K)
992*4882a593Smuzhiyun 		},
993*4882a593Smuzhiyun 		CLASSIC,
994*4882a593Smuzhiyun 		{ 0, 0xAA, 0x55, 1 },
995*4882a593Smuzhiyun 		{ { 4, 10 }, { 5, 20 }, { 6, MAX_K } },
996*4882a593Smuzhiyun 	},
997*4882a593Smuzhiyun 	{
998*4882a593Smuzhiyun 		"tcpdump port 22",
999*4882a593Smuzhiyun 		.u.insns = {
1000*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1001*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 0, 8), /* IPv6 */
1002*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 20),
1003*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1004*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1005*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 17),
1006*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 54),
1007*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 14, 0),
1008*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 56),
1009*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 12, 13),
1010*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0800, 0, 12), /* IPv4 */
1011*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1012*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x84, 2, 0),
1013*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 1, 0),
1014*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x11, 0, 8),
1015*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1016*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 6, 0),
1017*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1018*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1019*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1020*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1021*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 1),
1022*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1023*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0),
1024*4882a593Smuzhiyun 		},
1025*4882a593Smuzhiyun 		CLASSIC,
1026*4882a593Smuzhiyun 		/* 3c:07:54:43:e5:76 > 10:bf:48:d6:43:d6, ethertype IPv4(0x0800)
1027*4882a593Smuzhiyun 		 * length 114: 10.1.1.149.49700 > 10.1.2.10.22: Flags [P.],
1028*4882a593Smuzhiyun 		 * seq 1305692979:1305693027, ack 3650467037, win 65535,
1029*4882a593Smuzhiyun 		 * options [nop,nop,TS val 2502645400 ecr 3971138], length 48
1030*4882a593Smuzhiyun 		 */
1031*4882a593Smuzhiyun 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1032*4882a593Smuzhiyun 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1033*4882a593Smuzhiyun 		  0x08, 0x00,
1034*4882a593Smuzhiyun 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1035*4882a593Smuzhiyun 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1036*4882a593Smuzhiyun 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1037*4882a593Smuzhiyun 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1038*4882a593Smuzhiyun 		  0xc2, 0x24,
1039*4882a593Smuzhiyun 		  0x00, 0x16 /* dst port */ },
1040*4882a593Smuzhiyun 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1041*4882a593Smuzhiyun 	},
1042*4882a593Smuzhiyun 	{
1043*4882a593Smuzhiyun 		"tcpdump complex",
1044*4882a593Smuzhiyun 		.u.insns = {
1045*4882a593Smuzhiyun 			/* tcpdump -nei eth0 'tcp port 22 and (((ip[2:2] -
1046*4882a593Smuzhiyun 			 * ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and
1047*4882a593Smuzhiyun 			 * (len > 115 or len < 30000000000)' -d
1048*4882a593Smuzhiyun 			 */
1049*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 12),
1050*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x86dd, 30, 0),
1051*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x800, 0, 29),
1052*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 23),
1053*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x6, 0, 27),
1054*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 20),
1055*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, 0x1fff, 25, 0),
1056*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1057*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 14),
1058*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 2, 0),
1059*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_IND, 16),
1060*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 22, 0, 20),
1061*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 16),
1062*4882a593Smuzhiyun 			BPF_STMT(BPF_ST, 1),
1063*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_ABS, 14),
1064*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf),
1065*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 2),
1066*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0x5), /* libpcap emits K on TAX */
1067*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_MEM, 1),
1068*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
1069*4882a593Smuzhiyun 			BPF_STMT(BPF_ST, 5),
1070*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 14),
1071*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_B | BPF_IND, 26),
1072*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xf0),
1073*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 2),
1074*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0x9), /* libpcap emits K on TAX */
1075*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_MEM, 5),
1076*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 4, 0),
1077*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_LEN, 0),
1078*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGT | BPF_K, 0x73, 1, 0),
1079*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, 0xfc23ac00, 1, 0),
1080*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0xffff),
1081*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0),
1082*4882a593Smuzhiyun 		},
1083*4882a593Smuzhiyun 		CLASSIC,
1084*4882a593Smuzhiyun 		{ 0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
1085*4882a593Smuzhiyun 		  0x3c, 0x07, 0x54, 0x43, 0xe5, 0x76,
1086*4882a593Smuzhiyun 		  0x08, 0x00,
1087*4882a593Smuzhiyun 		  0x45, 0x10, 0x00, 0x64, 0x75, 0xb5,
1088*4882a593Smuzhiyun 		  0x40, 0x00, 0x40, 0x06, 0xad, 0x2e, /* IP header */
1089*4882a593Smuzhiyun 		  0x0a, 0x01, 0x01, 0x95, /* ip src */
1090*4882a593Smuzhiyun 		  0x0a, 0x01, 0x02, 0x0a, /* ip dst */
1091*4882a593Smuzhiyun 		  0xc2, 0x24,
1092*4882a593Smuzhiyun 		  0x00, 0x16 /* dst port */ },
1093*4882a593Smuzhiyun 		{ { 10, 0 }, { 30, 0 }, { 100, 65535 } },
1094*4882a593Smuzhiyun 	},
1095*4882a593Smuzhiyun 	{
1096*4882a593Smuzhiyun 		"RET_A",
1097*4882a593Smuzhiyun 		.u.insns = {
1098*4882a593Smuzhiyun 			/* check that unitialized X and A contain zeros */
1099*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
1100*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0)
1101*4882a593Smuzhiyun 		},
1102*4882a593Smuzhiyun 		CLASSIC,
1103*4882a593Smuzhiyun 		{ },
1104*4882a593Smuzhiyun 		{ {1, 0}, {2, 0} },
1105*4882a593Smuzhiyun 	},
1106*4882a593Smuzhiyun 	{
1107*4882a593Smuzhiyun 		"INT: ADD trivial",
1108*4882a593Smuzhiyun 		.u.insns_int = {
1109*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1110*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
1111*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1112*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1113*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, -1),
1114*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R1, 3),
1115*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R1),
1116*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1117*4882a593Smuzhiyun 		},
1118*4882a593Smuzhiyun 		INTERNAL,
1119*4882a593Smuzhiyun 		{ },
1120*4882a593Smuzhiyun 		{ { 0, 0xfffffffd } }
1121*4882a593Smuzhiyun 	},
1122*4882a593Smuzhiyun 	{
1123*4882a593Smuzhiyun 		"INT: MUL_X",
1124*4882a593Smuzhiyun 		.u.insns_int = {
1125*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1126*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1127*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 3),
1128*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1129*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 0xfffffffd, 1),
1130*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1131*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1132*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1133*4882a593Smuzhiyun 		},
1134*4882a593Smuzhiyun 		INTERNAL,
1135*4882a593Smuzhiyun 		{ },
1136*4882a593Smuzhiyun 		{ { 0, 1 } }
1137*4882a593Smuzhiyun 	},
1138*4882a593Smuzhiyun 	{
1139*4882a593Smuzhiyun 		"INT: MUL_X2",
1140*4882a593Smuzhiyun 		.u.insns_int = {
1141*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1142*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
1143*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1144*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1145*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1146*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 0x2ffffff, 1),
1147*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1148*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1149*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1150*4882a593Smuzhiyun 		},
1151*4882a593Smuzhiyun 		INTERNAL,
1152*4882a593Smuzhiyun 		{ },
1153*4882a593Smuzhiyun 		{ { 0, 1 } }
1154*4882a593Smuzhiyun 	},
1155*4882a593Smuzhiyun 	{
1156*4882a593Smuzhiyun 		"INT: MUL32_X",
1157*4882a593Smuzhiyun 		.u.insns_int = {
1158*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, -1),
1159*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1160*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R2, 3),
1161*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MUL, R1, R2),
1162*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R1, 8),
1163*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 0xffffff, 1),
1164*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1165*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
1166*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1167*4882a593Smuzhiyun 		},
1168*4882a593Smuzhiyun 		INTERNAL,
1169*4882a593Smuzhiyun 		{ },
1170*4882a593Smuzhiyun 		{ { 0, 1 } }
1171*4882a593Smuzhiyun 	},
1172*4882a593Smuzhiyun 	{
1173*4882a593Smuzhiyun 		/* Have to test all register combinations, since
1174*4882a593Smuzhiyun 		 * JITing of different registers will produce
1175*4882a593Smuzhiyun 		 * different asm code.
1176*4882a593Smuzhiyun 		 */
1177*4882a593Smuzhiyun 		"INT: ADD 64-bit",
1178*4882a593Smuzhiyun 		.u.insns_int = {
1179*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1180*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1181*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1182*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1183*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1184*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1185*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1186*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1187*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1188*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1189*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 20),
1190*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 20),
1191*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 20),
1192*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R3, 20),
1193*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R4, 20),
1194*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R5, 20),
1195*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R6, 20),
1196*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R7, 20),
1197*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R8, 20),
1198*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R9, 20),
1199*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1200*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1201*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1202*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1203*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1204*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1205*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1206*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1207*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1208*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1209*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1210*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1211*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1212*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1213*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1214*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1215*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1216*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1217*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1218*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1219*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1220*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1221*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R0),
1222*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R1),
1223*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R2),
1224*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R3),
1225*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R4),
1226*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R5),
1227*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R6),
1228*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R7),
1229*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R8),
1230*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1231*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1232*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1233*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R0),
1234*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R1),
1235*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R2),
1236*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R3),
1237*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R4),
1238*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R5),
1239*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R6),
1240*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R7),
1241*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R8),
1242*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1243*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1244*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1245*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R0),
1246*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R1),
1247*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R2),
1248*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R3),
1249*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R4),
1250*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R5),
1251*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R6),
1252*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R7),
1253*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R8),
1254*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1255*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1256*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1257*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R0),
1258*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R1),
1259*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R2),
1260*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R3),
1261*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R4),
1262*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R5),
1263*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R6),
1264*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R7),
1265*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R8),
1266*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1267*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1268*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1269*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R0),
1270*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R1),
1271*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R2),
1272*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R3),
1273*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R4),
1274*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R5),
1275*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R6),
1276*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R7),
1277*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R8),
1278*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1279*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1280*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1281*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R0),
1282*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R1),
1283*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R2),
1284*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R3),
1285*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R4),
1286*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R5),
1287*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R6),
1288*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R7),
1289*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R8),
1290*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1291*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1292*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1293*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R0),
1294*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R1),
1295*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R2),
1296*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R3),
1297*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R4),
1298*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R5),
1299*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R6),
1300*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R7),
1301*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R8),
1302*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1303*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1304*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1305*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R0),
1306*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R1),
1307*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R2),
1308*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R3),
1309*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R4),
1310*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R5),
1311*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R6),
1312*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R7),
1313*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R8),
1314*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1315*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1316*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1317*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R0),
1318*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R1),
1319*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R2),
1320*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R3),
1321*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R4),
1322*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R5),
1323*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R6),
1324*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R7),
1325*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R8),
1326*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1327*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R9),
1328*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1329*4882a593Smuzhiyun 		},
1330*4882a593Smuzhiyun 		INTERNAL,
1331*4882a593Smuzhiyun 		{ },
1332*4882a593Smuzhiyun 		{ { 0, 2957380 } }
1333*4882a593Smuzhiyun 	},
1334*4882a593Smuzhiyun 	{
1335*4882a593Smuzhiyun 		"INT: ADD 32-bit",
1336*4882a593Smuzhiyun 		.u.insns_int = {
1337*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 20),
1338*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
1339*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R2, 2),
1340*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R3, 3),
1341*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R4, 4),
1342*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R5, 5),
1343*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R6, 6),
1344*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R7, 7),
1345*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R8, 8),
1346*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R9, 9),
1347*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 10),
1348*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 10),
1349*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R3, 10),
1350*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R4, 10),
1351*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R5, 10),
1352*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R6, 10),
1353*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R7, 10),
1354*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R8, 10),
1355*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R9, 10),
1356*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1),
1357*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R2),
1358*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R3),
1359*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R4),
1360*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R5),
1361*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R6),
1362*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R7),
1363*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R8),
1364*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R9), /* R0 == 155 */
1365*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 155, 1),
1366*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1367*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R0),
1368*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R1),
1369*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R2),
1370*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R3),
1371*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R4),
1372*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R5),
1373*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R6),
1374*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R7),
1375*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R8),
1376*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R1, R9), /* R1 == 456 */
1377*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 456, 1),
1378*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1379*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R0),
1380*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R1),
1381*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R2),
1382*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R3),
1383*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R4),
1384*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R5),
1385*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R6),
1386*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R7),
1387*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R8),
1388*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R2, R9), /* R2 == 1358 */
1389*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R2, 1358, 1),
1390*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1391*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R0),
1392*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R1),
1393*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R2),
1394*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R3),
1395*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R4),
1396*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R5),
1397*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R6),
1398*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R7),
1399*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R8),
1400*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R3, R9), /* R3 == 4063 */
1401*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R3, 4063, 1),
1402*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1403*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R0),
1404*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R1),
1405*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R2),
1406*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R3),
1407*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R4),
1408*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R5),
1409*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R6),
1410*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R7),
1411*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R8),
1412*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R4, R9), /* R4 == 12177 */
1413*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R4, 12177, 1),
1414*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1415*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R0),
1416*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R1),
1417*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R2),
1418*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R3),
1419*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R4),
1420*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R5),
1421*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R6),
1422*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R7),
1423*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R8),
1424*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R5, R9), /* R5 == 36518 */
1425*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R5, 36518, 1),
1426*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1427*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R0),
1428*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R1),
1429*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R2),
1430*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R3),
1431*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R4),
1432*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R5),
1433*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R6),
1434*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R7),
1435*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R8),
1436*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R6, R9), /* R6 == 109540 */
1437*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R6, 109540, 1),
1438*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1439*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R0),
1440*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R1),
1441*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R2),
1442*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R3),
1443*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R4),
1444*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R5),
1445*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R6),
1446*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R7),
1447*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R8),
1448*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R7, R9), /* R7 == 328605 */
1449*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R7, 328605, 1),
1450*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1451*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R0),
1452*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R1),
1453*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R2),
1454*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R3),
1455*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R4),
1456*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R5),
1457*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R6),
1458*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R7),
1459*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R8),
1460*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R8, R9), /* R8 == 985799 */
1461*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R8, 985799, 1),
1462*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1463*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R0),
1464*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R1),
1465*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R2),
1466*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R3),
1467*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R4),
1468*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R5),
1469*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R6),
1470*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R7),
1471*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R8),
1472*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R9, R9), /* R9 == 2957380 */
1473*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MOV, R0, R9),
1474*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1475*4882a593Smuzhiyun 		},
1476*4882a593Smuzhiyun 		INTERNAL,
1477*4882a593Smuzhiyun 		{ },
1478*4882a593Smuzhiyun 		{ { 0, 2957380 } }
1479*4882a593Smuzhiyun 	},
1480*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1481*4882a593Smuzhiyun 		"INT: SUB",
1482*4882a593Smuzhiyun 		.u.insns_int = {
1483*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1484*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1485*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1486*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1487*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1488*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1489*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1490*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1491*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1492*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1493*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1494*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1495*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1496*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1497*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1498*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1499*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1500*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1501*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1502*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1503*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1504*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, -55, 1),
1505*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1506*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R0),
1507*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R2),
1508*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R3),
1509*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R4),
1510*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R5),
1511*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R6),
1512*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R7),
1513*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R8),
1514*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R9),
1515*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 10),
1516*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R0),
1517*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R1),
1518*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R3),
1519*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R4),
1520*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R5),
1521*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R6),
1522*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R7),
1523*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R8),
1524*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R9),
1525*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R2, 10),
1526*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R0),
1527*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R1),
1528*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R2),
1529*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R4),
1530*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R5),
1531*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R6),
1532*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R7),
1533*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R8),
1534*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R9),
1535*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R3, 10),
1536*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R0),
1537*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R1),
1538*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R2),
1539*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R3),
1540*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R5),
1541*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R6),
1542*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R7),
1543*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R8),
1544*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R9),
1545*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R4, 10),
1546*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R0),
1547*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R1),
1548*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R2),
1549*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R3),
1550*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R4),
1551*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R6),
1552*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R7),
1553*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R8),
1554*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R9),
1555*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R5, 10),
1556*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R0),
1557*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R1),
1558*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R2),
1559*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R3),
1560*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R4),
1561*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R5),
1562*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R7),
1563*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R8),
1564*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R9),
1565*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R6, 10),
1566*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R0),
1567*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R1),
1568*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R2),
1569*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R3),
1570*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R4),
1571*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R5),
1572*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R6),
1573*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R8),
1574*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R9),
1575*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R7, 10),
1576*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R0),
1577*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R1),
1578*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R2),
1579*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R3),
1580*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R4),
1581*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R5),
1582*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R6),
1583*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R7),
1584*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R9),
1585*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R8, 10),
1586*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R0),
1587*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R1),
1588*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R2),
1589*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R3),
1590*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R4),
1591*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R5),
1592*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R6),
1593*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R7),
1594*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R8),
1595*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R9, 10),
1596*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 10),
1597*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
1598*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
1599*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R2),
1600*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R3),
1601*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R4),
1602*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R5),
1603*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R6),
1604*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R7),
1605*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R8),
1606*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R9),
1607*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1608*4882a593Smuzhiyun 		},
1609*4882a593Smuzhiyun 		INTERNAL,
1610*4882a593Smuzhiyun 		{ },
1611*4882a593Smuzhiyun 		{ { 0, 11 } }
1612*4882a593Smuzhiyun 	},
1613*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1614*4882a593Smuzhiyun 		"INT: XOR",
1615*4882a593Smuzhiyun 		.u.insns_int = {
1616*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R0),
1617*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R1, R1),
1618*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R0, R1, 1),
1619*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1620*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1621*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1622*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1623*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R2, R2),
1624*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
1625*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1626*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R2, R2),
1627*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R3, R3),
1628*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 10),
1629*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, -1),
1630*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 1),
1631*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1632*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R3, R3),
1633*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R4, R4),
1634*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 1),
1635*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, -1),
1636*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R3, R4, 1),
1637*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1638*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R4, R4),
1639*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R5, R5),
1640*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R3, 1),
1641*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R7, -1),
1642*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R5, R4, 1),
1643*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1644*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, 1),
1645*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R5, R5),
1646*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R6, R6),
1647*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1648*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R8, -1),
1649*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R5, R6, 1),
1650*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1651*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R6, R6),
1652*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R7, R7),
1653*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R7, R6, 1),
1654*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1655*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R7, R7),
1656*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R8, R8),
1657*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R7, R8, 1),
1658*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1659*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R8, R8),
1660*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R9, R9),
1661*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R9, R8, 1),
1662*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1663*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R9, R9),
1664*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1665*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R9, R0, 1),
1666*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1667*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R1, R1),
1668*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R0, R0),
1669*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R9, R0, 2),
1670*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1671*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1672*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 1),
1673*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1674*4882a593Smuzhiyun 		},
1675*4882a593Smuzhiyun 		INTERNAL,
1676*4882a593Smuzhiyun 		{ },
1677*4882a593Smuzhiyun 		{ { 0, 1 } }
1678*4882a593Smuzhiyun 	},
1679*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1680*4882a593Smuzhiyun 		"INT: MUL",
1681*4882a593Smuzhiyun 		.u.insns_int = {
1682*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1683*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 1),
1684*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1685*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R3, 3),
1686*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R4, 4),
1687*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, 5),
1688*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R6, 6),
1689*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R7, 7),
1690*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R8, 8),
1691*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R9, 9),
1692*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R0),
1693*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R1),
1694*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R2),
1695*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R3),
1696*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R4),
1697*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R5),
1698*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R6),
1699*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R7),
1700*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R8),
1701*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R9),
1702*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R0, 10),
1703*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 439084800, 1),
1704*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1705*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R0),
1706*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R2),
1707*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R3),
1708*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R4),
1709*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R5),
1710*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R6),
1711*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R7),
1712*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R8),
1713*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R1, R9),
1714*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R1, 10),
1715*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R2, R1),
1716*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1717*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5a924, 1),
1718*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1719*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_LSH, R1, 32),
1720*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ARSH, R1, 32),
1721*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 0xebb90000, 1),
1722*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1723*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R0),
1724*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R1),
1725*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R3),
1726*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R4),
1727*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R5),
1728*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R6),
1729*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R7),
1730*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R8),
1731*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R2, R9),
1732*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R2, 10),
1733*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
1734*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R2),
1735*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1736*4882a593Smuzhiyun 		},
1737*4882a593Smuzhiyun 		INTERNAL,
1738*4882a593Smuzhiyun 		{ },
1739*4882a593Smuzhiyun 		{ { 0, 0x35d97ef2 } }
1740*4882a593Smuzhiyun 	},
1741*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1742*4882a593Smuzhiyun 		"MOV REG64",
1743*4882a593Smuzhiyun 		.u.insns_int = {
1744*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1745*4882a593Smuzhiyun 			BPF_MOV64_REG(R1, R0),
1746*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
1747*4882a593Smuzhiyun 			BPF_MOV64_REG(R3, R2),
1748*4882a593Smuzhiyun 			BPF_MOV64_REG(R4, R3),
1749*4882a593Smuzhiyun 			BPF_MOV64_REG(R5, R4),
1750*4882a593Smuzhiyun 			BPF_MOV64_REG(R6, R5),
1751*4882a593Smuzhiyun 			BPF_MOV64_REG(R7, R6),
1752*4882a593Smuzhiyun 			BPF_MOV64_REG(R8, R7),
1753*4882a593Smuzhiyun 			BPF_MOV64_REG(R9, R8),
1754*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
1755*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R1, 0),
1756*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 0),
1757*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R3, 0),
1758*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R4, 0),
1759*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R5, 0),
1760*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R6, 0),
1761*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R7, 0),
1762*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R8, 0),
1763*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R9, 0),
1764*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1765*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1766*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1767*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1768*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1769*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1770*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1771*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1772*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1773*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1774*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1775*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1776*4882a593Smuzhiyun 		},
1777*4882a593Smuzhiyun 		INTERNAL,
1778*4882a593Smuzhiyun 		{ },
1779*4882a593Smuzhiyun 		{ { 0, 0xfefe } }
1780*4882a593Smuzhiyun 	},
1781*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1782*4882a593Smuzhiyun 		"MOV REG32",
1783*4882a593Smuzhiyun 		.u.insns_int = {
1784*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1785*4882a593Smuzhiyun 			BPF_MOV64_REG(R1, R0),
1786*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
1787*4882a593Smuzhiyun 			BPF_MOV64_REG(R3, R2),
1788*4882a593Smuzhiyun 			BPF_MOV64_REG(R4, R3),
1789*4882a593Smuzhiyun 			BPF_MOV64_REG(R5, R4),
1790*4882a593Smuzhiyun 			BPF_MOV64_REG(R6, R5),
1791*4882a593Smuzhiyun 			BPF_MOV64_REG(R7, R6),
1792*4882a593Smuzhiyun 			BPF_MOV64_REG(R8, R7),
1793*4882a593Smuzhiyun 			BPF_MOV64_REG(R9, R8),
1794*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
1795*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0),
1796*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R2, 0),
1797*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R3, 0),
1798*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R4, 0),
1799*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R5, 0),
1800*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R6, 0),
1801*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R7, 0),
1802*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R8, 0),
1803*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R9, 0),
1804*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1805*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1806*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1807*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1808*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1809*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1810*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1811*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1812*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1813*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1814*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1815*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1816*4882a593Smuzhiyun 		},
1817*4882a593Smuzhiyun 		INTERNAL,
1818*4882a593Smuzhiyun 		{ },
1819*4882a593Smuzhiyun 		{ { 0, 0xfefe } }
1820*4882a593Smuzhiyun 	},
1821*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
1822*4882a593Smuzhiyun 		"LD IMM64",
1823*4882a593Smuzhiyun 		.u.insns_int = {
1824*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffLL),
1825*4882a593Smuzhiyun 			BPF_MOV64_REG(R1, R0),
1826*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
1827*4882a593Smuzhiyun 			BPF_MOV64_REG(R3, R2),
1828*4882a593Smuzhiyun 			BPF_MOV64_REG(R4, R3),
1829*4882a593Smuzhiyun 			BPF_MOV64_REG(R5, R4),
1830*4882a593Smuzhiyun 			BPF_MOV64_REG(R6, R5),
1831*4882a593Smuzhiyun 			BPF_MOV64_REG(R7, R6),
1832*4882a593Smuzhiyun 			BPF_MOV64_REG(R8, R7),
1833*4882a593Smuzhiyun 			BPF_MOV64_REG(R9, R8),
1834*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0LL),
1835*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0x0LL),
1836*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0LL),
1837*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0LL),
1838*4882a593Smuzhiyun 			BPF_LD_IMM64(R4, 0x0LL),
1839*4882a593Smuzhiyun 			BPF_LD_IMM64(R5, 0x0LL),
1840*4882a593Smuzhiyun 			BPF_LD_IMM64(R6, 0x0LL),
1841*4882a593Smuzhiyun 			BPF_LD_IMM64(R7, 0x0LL),
1842*4882a593Smuzhiyun 			BPF_LD_IMM64(R8, 0x0LL),
1843*4882a593Smuzhiyun 			BPF_LD_IMM64(R9, 0x0LL),
1844*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R0),
1845*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
1846*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R2),
1847*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R3),
1848*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R4),
1849*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R5),
1850*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R6),
1851*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R7),
1852*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R8),
1853*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R9),
1854*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 0xfefe),
1855*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1856*4882a593Smuzhiyun 		},
1857*4882a593Smuzhiyun 		INTERNAL,
1858*4882a593Smuzhiyun 		{ },
1859*4882a593Smuzhiyun 		{ { 0, 0xfefe } }
1860*4882a593Smuzhiyun 	},
1861*4882a593Smuzhiyun 	{
1862*4882a593Smuzhiyun 		"INT: ALU MIX",
1863*4882a593Smuzhiyun 		.u.insns_int = {
1864*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 11),
1865*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, -1),
1866*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 2),
1867*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R2, 3),
1868*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_DIV, R0, R2),
1869*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 10, 1),
1870*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1871*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOD, R0, 3),
1872*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 1, 1),
1873*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1874*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, -1),
1875*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1876*4882a593Smuzhiyun 		},
1877*4882a593Smuzhiyun 		INTERNAL,
1878*4882a593Smuzhiyun 		{ },
1879*4882a593Smuzhiyun 		{ { 0, -1 } }
1880*4882a593Smuzhiyun 	},
1881*4882a593Smuzhiyun 	{
1882*4882a593Smuzhiyun 		"INT: shifts by register",
1883*4882a593Smuzhiyun 		.u.insns_int = {
1884*4882a593Smuzhiyun 			BPF_MOV64_IMM(R0, -1234),
1885*4882a593Smuzhiyun 			BPF_MOV64_IMM(R1, 1),
1886*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_RSH, R0, R1),
1887*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 0x7ffffd97, 1),
1888*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1889*4882a593Smuzhiyun 			BPF_MOV64_IMM(R2, 1),
1890*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R0, R2),
1891*4882a593Smuzhiyun 			BPF_MOV32_IMM(R4, -1234),
1892*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R0, R4, 1),
1893*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1894*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R4, 63),
1895*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R0, R4), /* R0 <= 46 */
1896*4882a593Smuzhiyun 			BPF_MOV64_IMM(R3, 47),
1897*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ARSH, R0, R3),
1898*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, -617, 1),
1899*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1900*4882a593Smuzhiyun 			BPF_MOV64_IMM(R2, 1),
1901*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R4, R2), /* R4 = 46 << 1 */
1902*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R4, 92, 1),
1903*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1904*4882a593Smuzhiyun 			BPF_MOV64_IMM(R4, 4),
1905*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R4, R4), /* R4 = 4 << 4 */
1906*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R4, 64, 1),
1907*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1908*4882a593Smuzhiyun 			BPF_MOV64_IMM(R4, 5),
1909*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_LSH, R4, R4), /* R4 = 5 << 5 */
1910*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R4, 160, 1),
1911*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1912*4882a593Smuzhiyun 			BPF_MOV64_IMM(R0, -1),
1913*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
1914*4882a593Smuzhiyun 		},
1915*4882a593Smuzhiyun 		INTERNAL,
1916*4882a593Smuzhiyun 		{ },
1917*4882a593Smuzhiyun 		{ { 0, -1 } }
1918*4882a593Smuzhiyun 	},
1919*4882a593Smuzhiyun 	{
1920*4882a593Smuzhiyun 		"check: missing ret",
1921*4882a593Smuzhiyun 		.u.insns = {
1922*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 1),
1923*4882a593Smuzhiyun 		},
1924*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1925*4882a593Smuzhiyun 		{ },
1926*4882a593Smuzhiyun 		{ },
1927*4882a593Smuzhiyun 		.fill_helper = NULL,
1928*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
1929*4882a593Smuzhiyun 	},
1930*4882a593Smuzhiyun 	{
1931*4882a593Smuzhiyun 		"check: div_k_0",
1932*4882a593Smuzhiyun 		.u.insns = {
1933*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0),
1934*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0)
1935*4882a593Smuzhiyun 		},
1936*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1937*4882a593Smuzhiyun 		{ },
1938*4882a593Smuzhiyun 		{ },
1939*4882a593Smuzhiyun 		.fill_helper = NULL,
1940*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
1941*4882a593Smuzhiyun 	},
1942*4882a593Smuzhiyun 	{
1943*4882a593Smuzhiyun 		"check: unknown insn",
1944*4882a593Smuzhiyun 		.u.insns = {
1945*4882a593Smuzhiyun 			/* seccomp insn, rejected in socket filter */
1946*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_W | BPF_ABS, 0),
1947*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0)
1948*4882a593Smuzhiyun 		},
1949*4882a593Smuzhiyun 		CLASSIC | FLAG_EXPECTED_FAIL,
1950*4882a593Smuzhiyun 		{ },
1951*4882a593Smuzhiyun 		{ },
1952*4882a593Smuzhiyun 		.fill_helper = NULL,
1953*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
1954*4882a593Smuzhiyun 	},
1955*4882a593Smuzhiyun 	{
1956*4882a593Smuzhiyun 		"check: out of range spill/fill",
1957*4882a593Smuzhiyun 		.u.insns = {
1958*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 16),
1959*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0)
1960*4882a593Smuzhiyun 		},
1961*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
1962*4882a593Smuzhiyun 		{ },
1963*4882a593Smuzhiyun 		{ },
1964*4882a593Smuzhiyun 		.fill_helper = NULL,
1965*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
1966*4882a593Smuzhiyun 	},
1967*4882a593Smuzhiyun 	{
1968*4882a593Smuzhiyun 		"JUMPS + HOLES",
1969*4882a593Smuzhiyun 		.u.insns = {
1970*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1971*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 15),
1972*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1973*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1974*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1975*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1976*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1977*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1978*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1979*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1980*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1981*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1982*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1983*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1984*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1985*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 3, 4),
1986*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1987*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90c2894d, 1, 2),
1988*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1989*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
1990*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
1991*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1992*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1993*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1994*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1995*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1996*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1997*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1998*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
1999*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2000*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2001*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2002*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2003*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2004*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 2, 3),
2005*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x2ac28349, 1, 2),
2006*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2007*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 14, 15),
2008*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JGE, 0, 13, 14),
2009*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2010*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2011*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2012*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2013*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2014*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2015*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2016*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2017*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2018*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2019*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2020*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2021*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2022*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 2, 3),
2023*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ, 0x90d2ff41, 1, 2),
2024*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_H | BPF_ABS, 0),
2025*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0),
2026*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0),
2027*4882a593Smuzhiyun 		},
2028*4882a593Smuzhiyun 		CLASSIC,
2029*4882a593Smuzhiyun 		{ 0x00, 0x1b, 0x21, 0x3c, 0x9d, 0xf8,
2030*4882a593Smuzhiyun 		  0x90, 0xe2, 0xba, 0x0a, 0x56, 0xb4,
2031*4882a593Smuzhiyun 		  0x08, 0x00,
2032*4882a593Smuzhiyun 		  0x45, 0x00, 0x00, 0x28, 0x00, 0x00,
2033*4882a593Smuzhiyun 		  0x20, 0x00, 0x40, 0x11, 0x00, 0x00, /* IP header */
2034*4882a593Smuzhiyun 		  0xc0, 0xa8, 0x33, 0x01,
2035*4882a593Smuzhiyun 		  0xc0, 0xa8, 0x33, 0x02,
2036*4882a593Smuzhiyun 		  0xbb, 0xb6,
2037*4882a593Smuzhiyun 		  0xa9, 0xfa,
2038*4882a593Smuzhiyun 		  0x00, 0x14, 0x00, 0x00,
2039*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2040*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2041*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2042*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2043*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2044*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2045*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
2046*4882a593Smuzhiyun 		  0xcc, 0xcc, 0xcc, 0xcc },
2047*4882a593Smuzhiyun 		{ { 88, 0x001b } }
2048*4882a593Smuzhiyun 	},
2049*4882a593Smuzhiyun 	{
2050*4882a593Smuzhiyun 		"check: RET X",
2051*4882a593Smuzhiyun 		.u.insns = {
2052*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_X, 0),
2053*4882a593Smuzhiyun 		},
2054*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2055*4882a593Smuzhiyun 		{ },
2056*4882a593Smuzhiyun 		{ },
2057*4882a593Smuzhiyun 		.fill_helper = NULL,
2058*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
2059*4882a593Smuzhiyun 	},
2060*4882a593Smuzhiyun 	{
2061*4882a593Smuzhiyun 		"check: LDX + RET X",
2062*4882a593Smuzhiyun 		.u.insns = {
2063*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 42),
2064*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_X, 0),
2065*4882a593Smuzhiyun 		},
2066*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2067*4882a593Smuzhiyun 		{ },
2068*4882a593Smuzhiyun 		{ },
2069*4882a593Smuzhiyun 		.fill_helper = NULL,
2070*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
2071*4882a593Smuzhiyun 	},
2072*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
2073*4882a593Smuzhiyun 		"M[]: alt STX + LDX",
2074*4882a593Smuzhiyun 		.u.insns = {
2075*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 100),
2076*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 0),
2077*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2078*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2079*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2080*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2081*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 1),
2082*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2083*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2084*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2085*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2086*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 2),
2087*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2088*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2089*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2090*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2091*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 3),
2092*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2093*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2094*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2095*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2096*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 4),
2097*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2098*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2099*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2100*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2101*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 5),
2102*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2103*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2104*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2105*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2106*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 6),
2107*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2108*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2109*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2110*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2111*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 7),
2112*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2113*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2114*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2115*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2116*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 8),
2117*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2118*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2119*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2120*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2121*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 9),
2122*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2123*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2124*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2125*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2126*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 10),
2127*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2128*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2129*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2130*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2131*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 11),
2132*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2133*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2134*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2135*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2136*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 12),
2137*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2138*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2139*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2140*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2141*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 13),
2142*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2143*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2144*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2145*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2146*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 14),
2147*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2148*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2149*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2150*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2151*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 15),
2152*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2153*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2154*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 1),
2155*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
2156*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0),
2157*4882a593Smuzhiyun 		},
2158*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
2159*4882a593Smuzhiyun 		{ },
2160*4882a593Smuzhiyun 		{ { 0, 116 } },
2161*4882a593Smuzhiyun 	},
2162*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
2163*4882a593Smuzhiyun 		"M[]: full STX + full LDX",
2164*4882a593Smuzhiyun 		.u.insns = {
2165*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbadfeedb),
2166*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 0),
2167*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xecabedae),
2168*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 1),
2169*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xafccfeaf),
2170*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 2),
2171*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbffdcedc),
2172*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 3),
2173*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbbbdccb),
2174*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 4),
2175*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfbabcbda),
2176*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 5),
2177*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaedecbdb),
2178*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 6),
2179*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xadebbade),
2180*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 7),
2181*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfcfcfaec),
2182*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 8),
2183*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbcdddbdc),
2184*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 9),
2185*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfeefdfac),
2186*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 10),
2187*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xcddcdeea),
2188*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 11),
2189*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaccfaebb),
2190*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 12),
2191*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xbdcccdcf),
2192*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 13),
2193*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xaaedecde),
2194*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 14),
2195*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0xfaeacdad),
2196*4882a593Smuzhiyun 			BPF_STMT(BPF_STX, 15),
2197*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 0),
2198*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
2199*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 1),
2200*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2201*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 2),
2202*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2203*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 3),
2204*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2205*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 4),
2206*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2207*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 5),
2208*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2209*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 6),
2210*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2211*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 7),
2212*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2213*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 8),
2214*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2215*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 9),
2216*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2217*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 10),
2218*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2219*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 11),
2220*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2221*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 12),
2222*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2223*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 13),
2224*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2225*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 14),
2226*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2227*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_MEM, 15),
2228*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
2229*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0),
2230*4882a593Smuzhiyun 		},
2231*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
2232*4882a593Smuzhiyun 		{ },
2233*4882a593Smuzhiyun 		{ { 0, 0x2a5a5e5 } },
2234*4882a593Smuzhiyun 	},
2235*4882a593Smuzhiyun 	{
2236*4882a593Smuzhiyun 		"check: SKF_AD_MAX",
2237*4882a593Smuzhiyun 		.u.insns = {
2238*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2239*4882a593Smuzhiyun 				 SKF_AD_OFF + SKF_AD_MAX),
2240*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0),
2241*4882a593Smuzhiyun 		},
2242*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
2243*4882a593Smuzhiyun 		{ },
2244*4882a593Smuzhiyun 		{ },
2245*4882a593Smuzhiyun 		.fill_helper = NULL,
2246*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
2247*4882a593Smuzhiyun 	},
2248*4882a593Smuzhiyun 	{	/* Passes checker but fails during runtime. */
2249*4882a593Smuzhiyun 		"LD [SKF_AD_OFF-1]",
2250*4882a593Smuzhiyun 		.u.insns = {
2251*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_W | BPF_ABS,
2252*4882a593Smuzhiyun 				 SKF_AD_OFF - 1),
2253*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
2254*4882a593Smuzhiyun 		},
2255*4882a593Smuzhiyun 		CLASSIC,
2256*4882a593Smuzhiyun 		{ },
2257*4882a593Smuzhiyun 		{ { 1, 0 } },
2258*4882a593Smuzhiyun 	},
2259*4882a593Smuzhiyun 	{
2260*4882a593Smuzhiyun 		"load 64-bit immediate",
2261*4882a593Smuzhiyun 		.u.insns_int = {
2262*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0x567800001234LL),
2263*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
2264*4882a593Smuzhiyun 			BPF_MOV64_REG(R3, R2),
2265*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R2, 32),
2266*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_LSH, R3, 32),
2267*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R3, 32),
2268*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 0),
2269*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R2, 0x5678, 1),
2270*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2271*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R3, 0x1234, 1),
2272*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2273*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x1ffffffffLL),
2274*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R0, 32), /* R0 = 1 */
2275*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2276*4882a593Smuzhiyun 		},
2277*4882a593Smuzhiyun 		INTERNAL,
2278*4882a593Smuzhiyun 		{ },
2279*4882a593Smuzhiyun 		{ { 0, 1 } }
2280*4882a593Smuzhiyun 	},
2281*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MOV | BPF_X */
2282*4882a593Smuzhiyun 	{
2283*4882a593Smuzhiyun 		"ALU_MOV_X: dst = 2",
2284*4882a593Smuzhiyun 		.u.insns_int = {
2285*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2286*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2287*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2288*4882a593Smuzhiyun 		},
2289*4882a593Smuzhiyun 		INTERNAL,
2290*4882a593Smuzhiyun 		{ },
2291*4882a593Smuzhiyun 		{ { 0, 2 } },
2292*4882a593Smuzhiyun 	},
2293*4882a593Smuzhiyun 	{
2294*4882a593Smuzhiyun 		"ALU_MOV_X: dst = 4294967295",
2295*4882a593Smuzhiyun 		.u.insns_int = {
2296*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2297*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MOV, R0, R1),
2298*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2299*4882a593Smuzhiyun 		},
2300*4882a593Smuzhiyun 		INTERNAL,
2301*4882a593Smuzhiyun 		{ },
2302*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2303*4882a593Smuzhiyun 	},
2304*4882a593Smuzhiyun 	{
2305*4882a593Smuzhiyun 		"ALU64_MOV_X: dst = 2",
2306*4882a593Smuzhiyun 		.u.insns_int = {
2307*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2308*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2309*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2310*4882a593Smuzhiyun 		},
2311*4882a593Smuzhiyun 		INTERNAL,
2312*4882a593Smuzhiyun 		{ },
2313*4882a593Smuzhiyun 		{ { 0, 2 } },
2314*4882a593Smuzhiyun 	},
2315*4882a593Smuzhiyun 	{
2316*4882a593Smuzhiyun 		"ALU64_MOV_X: dst = 4294967295",
2317*4882a593Smuzhiyun 		.u.insns_int = {
2318*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
2319*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R1),
2320*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2321*4882a593Smuzhiyun 		},
2322*4882a593Smuzhiyun 		INTERNAL,
2323*4882a593Smuzhiyun 		{ },
2324*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2325*4882a593Smuzhiyun 	},
2326*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MOV | BPF_K */
2327*4882a593Smuzhiyun 	{
2328*4882a593Smuzhiyun 		"ALU_MOV_K: dst = 2",
2329*4882a593Smuzhiyun 		.u.insns_int = {
2330*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
2331*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2332*4882a593Smuzhiyun 		},
2333*4882a593Smuzhiyun 		INTERNAL,
2334*4882a593Smuzhiyun 		{ },
2335*4882a593Smuzhiyun 		{ { 0, 2 } },
2336*4882a593Smuzhiyun 	},
2337*4882a593Smuzhiyun 	{
2338*4882a593Smuzhiyun 		"ALU_MOV_K: dst = 4294967295",
2339*4882a593Smuzhiyun 		.u.insns_int = {
2340*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 4294967295U),
2341*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2342*4882a593Smuzhiyun 		},
2343*4882a593Smuzhiyun 		INTERNAL,
2344*4882a593Smuzhiyun 		{ },
2345*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2346*4882a593Smuzhiyun 	},
2347*4882a593Smuzhiyun 	{
2348*4882a593Smuzhiyun 		"ALU_MOV_K: 0x0000ffffffff0000 = 0x00000000ffffffff",
2349*4882a593Smuzhiyun 		.u.insns_int = {
2350*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2351*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x00000000ffffffffLL),
2352*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R2, 0xffffffff),
2353*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2354*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2355*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2356*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2357*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2358*4882a593Smuzhiyun 		},
2359*4882a593Smuzhiyun 		INTERNAL,
2360*4882a593Smuzhiyun 		{ },
2361*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2362*4882a593Smuzhiyun 	},
2363*4882a593Smuzhiyun 	{
2364*4882a593Smuzhiyun 		"ALU64_MOV_K: dst = 2",
2365*4882a593Smuzhiyun 		.u.insns_int = {
2366*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 2),
2367*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2368*4882a593Smuzhiyun 		},
2369*4882a593Smuzhiyun 		INTERNAL,
2370*4882a593Smuzhiyun 		{ },
2371*4882a593Smuzhiyun 		{ { 0, 2 } },
2372*4882a593Smuzhiyun 	},
2373*4882a593Smuzhiyun 	{
2374*4882a593Smuzhiyun 		"ALU64_MOV_K: dst = 2147483647",
2375*4882a593Smuzhiyun 		.u.insns_int = {
2376*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R0, 2147483647),
2377*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2378*4882a593Smuzhiyun 		},
2379*4882a593Smuzhiyun 		INTERNAL,
2380*4882a593Smuzhiyun 		{ },
2381*4882a593Smuzhiyun 		{ { 0, 2147483647 } },
2382*4882a593Smuzhiyun 	},
2383*4882a593Smuzhiyun 	{
2384*4882a593Smuzhiyun 		"ALU64_OR_K: dst = 0x0",
2385*4882a593Smuzhiyun 		.u.insns_int = {
2386*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2387*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0),
2388*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 0x0),
2389*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2390*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2391*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2392*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2393*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2394*4882a593Smuzhiyun 		},
2395*4882a593Smuzhiyun 		INTERNAL,
2396*4882a593Smuzhiyun 		{ },
2397*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2398*4882a593Smuzhiyun 	},
2399*4882a593Smuzhiyun 	{
2400*4882a593Smuzhiyun 		"ALU64_MOV_K: dst = -1",
2401*4882a593Smuzhiyun 		.u.insns_int = {
2402*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
2403*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2404*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOV, R2, 0xffffffff),
2405*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2406*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2407*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2408*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2409*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2410*4882a593Smuzhiyun 		},
2411*4882a593Smuzhiyun 		INTERNAL,
2412*4882a593Smuzhiyun 		{ },
2413*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2414*4882a593Smuzhiyun 	},
2415*4882a593Smuzhiyun 	/* BPF_ALU | BPF_ADD | BPF_X */
2416*4882a593Smuzhiyun 	{
2417*4882a593Smuzhiyun 		"ALU_ADD_X: 1 + 2 = 3",
2418*4882a593Smuzhiyun 		.u.insns_int = {
2419*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2420*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2421*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2422*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2423*4882a593Smuzhiyun 		},
2424*4882a593Smuzhiyun 		INTERNAL,
2425*4882a593Smuzhiyun 		{ },
2426*4882a593Smuzhiyun 		{ { 0, 3 } },
2427*4882a593Smuzhiyun 	},
2428*4882a593Smuzhiyun 	{
2429*4882a593Smuzhiyun 		"ALU_ADD_X: 1 + 4294967294 = 4294967295",
2430*4882a593Smuzhiyun 		.u.insns_int = {
2431*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2432*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2433*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2434*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2435*4882a593Smuzhiyun 		},
2436*4882a593Smuzhiyun 		INTERNAL,
2437*4882a593Smuzhiyun 		{ },
2438*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2439*4882a593Smuzhiyun 	},
2440*4882a593Smuzhiyun 	{
2441*4882a593Smuzhiyun 		"ALU_ADD_X: 2 + 4294967294 = 0",
2442*4882a593Smuzhiyun 		.u.insns_int = {
2443*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2444*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 4294967294U),
2445*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1),
2446*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2447*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2448*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2449*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2450*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2451*4882a593Smuzhiyun 		},
2452*4882a593Smuzhiyun 		INTERNAL,
2453*4882a593Smuzhiyun 		{ },
2454*4882a593Smuzhiyun 		{ { 0, 1 } },
2455*4882a593Smuzhiyun 	},
2456*4882a593Smuzhiyun 	{
2457*4882a593Smuzhiyun 		"ALU64_ADD_X: 1 + 2 = 3",
2458*4882a593Smuzhiyun 		.u.insns_int = {
2459*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2460*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
2461*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2462*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2463*4882a593Smuzhiyun 		},
2464*4882a593Smuzhiyun 		INTERNAL,
2465*4882a593Smuzhiyun 		{ },
2466*4882a593Smuzhiyun 		{ { 0, 3 } },
2467*4882a593Smuzhiyun 	},
2468*4882a593Smuzhiyun 	{
2469*4882a593Smuzhiyun 		"ALU64_ADD_X: 1 + 4294967294 = 4294967295",
2470*4882a593Smuzhiyun 		.u.insns_int = {
2471*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2472*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2473*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2474*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2475*4882a593Smuzhiyun 		},
2476*4882a593Smuzhiyun 		INTERNAL,
2477*4882a593Smuzhiyun 		{ },
2478*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2479*4882a593Smuzhiyun 	},
2480*4882a593Smuzhiyun 	{
2481*4882a593Smuzhiyun 		"ALU64_ADD_X: 2 + 4294967294 = 4294967296",
2482*4882a593Smuzhiyun 		.u.insns_int = {
2483*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2484*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 4294967294U),
2485*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 4294967296ULL),
2486*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ADD, R0, R1),
2487*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R0, R2, 2),
2488*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 0),
2489*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2490*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2491*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2492*4882a593Smuzhiyun 		},
2493*4882a593Smuzhiyun 		INTERNAL,
2494*4882a593Smuzhiyun 		{ },
2495*4882a593Smuzhiyun 		{ { 0, 1 } },
2496*4882a593Smuzhiyun 	},
2497*4882a593Smuzhiyun 	/* BPF_ALU | BPF_ADD | BPF_K */
2498*4882a593Smuzhiyun 	{
2499*4882a593Smuzhiyun 		"ALU_ADD_K: 1 + 2 = 3",
2500*4882a593Smuzhiyun 		.u.insns_int = {
2501*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2502*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2503*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2504*4882a593Smuzhiyun 		},
2505*4882a593Smuzhiyun 		INTERNAL,
2506*4882a593Smuzhiyun 		{ },
2507*4882a593Smuzhiyun 		{ { 0, 3 } },
2508*4882a593Smuzhiyun 	},
2509*4882a593Smuzhiyun 	{
2510*4882a593Smuzhiyun 		"ALU_ADD_K: 3 + 0 = 3",
2511*4882a593Smuzhiyun 		.u.insns_int = {
2512*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2513*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R0, 0),
2514*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2515*4882a593Smuzhiyun 		},
2516*4882a593Smuzhiyun 		INTERNAL,
2517*4882a593Smuzhiyun 		{ },
2518*4882a593Smuzhiyun 		{ { 0, 3 } },
2519*4882a593Smuzhiyun 	},
2520*4882a593Smuzhiyun 	{
2521*4882a593Smuzhiyun 		"ALU_ADD_K: 1 + 4294967294 = 4294967295",
2522*4882a593Smuzhiyun 		.u.insns_int = {
2523*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2524*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R0, 4294967294U),
2525*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2526*4882a593Smuzhiyun 		},
2527*4882a593Smuzhiyun 		INTERNAL,
2528*4882a593Smuzhiyun 		{ },
2529*4882a593Smuzhiyun 		{ { 0, 4294967295U } },
2530*4882a593Smuzhiyun 	},
2531*4882a593Smuzhiyun 	{
2532*4882a593Smuzhiyun 		"ALU_ADD_K: 4294967294 + 2 = 0",
2533*4882a593Smuzhiyun 		.u.insns_int = {
2534*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967294U),
2535*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R0, 2),
2536*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R0, 0, 2),
2537*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2538*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2539*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2540*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2541*4882a593Smuzhiyun 		},
2542*4882a593Smuzhiyun 		INTERNAL,
2543*4882a593Smuzhiyun 		{ },
2544*4882a593Smuzhiyun 		{ { 0, 1 } },
2545*4882a593Smuzhiyun 	},
2546*4882a593Smuzhiyun 	{
2547*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + (-1) = 0x00000000ffffffff",
2548*4882a593Smuzhiyun 		.u.insns_int = {
2549*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2550*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
2551*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffffffff),
2552*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2553*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2554*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2555*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2556*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2557*4882a593Smuzhiyun 		},
2558*4882a593Smuzhiyun 		INTERNAL,
2559*4882a593Smuzhiyun 		{ },
2560*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2561*4882a593Smuzhiyun 	},
2562*4882a593Smuzhiyun 	{
2563*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + 0xffff = 0xffff",
2564*4882a593Smuzhiyun 		.u.insns_int = {
2565*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2566*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffff),
2567*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R2, 0xffff),
2568*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2569*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2570*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2571*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2572*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2573*4882a593Smuzhiyun 		},
2574*4882a593Smuzhiyun 		INTERNAL,
2575*4882a593Smuzhiyun 		{ },
2576*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2577*4882a593Smuzhiyun 	},
2578*4882a593Smuzhiyun 	{
2579*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2580*4882a593Smuzhiyun 		.u.insns_int = {
2581*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2582*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x7fffffff),
2583*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R2, 0x7fffffff),
2584*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2585*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2586*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2587*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2588*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2589*4882a593Smuzhiyun 		},
2590*4882a593Smuzhiyun 		INTERNAL,
2591*4882a593Smuzhiyun 		{ },
2592*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2593*4882a593Smuzhiyun 	},
2594*4882a593Smuzhiyun 	{
2595*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + 0x80000000 = 0x80000000",
2596*4882a593Smuzhiyun 		.u.insns_int = {
2597*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2598*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x80000000),
2599*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80000000),
2600*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2601*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2602*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2603*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2604*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2605*4882a593Smuzhiyun 		},
2606*4882a593Smuzhiyun 		INTERNAL,
2607*4882a593Smuzhiyun 		{ },
2608*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2609*4882a593Smuzhiyun 	},
2610*4882a593Smuzhiyun 	{
2611*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + 0x80008000 = 0x80008000",
2612*4882a593Smuzhiyun 		.u.insns_int = {
2613*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2614*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x80008000),
2615*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_ADD, R2, 0x80008000),
2616*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2617*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2618*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2619*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2620*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2621*4882a593Smuzhiyun 		},
2622*4882a593Smuzhiyun 		INTERNAL,
2623*4882a593Smuzhiyun 		{ },
2624*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2625*4882a593Smuzhiyun 	},
2626*4882a593Smuzhiyun 	{
2627*4882a593Smuzhiyun 		"ALU64_ADD_K: 1 + 2 = 3",
2628*4882a593Smuzhiyun 		.u.insns_int = {
2629*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2630*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2631*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2632*4882a593Smuzhiyun 		},
2633*4882a593Smuzhiyun 		INTERNAL,
2634*4882a593Smuzhiyun 		{ },
2635*4882a593Smuzhiyun 		{ { 0, 3 } },
2636*4882a593Smuzhiyun 	},
2637*4882a593Smuzhiyun 	{
2638*4882a593Smuzhiyun 		"ALU64_ADD_K: 3 + 0 = 3",
2639*4882a593Smuzhiyun 		.u.insns_int = {
2640*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2641*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 0),
2642*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2643*4882a593Smuzhiyun 		},
2644*4882a593Smuzhiyun 		INTERNAL,
2645*4882a593Smuzhiyun 		{ },
2646*4882a593Smuzhiyun 		{ { 0, 3 } },
2647*4882a593Smuzhiyun 	},
2648*4882a593Smuzhiyun 	{
2649*4882a593Smuzhiyun 		"ALU64_ADD_K: 1 + 2147483646 = 2147483647",
2650*4882a593Smuzhiyun 		.u.insns_int = {
2651*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2652*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 2147483646),
2653*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2654*4882a593Smuzhiyun 		},
2655*4882a593Smuzhiyun 		INTERNAL,
2656*4882a593Smuzhiyun 		{ },
2657*4882a593Smuzhiyun 		{ { 0, 2147483647 } },
2658*4882a593Smuzhiyun 	},
2659*4882a593Smuzhiyun 	{
2660*4882a593Smuzhiyun 		"ALU64_ADD_K: 4294967294 + 2 = 4294967296",
2661*4882a593Smuzhiyun 		.u.insns_int = {
2662*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967294U),
2663*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 4294967296ULL),
2664*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, 2),
2665*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R0, R1, 2),
2666*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
2667*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2668*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
2669*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2670*4882a593Smuzhiyun 		},
2671*4882a593Smuzhiyun 		INTERNAL,
2672*4882a593Smuzhiyun 		{ },
2673*4882a593Smuzhiyun 		{ { 0, 1 } },
2674*4882a593Smuzhiyun 	},
2675*4882a593Smuzhiyun 	{
2676*4882a593Smuzhiyun 		"ALU64_ADD_K: 2147483646 + -2147483647 = -1",
2677*4882a593Smuzhiyun 		.u.insns_int = {
2678*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483646),
2679*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R0, -2147483647),
2680*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2681*4882a593Smuzhiyun 		},
2682*4882a593Smuzhiyun 		INTERNAL,
2683*4882a593Smuzhiyun 		{ },
2684*4882a593Smuzhiyun 		{ { 0, -1 } },
2685*4882a593Smuzhiyun 	},
2686*4882a593Smuzhiyun 	{
2687*4882a593Smuzhiyun 		"ALU64_ADD_K: 1 + 0 = 1",
2688*4882a593Smuzhiyun 		.u.insns_int = {
2689*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x1),
2690*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x1),
2691*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0x0),
2692*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2693*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2694*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2695*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2696*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2697*4882a593Smuzhiyun 		},
2698*4882a593Smuzhiyun 		INTERNAL,
2699*4882a593Smuzhiyun 		{ },
2700*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2701*4882a593Smuzhiyun 	},
2702*4882a593Smuzhiyun 	{
2703*4882a593Smuzhiyun 		"ALU64_ADD_K: 0 + (-1) = 0xffffffffffffffff",
2704*4882a593Smuzhiyun 		.u.insns_int = {
2705*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2706*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
2707*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffffffff),
2708*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2709*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2710*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2711*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2712*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2713*4882a593Smuzhiyun 		},
2714*4882a593Smuzhiyun 		INTERNAL,
2715*4882a593Smuzhiyun 		{ },
2716*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2717*4882a593Smuzhiyun 	},
2718*4882a593Smuzhiyun 	{
2719*4882a593Smuzhiyun 		"ALU64_ADD_K: 0 + 0xffff = 0xffff",
2720*4882a593Smuzhiyun 		.u.insns_int = {
2721*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2722*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffff),
2723*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0xffff),
2724*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2725*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2726*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2727*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2728*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2729*4882a593Smuzhiyun 		},
2730*4882a593Smuzhiyun 		INTERNAL,
2731*4882a593Smuzhiyun 		{ },
2732*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2733*4882a593Smuzhiyun 	},
2734*4882a593Smuzhiyun 	{
2735*4882a593Smuzhiyun 		"ALU64_ADD_K: 0 + 0x7fffffff = 0x7fffffff",
2736*4882a593Smuzhiyun 		.u.insns_int = {
2737*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2738*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x7fffffff),
2739*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0x7fffffff),
2740*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2741*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2742*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2743*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2744*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2745*4882a593Smuzhiyun 		},
2746*4882a593Smuzhiyun 		INTERNAL,
2747*4882a593Smuzhiyun 		{ },
2748*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2749*4882a593Smuzhiyun 	},
2750*4882a593Smuzhiyun 	{
2751*4882a593Smuzhiyun 		"ALU64_ADD_K: 0 + 0x80000000 = 0xffffffff80000000",
2752*4882a593Smuzhiyun 		.u.insns_int = {
2753*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2754*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffff80000000LL),
2755*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80000000),
2756*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2757*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2758*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2759*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2760*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2761*4882a593Smuzhiyun 		},
2762*4882a593Smuzhiyun 		INTERNAL,
2763*4882a593Smuzhiyun 		{ },
2764*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2765*4882a593Smuzhiyun 	},
2766*4882a593Smuzhiyun 	{
2767*4882a593Smuzhiyun 		"ALU_ADD_K: 0 + 0x80008000 = 0xffffffff80008000",
2768*4882a593Smuzhiyun 		.u.insns_int = {
2769*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0),
2770*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffff80008000LL),
2771*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R2, 0x80008000),
2772*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
2773*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
2774*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2775*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
2776*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2777*4882a593Smuzhiyun 		},
2778*4882a593Smuzhiyun 		INTERNAL,
2779*4882a593Smuzhiyun 		{ },
2780*4882a593Smuzhiyun 		{ { 0, 0x1 } },
2781*4882a593Smuzhiyun 	},
2782*4882a593Smuzhiyun 	/* BPF_ALU | BPF_SUB | BPF_X */
2783*4882a593Smuzhiyun 	{
2784*4882a593Smuzhiyun 		"ALU_SUB_X: 3 - 1 = 2",
2785*4882a593Smuzhiyun 		.u.insns_int = {
2786*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2787*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2788*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2789*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2790*4882a593Smuzhiyun 		},
2791*4882a593Smuzhiyun 		INTERNAL,
2792*4882a593Smuzhiyun 		{ },
2793*4882a593Smuzhiyun 		{ { 0, 2 } },
2794*4882a593Smuzhiyun 	},
2795*4882a593Smuzhiyun 	{
2796*4882a593Smuzhiyun 		"ALU_SUB_X: 4294967295 - 4294967294 = 1",
2797*4882a593Smuzhiyun 		.u.insns_int = {
2798*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
2799*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2800*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_SUB, R0, R1),
2801*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2802*4882a593Smuzhiyun 		},
2803*4882a593Smuzhiyun 		INTERNAL,
2804*4882a593Smuzhiyun 		{ },
2805*4882a593Smuzhiyun 		{ { 0, 1 } },
2806*4882a593Smuzhiyun 	},
2807*4882a593Smuzhiyun 	{
2808*4882a593Smuzhiyun 		"ALU64_SUB_X: 3 - 1 = 2",
2809*4882a593Smuzhiyun 		.u.insns_int = {
2810*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2811*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
2812*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2813*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2814*4882a593Smuzhiyun 		},
2815*4882a593Smuzhiyun 		INTERNAL,
2816*4882a593Smuzhiyun 		{ },
2817*4882a593Smuzhiyun 		{ { 0, 2 } },
2818*4882a593Smuzhiyun 	},
2819*4882a593Smuzhiyun 	{
2820*4882a593Smuzhiyun 		"ALU64_SUB_X: 4294967295 - 4294967294 = 1",
2821*4882a593Smuzhiyun 		.u.insns_int = {
2822*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
2823*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967294U),
2824*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
2825*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2826*4882a593Smuzhiyun 		},
2827*4882a593Smuzhiyun 		INTERNAL,
2828*4882a593Smuzhiyun 		{ },
2829*4882a593Smuzhiyun 		{ { 0, 1 } },
2830*4882a593Smuzhiyun 	},
2831*4882a593Smuzhiyun 	/* BPF_ALU | BPF_SUB | BPF_K */
2832*4882a593Smuzhiyun 	{
2833*4882a593Smuzhiyun 		"ALU_SUB_K: 3 - 1 = 2",
2834*4882a593Smuzhiyun 		.u.insns_int = {
2835*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2836*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_SUB, R0, 1),
2837*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2838*4882a593Smuzhiyun 		},
2839*4882a593Smuzhiyun 		INTERNAL,
2840*4882a593Smuzhiyun 		{ },
2841*4882a593Smuzhiyun 		{ { 0, 2 } },
2842*4882a593Smuzhiyun 	},
2843*4882a593Smuzhiyun 	{
2844*4882a593Smuzhiyun 		"ALU_SUB_K: 3 - 0 = 3",
2845*4882a593Smuzhiyun 		.u.insns_int = {
2846*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2847*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_SUB, R0, 0),
2848*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2849*4882a593Smuzhiyun 		},
2850*4882a593Smuzhiyun 		INTERNAL,
2851*4882a593Smuzhiyun 		{ },
2852*4882a593Smuzhiyun 		{ { 0, 3 } },
2853*4882a593Smuzhiyun 	},
2854*4882a593Smuzhiyun 	{
2855*4882a593Smuzhiyun 		"ALU_SUB_K: 4294967295 - 4294967294 = 1",
2856*4882a593Smuzhiyun 		.u.insns_int = {
2857*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
2858*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_SUB, R0, 4294967294U),
2859*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2860*4882a593Smuzhiyun 		},
2861*4882a593Smuzhiyun 		INTERNAL,
2862*4882a593Smuzhiyun 		{ },
2863*4882a593Smuzhiyun 		{ { 0, 1 } },
2864*4882a593Smuzhiyun 	},
2865*4882a593Smuzhiyun 	{
2866*4882a593Smuzhiyun 		"ALU64_SUB_K: 3 - 1 = 2",
2867*4882a593Smuzhiyun 		.u.insns_int = {
2868*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2869*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 1),
2870*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2871*4882a593Smuzhiyun 		},
2872*4882a593Smuzhiyun 		INTERNAL,
2873*4882a593Smuzhiyun 		{ },
2874*4882a593Smuzhiyun 		{ { 0, 2 } },
2875*4882a593Smuzhiyun 	},
2876*4882a593Smuzhiyun 	{
2877*4882a593Smuzhiyun 		"ALU64_SUB_K: 3 - 0 = 3",
2878*4882a593Smuzhiyun 		.u.insns_int = {
2879*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2880*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 0),
2881*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2882*4882a593Smuzhiyun 		},
2883*4882a593Smuzhiyun 		INTERNAL,
2884*4882a593Smuzhiyun 		{ },
2885*4882a593Smuzhiyun 		{ { 0, 3 } },
2886*4882a593Smuzhiyun 	},
2887*4882a593Smuzhiyun 	{
2888*4882a593Smuzhiyun 		"ALU64_SUB_K: 4294967294 - 4294967295 = -1",
2889*4882a593Smuzhiyun 		.u.insns_int = {
2890*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967294U),
2891*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 4294967295U),
2892*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2893*4882a593Smuzhiyun 		},
2894*4882a593Smuzhiyun 		INTERNAL,
2895*4882a593Smuzhiyun 		{ },
2896*4882a593Smuzhiyun 		{ { 0, -1 } },
2897*4882a593Smuzhiyun 	},
2898*4882a593Smuzhiyun 	{
2899*4882a593Smuzhiyun 		"ALU64_ADD_K: 2147483646 - 2147483647 = -1",
2900*4882a593Smuzhiyun 		.u.insns_int = {
2901*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483646),
2902*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R0, 2147483647),
2903*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2904*4882a593Smuzhiyun 		},
2905*4882a593Smuzhiyun 		INTERNAL,
2906*4882a593Smuzhiyun 		{ },
2907*4882a593Smuzhiyun 		{ { 0, -1 } },
2908*4882a593Smuzhiyun 	},
2909*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MUL | BPF_X */
2910*4882a593Smuzhiyun 	{
2911*4882a593Smuzhiyun 		"ALU_MUL_X: 2 * 3 = 6",
2912*4882a593Smuzhiyun 		.u.insns_int = {
2913*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2914*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
2915*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2916*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2917*4882a593Smuzhiyun 		},
2918*4882a593Smuzhiyun 		INTERNAL,
2919*4882a593Smuzhiyun 		{ },
2920*4882a593Smuzhiyun 		{ { 0, 6 } },
2921*4882a593Smuzhiyun 	},
2922*4882a593Smuzhiyun 	{
2923*4882a593Smuzhiyun 		"ALU_MUL_X: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2924*4882a593Smuzhiyun 		.u.insns_int = {
2925*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2926*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0x7FFFFFF8),
2927*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2928*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2929*4882a593Smuzhiyun 		},
2930*4882a593Smuzhiyun 		INTERNAL,
2931*4882a593Smuzhiyun 		{ },
2932*4882a593Smuzhiyun 		{ { 0, 0xFFFFFFF0 } },
2933*4882a593Smuzhiyun 	},
2934*4882a593Smuzhiyun 	{
2935*4882a593Smuzhiyun 		"ALU_MUL_X: -1 * -1 = 1",
2936*4882a593Smuzhiyun 		.u.insns_int = {
2937*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, -1),
2938*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, -1),
2939*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MUL, R0, R1),
2940*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2941*4882a593Smuzhiyun 		},
2942*4882a593Smuzhiyun 		INTERNAL,
2943*4882a593Smuzhiyun 		{ },
2944*4882a593Smuzhiyun 		{ { 0, 1 } },
2945*4882a593Smuzhiyun 	},
2946*4882a593Smuzhiyun 	{
2947*4882a593Smuzhiyun 		"ALU64_MUL_X: 2 * 3 = 6",
2948*4882a593Smuzhiyun 		.u.insns_int = {
2949*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2950*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 3),
2951*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R1),
2952*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2953*4882a593Smuzhiyun 		},
2954*4882a593Smuzhiyun 		INTERNAL,
2955*4882a593Smuzhiyun 		{ },
2956*4882a593Smuzhiyun 		{ { 0, 6 } },
2957*4882a593Smuzhiyun 	},
2958*4882a593Smuzhiyun 	{
2959*4882a593Smuzhiyun 		"ALU64_MUL_X: 1 * 2147483647 = 2147483647",
2960*4882a593Smuzhiyun 		.u.insns_int = {
2961*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
2962*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
2963*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MUL, R0, R1),
2964*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2965*4882a593Smuzhiyun 		},
2966*4882a593Smuzhiyun 		INTERNAL,
2967*4882a593Smuzhiyun 		{ },
2968*4882a593Smuzhiyun 		{ { 0, 2147483647 } },
2969*4882a593Smuzhiyun 	},
2970*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MUL | BPF_K */
2971*4882a593Smuzhiyun 	{
2972*4882a593Smuzhiyun 		"ALU_MUL_K: 2 * 3 = 6",
2973*4882a593Smuzhiyun 		.u.insns_int = {
2974*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2975*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MUL, R0, 3),
2976*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2977*4882a593Smuzhiyun 		},
2978*4882a593Smuzhiyun 		INTERNAL,
2979*4882a593Smuzhiyun 		{ },
2980*4882a593Smuzhiyun 		{ { 0, 6 } },
2981*4882a593Smuzhiyun 	},
2982*4882a593Smuzhiyun 	{
2983*4882a593Smuzhiyun 		"ALU_MUL_K: 3 * 1 = 3",
2984*4882a593Smuzhiyun 		.u.insns_int = {
2985*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
2986*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MUL, R0, 1),
2987*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2988*4882a593Smuzhiyun 		},
2989*4882a593Smuzhiyun 		INTERNAL,
2990*4882a593Smuzhiyun 		{ },
2991*4882a593Smuzhiyun 		{ { 0, 3 } },
2992*4882a593Smuzhiyun 	},
2993*4882a593Smuzhiyun 	{
2994*4882a593Smuzhiyun 		"ALU_MUL_K: 2 * 0x7FFFFFF8 = 0xFFFFFFF0",
2995*4882a593Smuzhiyun 		.u.insns_int = {
2996*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
2997*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MUL, R0, 0x7FFFFFF8),
2998*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
2999*4882a593Smuzhiyun 		},
3000*4882a593Smuzhiyun 		INTERNAL,
3001*4882a593Smuzhiyun 		{ },
3002*4882a593Smuzhiyun 		{ { 0, 0xFFFFFFF0 } },
3003*4882a593Smuzhiyun 	},
3004*4882a593Smuzhiyun 	{
3005*4882a593Smuzhiyun 		"ALU_MUL_K: 1 * (-1) = 0x00000000ffffffff",
3006*4882a593Smuzhiyun 		.u.insns_int = {
3007*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x1),
3008*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x00000000ffffffff),
3009*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MUL, R2, 0xffffffff),
3010*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3011*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3012*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3013*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3014*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3015*4882a593Smuzhiyun 		},
3016*4882a593Smuzhiyun 		INTERNAL,
3017*4882a593Smuzhiyun 		{ },
3018*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3019*4882a593Smuzhiyun 	},
3020*4882a593Smuzhiyun 	{
3021*4882a593Smuzhiyun 		"ALU64_MUL_K: 2 * 3 = 6",
3022*4882a593Smuzhiyun 		.u.insns_int = {
3023*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
3024*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R0, 3),
3025*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3026*4882a593Smuzhiyun 		},
3027*4882a593Smuzhiyun 		INTERNAL,
3028*4882a593Smuzhiyun 		{ },
3029*4882a593Smuzhiyun 		{ { 0, 6 } },
3030*4882a593Smuzhiyun 	},
3031*4882a593Smuzhiyun 	{
3032*4882a593Smuzhiyun 		"ALU64_MUL_K: 3 * 1 = 3",
3033*4882a593Smuzhiyun 		.u.insns_int = {
3034*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3035*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R0, 1),
3036*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3037*4882a593Smuzhiyun 		},
3038*4882a593Smuzhiyun 		INTERNAL,
3039*4882a593Smuzhiyun 		{ },
3040*4882a593Smuzhiyun 		{ { 0, 3 } },
3041*4882a593Smuzhiyun 	},
3042*4882a593Smuzhiyun 	{
3043*4882a593Smuzhiyun 		"ALU64_MUL_K: 1 * 2147483647 = 2147483647",
3044*4882a593Smuzhiyun 		.u.insns_int = {
3045*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3046*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R0, 2147483647),
3047*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3048*4882a593Smuzhiyun 		},
3049*4882a593Smuzhiyun 		INTERNAL,
3050*4882a593Smuzhiyun 		{ },
3051*4882a593Smuzhiyun 		{ { 0, 2147483647 } },
3052*4882a593Smuzhiyun 	},
3053*4882a593Smuzhiyun 	{
3054*4882a593Smuzhiyun 		"ALU64_MUL_K: 1 * -2147483647 = -2147483647",
3055*4882a593Smuzhiyun 		.u.insns_int = {
3056*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3057*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R0, -2147483647),
3058*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3059*4882a593Smuzhiyun 		},
3060*4882a593Smuzhiyun 		INTERNAL,
3061*4882a593Smuzhiyun 		{ },
3062*4882a593Smuzhiyun 		{ { 0, -2147483647 } },
3063*4882a593Smuzhiyun 	},
3064*4882a593Smuzhiyun 	{
3065*4882a593Smuzhiyun 		"ALU64_MUL_K: 1 * (-1) = 0xffffffffffffffff",
3066*4882a593Smuzhiyun 		.u.insns_int = {
3067*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x1),
3068*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3069*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MUL, R2, 0xffffffff),
3070*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3071*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3072*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3073*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3074*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3075*4882a593Smuzhiyun 		},
3076*4882a593Smuzhiyun 		INTERNAL,
3077*4882a593Smuzhiyun 		{ },
3078*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3079*4882a593Smuzhiyun 	},
3080*4882a593Smuzhiyun 	/* BPF_ALU | BPF_DIV | BPF_X */
3081*4882a593Smuzhiyun 	{
3082*4882a593Smuzhiyun 		"ALU_DIV_X: 6 / 2 = 3",
3083*4882a593Smuzhiyun 		.u.insns_int = {
3084*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 6),
3085*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3086*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_DIV, R0, R1),
3087*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3088*4882a593Smuzhiyun 		},
3089*4882a593Smuzhiyun 		INTERNAL,
3090*4882a593Smuzhiyun 		{ },
3091*4882a593Smuzhiyun 		{ { 0, 3 } },
3092*4882a593Smuzhiyun 	},
3093*4882a593Smuzhiyun 	{
3094*4882a593Smuzhiyun 		"ALU_DIV_X: 4294967295 / 4294967295 = 1",
3095*4882a593Smuzhiyun 		.u.insns_int = {
3096*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
3097*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967295U),
3098*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_DIV, R0, R1),
3099*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3100*4882a593Smuzhiyun 		},
3101*4882a593Smuzhiyun 		INTERNAL,
3102*4882a593Smuzhiyun 		{ },
3103*4882a593Smuzhiyun 		{ { 0, 1 } },
3104*4882a593Smuzhiyun 	},
3105*4882a593Smuzhiyun 	{
3106*4882a593Smuzhiyun 		"ALU64_DIV_X: 6 / 2 = 3",
3107*4882a593Smuzhiyun 		.u.insns_int = {
3108*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 6),
3109*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3110*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_DIV, R0, R1),
3111*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3112*4882a593Smuzhiyun 		},
3113*4882a593Smuzhiyun 		INTERNAL,
3114*4882a593Smuzhiyun 		{ },
3115*4882a593Smuzhiyun 		{ { 0, 3 } },
3116*4882a593Smuzhiyun 	},
3117*4882a593Smuzhiyun 	{
3118*4882a593Smuzhiyun 		"ALU64_DIV_X: 2147483647 / 2147483647 = 1",
3119*4882a593Smuzhiyun 		.u.insns_int = {
3120*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483647),
3121*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483647),
3122*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_DIV, R0, R1),
3123*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3124*4882a593Smuzhiyun 		},
3125*4882a593Smuzhiyun 		INTERNAL,
3126*4882a593Smuzhiyun 		{ },
3127*4882a593Smuzhiyun 		{ { 0, 1 } },
3128*4882a593Smuzhiyun 	},
3129*4882a593Smuzhiyun 	{
3130*4882a593Smuzhiyun 		"ALU64_DIV_X: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3131*4882a593Smuzhiyun 		.u.insns_int = {
3132*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3133*4882a593Smuzhiyun 			BPF_LD_IMM64(R4, 0xffffffffffffffffLL),
3134*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3135*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_DIV, R2, R4),
3136*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3137*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3138*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3139*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3140*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3141*4882a593Smuzhiyun 		},
3142*4882a593Smuzhiyun 		INTERNAL,
3143*4882a593Smuzhiyun 		{ },
3144*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3145*4882a593Smuzhiyun 	},
3146*4882a593Smuzhiyun 	/* BPF_ALU | BPF_DIV | BPF_K */
3147*4882a593Smuzhiyun 	{
3148*4882a593Smuzhiyun 		"ALU_DIV_K: 6 / 2 = 3",
3149*4882a593Smuzhiyun 		.u.insns_int = {
3150*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 6),
3151*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_DIV, R0, 2),
3152*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3153*4882a593Smuzhiyun 		},
3154*4882a593Smuzhiyun 		INTERNAL,
3155*4882a593Smuzhiyun 		{ },
3156*4882a593Smuzhiyun 		{ { 0, 3 } },
3157*4882a593Smuzhiyun 	},
3158*4882a593Smuzhiyun 	{
3159*4882a593Smuzhiyun 		"ALU_DIV_K: 3 / 1 = 3",
3160*4882a593Smuzhiyun 		.u.insns_int = {
3161*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3162*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_DIV, R0, 1),
3163*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3164*4882a593Smuzhiyun 		},
3165*4882a593Smuzhiyun 		INTERNAL,
3166*4882a593Smuzhiyun 		{ },
3167*4882a593Smuzhiyun 		{ { 0, 3 } },
3168*4882a593Smuzhiyun 	},
3169*4882a593Smuzhiyun 	{
3170*4882a593Smuzhiyun 		"ALU_DIV_K: 4294967295 / 4294967295 = 1",
3171*4882a593Smuzhiyun 		.u.insns_int = {
3172*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
3173*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_DIV, R0, 4294967295U),
3174*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3175*4882a593Smuzhiyun 		},
3176*4882a593Smuzhiyun 		INTERNAL,
3177*4882a593Smuzhiyun 		{ },
3178*4882a593Smuzhiyun 		{ { 0, 1 } },
3179*4882a593Smuzhiyun 	},
3180*4882a593Smuzhiyun 	{
3181*4882a593Smuzhiyun 		"ALU_DIV_K: 0xffffffffffffffff / (-1) = 0x1",
3182*4882a593Smuzhiyun 		.u.insns_int = {
3183*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3184*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x1UL),
3185*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_DIV, R2, 0xffffffff),
3186*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3187*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3188*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3189*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3190*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3191*4882a593Smuzhiyun 		},
3192*4882a593Smuzhiyun 		INTERNAL,
3193*4882a593Smuzhiyun 		{ },
3194*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3195*4882a593Smuzhiyun 	},
3196*4882a593Smuzhiyun 	{
3197*4882a593Smuzhiyun 		"ALU64_DIV_K: 6 / 2 = 3",
3198*4882a593Smuzhiyun 		.u.insns_int = {
3199*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 6),
3200*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_DIV, R0, 2),
3201*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3202*4882a593Smuzhiyun 		},
3203*4882a593Smuzhiyun 		INTERNAL,
3204*4882a593Smuzhiyun 		{ },
3205*4882a593Smuzhiyun 		{ { 0, 3 } },
3206*4882a593Smuzhiyun 	},
3207*4882a593Smuzhiyun 	{
3208*4882a593Smuzhiyun 		"ALU64_DIV_K: 3 / 1 = 3",
3209*4882a593Smuzhiyun 		.u.insns_int = {
3210*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3211*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_DIV, R0, 1),
3212*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3213*4882a593Smuzhiyun 		},
3214*4882a593Smuzhiyun 		INTERNAL,
3215*4882a593Smuzhiyun 		{ },
3216*4882a593Smuzhiyun 		{ { 0, 3 } },
3217*4882a593Smuzhiyun 	},
3218*4882a593Smuzhiyun 	{
3219*4882a593Smuzhiyun 		"ALU64_DIV_K: 2147483647 / 2147483647 = 1",
3220*4882a593Smuzhiyun 		.u.insns_int = {
3221*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483647),
3222*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_DIV, R0, 2147483647),
3223*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3224*4882a593Smuzhiyun 		},
3225*4882a593Smuzhiyun 		INTERNAL,
3226*4882a593Smuzhiyun 		{ },
3227*4882a593Smuzhiyun 		{ { 0, 1 } },
3228*4882a593Smuzhiyun 	},
3229*4882a593Smuzhiyun 	{
3230*4882a593Smuzhiyun 		"ALU64_DIV_K: 0xffffffffffffffff / (-1) = 0x0000000000000001",
3231*4882a593Smuzhiyun 		.u.insns_int = {
3232*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3233*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000000000000001LL),
3234*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_DIV, R2, 0xffffffff),
3235*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3236*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3237*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3238*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3239*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3240*4882a593Smuzhiyun 		},
3241*4882a593Smuzhiyun 		INTERNAL,
3242*4882a593Smuzhiyun 		{ },
3243*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3244*4882a593Smuzhiyun 	},
3245*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MOD | BPF_X */
3246*4882a593Smuzhiyun 	{
3247*4882a593Smuzhiyun 		"ALU_MOD_X: 3 % 2 = 1",
3248*4882a593Smuzhiyun 		.u.insns_int = {
3249*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3250*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3251*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MOD, R0, R1),
3252*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3253*4882a593Smuzhiyun 		},
3254*4882a593Smuzhiyun 		INTERNAL,
3255*4882a593Smuzhiyun 		{ },
3256*4882a593Smuzhiyun 		{ { 0, 1 } },
3257*4882a593Smuzhiyun 	},
3258*4882a593Smuzhiyun 	{
3259*4882a593Smuzhiyun 		"ALU_MOD_X: 4294967295 % 4294967293 = 2",
3260*4882a593Smuzhiyun 		.u.insns_int = {
3261*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
3262*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 4294967293U),
3263*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_MOD, R0, R1),
3264*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3265*4882a593Smuzhiyun 		},
3266*4882a593Smuzhiyun 		INTERNAL,
3267*4882a593Smuzhiyun 		{ },
3268*4882a593Smuzhiyun 		{ { 0, 2 } },
3269*4882a593Smuzhiyun 	},
3270*4882a593Smuzhiyun 	{
3271*4882a593Smuzhiyun 		"ALU64_MOD_X: 3 % 2 = 1",
3272*4882a593Smuzhiyun 		.u.insns_int = {
3273*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3274*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3275*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOD, R0, R1),
3276*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3277*4882a593Smuzhiyun 		},
3278*4882a593Smuzhiyun 		INTERNAL,
3279*4882a593Smuzhiyun 		{ },
3280*4882a593Smuzhiyun 		{ { 0, 1 } },
3281*4882a593Smuzhiyun 	},
3282*4882a593Smuzhiyun 	{
3283*4882a593Smuzhiyun 		"ALU64_MOD_X: 2147483647 % 2147483645 = 2",
3284*4882a593Smuzhiyun 		.u.insns_int = {
3285*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483647),
3286*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2147483645),
3287*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOD, R0, R1),
3288*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3289*4882a593Smuzhiyun 		},
3290*4882a593Smuzhiyun 		INTERNAL,
3291*4882a593Smuzhiyun 		{ },
3292*4882a593Smuzhiyun 		{ { 0, 2 } },
3293*4882a593Smuzhiyun 	},
3294*4882a593Smuzhiyun 	/* BPF_ALU | BPF_MOD | BPF_K */
3295*4882a593Smuzhiyun 	{
3296*4882a593Smuzhiyun 		"ALU_MOD_K: 3 % 2 = 1",
3297*4882a593Smuzhiyun 		.u.insns_int = {
3298*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3299*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOD, R0, 2),
3300*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3301*4882a593Smuzhiyun 		},
3302*4882a593Smuzhiyun 		INTERNAL,
3303*4882a593Smuzhiyun 		{ },
3304*4882a593Smuzhiyun 		{ { 0, 1 } },
3305*4882a593Smuzhiyun 	},
3306*4882a593Smuzhiyun 	{
3307*4882a593Smuzhiyun 		"ALU_MOD_K: 3 % 1 = 0",
3308*4882a593Smuzhiyun 		.u.insns_int = {
3309*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3310*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOD, R0, 1),
3311*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3312*4882a593Smuzhiyun 		},
3313*4882a593Smuzhiyun 		INTERNAL,
3314*4882a593Smuzhiyun 		{ },
3315*4882a593Smuzhiyun 		{ { 0, 0 } },
3316*4882a593Smuzhiyun 	},
3317*4882a593Smuzhiyun 	{
3318*4882a593Smuzhiyun 		"ALU_MOD_K: 4294967295 % 4294967293 = 2",
3319*4882a593Smuzhiyun 		.u.insns_int = {
3320*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 4294967295U),
3321*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOD, R0, 4294967293U),
3322*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3323*4882a593Smuzhiyun 		},
3324*4882a593Smuzhiyun 		INTERNAL,
3325*4882a593Smuzhiyun 		{ },
3326*4882a593Smuzhiyun 		{ { 0, 2 } },
3327*4882a593Smuzhiyun 	},
3328*4882a593Smuzhiyun 	{
3329*4882a593Smuzhiyun 		"ALU64_MOD_K: 3 % 2 = 1",
3330*4882a593Smuzhiyun 		.u.insns_int = {
3331*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3332*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOD, R0, 2),
3333*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3334*4882a593Smuzhiyun 		},
3335*4882a593Smuzhiyun 		INTERNAL,
3336*4882a593Smuzhiyun 		{ },
3337*4882a593Smuzhiyun 		{ { 0, 1 } },
3338*4882a593Smuzhiyun 	},
3339*4882a593Smuzhiyun 	{
3340*4882a593Smuzhiyun 		"ALU64_MOD_K: 3 % 1 = 0",
3341*4882a593Smuzhiyun 		.u.insns_int = {
3342*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3343*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOD, R0, 1),
3344*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3345*4882a593Smuzhiyun 		},
3346*4882a593Smuzhiyun 		INTERNAL,
3347*4882a593Smuzhiyun 		{ },
3348*4882a593Smuzhiyun 		{ { 0, 0 } },
3349*4882a593Smuzhiyun 	},
3350*4882a593Smuzhiyun 	{
3351*4882a593Smuzhiyun 		"ALU64_MOD_K: 2147483647 % 2147483645 = 2",
3352*4882a593Smuzhiyun 		.u.insns_int = {
3353*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2147483647),
3354*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_MOD, R0, 2147483645),
3355*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3356*4882a593Smuzhiyun 		},
3357*4882a593Smuzhiyun 		INTERNAL,
3358*4882a593Smuzhiyun 		{ },
3359*4882a593Smuzhiyun 		{ { 0, 2 } },
3360*4882a593Smuzhiyun 	},
3361*4882a593Smuzhiyun 	/* BPF_ALU | BPF_AND | BPF_X */
3362*4882a593Smuzhiyun 	{
3363*4882a593Smuzhiyun 		"ALU_AND_X: 3 & 2 = 2",
3364*4882a593Smuzhiyun 		.u.insns_int = {
3365*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3366*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3367*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_AND, R0, R1),
3368*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3369*4882a593Smuzhiyun 		},
3370*4882a593Smuzhiyun 		INTERNAL,
3371*4882a593Smuzhiyun 		{ },
3372*4882a593Smuzhiyun 		{ { 0, 2 } },
3373*4882a593Smuzhiyun 	},
3374*4882a593Smuzhiyun 	{
3375*4882a593Smuzhiyun 		"ALU_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3376*4882a593Smuzhiyun 		.u.insns_int = {
3377*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffff),
3378*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3379*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_AND, R0, R1),
3380*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3381*4882a593Smuzhiyun 		},
3382*4882a593Smuzhiyun 		INTERNAL,
3383*4882a593Smuzhiyun 		{ },
3384*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3385*4882a593Smuzhiyun 	},
3386*4882a593Smuzhiyun 	{
3387*4882a593Smuzhiyun 		"ALU64_AND_X: 3 & 2 = 2",
3388*4882a593Smuzhiyun 		.u.insns_int = {
3389*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3390*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3391*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_AND, R0, R1),
3392*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3393*4882a593Smuzhiyun 		},
3394*4882a593Smuzhiyun 		INTERNAL,
3395*4882a593Smuzhiyun 		{ },
3396*4882a593Smuzhiyun 		{ { 0, 2 } },
3397*4882a593Smuzhiyun 	},
3398*4882a593Smuzhiyun 	{
3399*4882a593Smuzhiyun 		"ALU64_AND_X: 0xffffffff & 0xffffffff = 0xffffffff",
3400*4882a593Smuzhiyun 		.u.insns_int = {
3401*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffff),
3402*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3403*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_AND, R0, R1),
3404*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3405*4882a593Smuzhiyun 		},
3406*4882a593Smuzhiyun 		INTERNAL,
3407*4882a593Smuzhiyun 		{ },
3408*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3409*4882a593Smuzhiyun 	},
3410*4882a593Smuzhiyun 	/* BPF_ALU | BPF_AND | BPF_K */
3411*4882a593Smuzhiyun 	{
3412*4882a593Smuzhiyun 		"ALU_AND_K: 3 & 2 = 2",
3413*4882a593Smuzhiyun 		.u.insns_int = {
3414*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3415*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_AND, R0, 2),
3416*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3417*4882a593Smuzhiyun 		},
3418*4882a593Smuzhiyun 		INTERNAL,
3419*4882a593Smuzhiyun 		{ },
3420*4882a593Smuzhiyun 		{ { 0, 2 } },
3421*4882a593Smuzhiyun 	},
3422*4882a593Smuzhiyun 	{
3423*4882a593Smuzhiyun 		"ALU_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3424*4882a593Smuzhiyun 		.u.insns_int = {
3425*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffff),
3426*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_AND, R0, 0xffffffff),
3427*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3428*4882a593Smuzhiyun 		},
3429*4882a593Smuzhiyun 		INTERNAL,
3430*4882a593Smuzhiyun 		{ },
3431*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3432*4882a593Smuzhiyun 	},
3433*4882a593Smuzhiyun 	{
3434*4882a593Smuzhiyun 		"ALU64_AND_K: 3 & 2 = 2",
3435*4882a593Smuzhiyun 		.u.insns_int = {
3436*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
3437*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R0, 2),
3438*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3439*4882a593Smuzhiyun 		},
3440*4882a593Smuzhiyun 		INTERNAL,
3441*4882a593Smuzhiyun 		{ },
3442*4882a593Smuzhiyun 		{ { 0, 2 } },
3443*4882a593Smuzhiyun 	},
3444*4882a593Smuzhiyun 	{
3445*4882a593Smuzhiyun 		"ALU64_AND_K: 0xffffffff & 0xffffffff = 0xffffffff",
3446*4882a593Smuzhiyun 		.u.insns_int = {
3447*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffff),
3448*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R0, 0xffffffff),
3449*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3450*4882a593Smuzhiyun 		},
3451*4882a593Smuzhiyun 		INTERNAL,
3452*4882a593Smuzhiyun 		{ },
3453*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3454*4882a593Smuzhiyun 	},
3455*4882a593Smuzhiyun 	{
3456*4882a593Smuzhiyun 		"ALU64_AND_K: 0x0000ffffffff0000 & 0x0 = 0x0000ffff00000000",
3457*4882a593Smuzhiyun 		.u.insns_int = {
3458*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3459*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000000000000000LL),
3460*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R2, 0x0),
3461*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3462*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3463*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3464*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3465*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3466*4882a593Smuzhiyun 		},
3467*4882a593Smuzhiyun 		INTERNAL,
3468*4882a593Smuzhiyun 		{ },
3469*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3470*4882a593Smuzhiyun 	},
3471*4882a593Smuzhiyun 	{
3472*4882a593Smuzhiyun 		"ALU64_AND_K: 0x0000ffffffff0000 & -1 = 0x0000ffffffffffff",
3473*4882a593Smuzhiyun 		.u.insns_int = {
3474*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3475*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3476*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3477*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3478*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3479*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3480*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3481*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3482*4882a593Smuzhiyun 		},
3483*4882a593Smuzhiyun 		INTERNAL,
3484*4882a593Smuzhiyun 		{ },
3485*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3486*4882a593Smuzhiyun 	},
3487*4882a593Smuzhiyun 	{
3488*4882a593Smuzhiyun 		"ALU64_AND_K: 0xffffffffffffffff & -1 = 0xffffffffffffffff",
3489*4882a593Smuzhiyun 		.u.insns_int = {
3490*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffffffffffffffffLL),
3491*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3492*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_AND, R2, 0xffffffff),
3493*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3494*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3495*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3496*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3497*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3498*4882a593Smuzhiyun 		},
3499*4882a593Smuzhiyun 		INTERNAL,
3500*4882a593Smuzhiyun 		{ },
3501*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3502*4882a593Smuzhiyun 	},
3503*4882a593Smuzhiyun 	/* BPF_ALU | BPF_OR | BPF_X */
3504*4882a593Smuzhiyun 	{
3505*4882a593Smuzhiyun 		"ALU_OR_X: 1 | 2 = 3",
3506*4882a593Smuzhiyun 		.u.insns_int = {
3507*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3508*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3509*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_OR, R0, R1),
3510*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3511*4882a593Smuzhiyun 		},
3512*4882a593Smuzhiyun 		INTERNAL,
3513*4882a593Smuzhiyun 		{ },
3514*4882a593Smuzhiyun 		{ { 0, 3 } },
3515*4882a593Smuzhiyun 	},
3516*4882a593Smuzhiyun 	{
3517*4882a593Smuzhiyun 		"ALU_OR_X: 0x0 | 0xffffffff = 0xffffffff",
3518*4882a593Smuzhiyun 		.u.insns_int = {
3519*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
3520*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3521*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_OR, R0, R1),
3522*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3523*4882a593Smuzhiyun 		},
3524*4882a593Smuzhiyun 		INTERNAL,
3525*4882a593Smuzhiyun 		{ },
3526*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3527*4882a593Smuzhiyun 	},
3528*4882a593Smuzhiyun 	{
3529*4882a593Smuzhiyun 		"ALU64_OR_X: 1 | 2 = 3",
3530*4882a593Smuzhiyun 		.u.insns_int = {
3531*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3532*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 2),
3533*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_OR, R0, R1),
3534*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3535*4882a593Smuzhiyun 		},
3536*4882a593Smuzhiyun 		INTERNAL,
3537*4882a593Smuzhiyun 		{ },
3538*4882a593Smuzhiyun 		{ { 0, 3 } },
3539*4882a593Smuzhiyun 	},
3540*4882a593Smuzhiyun 	{
3541*4882a593Smuzhiyun 		"ALU64_OR_X: 0 | 0xffffffff = 0xffffffff",
3542*4882a593Smuzhiyun 		.u.insns_int = {
3543*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
3544*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3545*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_OR, R0, R1),
3546*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3547*4882a593Smuzhiyun 		},
3548*4882a593Smuzhiyun 		INTERNAL,
3549*4882a593Smuzhiyun 		{ },
3550*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3551*4882a593Smuzhiyun 	},
3552*4882a593Smuzhiyun 	/* BPF_ALU | BPF_OR | BPF_K */
3553*4882a593Smuzhiyun 	{
3554*4882a593Smuzhiyun 		"ALU_OR_K: 1 | 2 = 3",
3555*4882a593Smuzhiyun 		.u.insns_int = {
3556*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3557*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_OR, R0, 2),
3558*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3559*4882a593Smuzhiyun 		},
3560*4882a593Smuzhiyun 		INTERNAL,
3561*4882a593Smuzhiyun 		{ },
3562*4882a593Smuzhiyun 		{ { 0, 3 } },
3563*4882a593Smuzhiyun 	},
3564*4882a593Smuzhiyun 	{
3565*4882a593Smuzhiyun 		"ALU_OR_K: 0 & 0xffffffff = 0xffffffff",
3566*4882a593Smuzhiyun 		.u.insns_int = {
3567*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
3568*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_OR, R0, 0xffffffff),
3569*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3570*4882a593Smuzhiyun 		},
3571*4882a593Smuzhiyun 		INTERNAL,
3572*4882a593Smuzhiyun 		{ },
3573*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3574*4882a593Smuzhiyun 	},
3575*4882a593Smuzhiyun 	{
3576*4882a593Smuzhiyun 		"ALU64_OR_K: 1 | 2 = 3",
3577*4882a593Smuzhiyun 		.u.insns_int = {
3578*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3579*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_OR, R0, 2),
3580*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3581*4882a593Smuzhiyun 		},
3582*4882a593Smuzhiyun 		INTERNAL,
3583*4882a593Smuzhiyun 		{ },
3584*4882a593Smuzhiyun 		{ { 0, 3 } },
3585*4882a593Smuzhiyun 	},
3586*4882a593Smuzhiyun 	{
3587*4882a593Smuzhiyun 		"ALU64_OR_K: 0 & 0xffffffff = 0xffffffff",
3588*4882a593Smuzhiyun 		.u.insns_int = {
3589*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
3590*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_OR, R0, 0xffffffff),
3591*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3592*4882a593Smuzhiyun 		},
3593*4882a593Smuzhiyun 		INTERNAL,
3594*4882a593Smuzhiyun 		{ },
3595*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
3596*4882a593Smuzhiyun 	},
3597*4882a593Smuzhiyun 	{
3598*4882a593Smuzhiyun 		"ALU64_OR_K: 0x0000ffffffff0000 | 0x0 = 0x0000ffff00000000",
3599*4882a593Smuzhiyun 		.u.insns_int = {
3600*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3601*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3602*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_OR, R2, 0x0),
3603*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3604*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3605*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3606*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3607*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3608*4882a593Smuzhiyun 		},
3609*4882a593Smuzhiyun 		INTERNAL,
3610*4882a593Smuzhiyun 		{ },
3611*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3612*4882a593Smuzhiyun 	},
3613*4882a593Smuzhiyun 	{
3614*4882a593Smuzhiyun 		"ALU64_OR_K: 0x0000ffffffff0000 | -1 = 0xffffffffffffffff",
3615*4882a593Smuzhiyun 		.u.insns_int = {
3616*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3617*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3618*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3619*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3620*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3621*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3622*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3623*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3624*4882a593Smuzhiyun 		},
3625*4882a593Smuzhiyun 		INTERNAL,
3626*4882a593Smuzhiyun 		{ },
3627*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3628*4882a593Smuzhiyun 	},
3629*4882a593Smuzhiyun 	{
3630*4882a593Smuzhiyun 		"ALU64_OR_K: 0x000000000000000 | -1 = 0xffffffffffffffff",
3631*4882a593Smuzhiyun 		.u.insns_int = {
3632*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3633*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3634*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_OR, R2, 0xffffffff),
3635*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3636*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3637*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3638*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3639*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3640*4882a593Smuzhiyun 		},
3641*4882a593Smuzhiyun 		INTERNAL,
3642*4882a593Smuzhiyun 		{ },
3643*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3644*4882a593Smuzhiyun 	},
3645*4882a593Smuzhiyun 	/* BPF_ALU | BPF_XOR | BPF_X */
3646*4882a593Smuzhiyun 	{
3647*4882a593Smuzhiyun 		"ALU_XOR_X: 5 ^ 6 = 3",
3648*4882a593Smuzhiyun 		.u.insns_int = {
3649*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 5),
3650*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3651*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3652*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3653*4882a593Smuzhiyun 		},
3654*4882a593Smuzhiyun 		INTERNAL,
3655*4882a593Smuzhiyun 		{ },
3656*4882a593Smuzhiyun 		{ { 0, 3 } },
3657*4882a593Smuzhiyun 	},
3658*4882a593Smuzhiyun 	{
3659*4882a593Smuzhiyun 		"ALU_XOR_X: 0x1 ^ 0xffffffff = 0xfffffffe",
3660*4882a593Smuzhiyun 		.u.insns_int = {
3661*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3662*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3663*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_XOR, R0, R1),
3664*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3665*4882a593Smuzhiyun 		},
3666*4882a593Smuzhiyun 		INTERNAL,
3667*4882a593Smuzhiyun 		{ },
3668*4882a593Smuzhiyun 		{ { 0, 0xfffffffe } },
3669*4882a593Smuzhiyun 	},
3670*4882a593Smuzhiyun 	{
3671*4882a593Smuzhiyun 		"ALU64_XOR_X: 5 ^ 6 = 3",
3672*4882a593Smuzhiyun 		.u.insns_int = {
3673*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 5),
3674*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 6),
3675*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3676*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3677*4882a593Smuzhiyun 		},
3678*4882a593Smuzhiyun 		INTERNAL,
3679*4882a593Smuzhiyun 		{ },
3680*4882a593Smuzhiyun 		{ { 0, 3 } },
3681*4882a593Smuzhiyun 	},
3682*4882a593Smuzhiyun 	{
3683*4882a593Smuzhiyun 		"ALU64_XOR_X: 1 ^ 0xffffffff = 0xfffffffe",
3684*4882a593Smuzhiyun 		.u.insns_int = {
3685*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3686*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xffffffff),
3687*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_XOR, R0, R1),
3688*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3689*4882a593Smuzhiyun 		},
3690*4882a593Smuzhiyun 		INTERNAL,
3691*4882a593Smuzhiyun 		{ },
3692*4882a593Smuzhiyun 		{ { 0, 0xfffffffe } },
3693*4882a593Smuzhiyun 	},
3694*4882a593Smuzhiyun 	/* BPF_ALU | BPF_XOR | BPF_K */
3695*4882a593Smuzhiyun 	{
3696*4882a593Smuzhiyun 		"ALU_XOR_K: 5 ^ 6 = 3",
3697*4882a593Smuzhiyun 		.u.insns_int = {
3698*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 5),
3699*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_XOR, R0, 6),
3700*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3701*4882a593Smuzhiyun 		},
3702*4882a593Smuzhiyun 		INTERNAL,
3703*4882a593Smuzhiyun 		{ },
3704*4882a593Smuzhiyun 		{ { 0, 3 } },
3705*4882a593Smuzhiyun 	},
3706*4882a593Smuzhiyun 	{
3707*4882a593Smuzhiyun 		"ALU_XOR_K: 1 ^ 0xffffffff = 0xfffffffe",
3708*4882a593Smuzhiyun 		.u.insns_int = {
3709*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3710*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_XOR, R0, 0xffffffff),
3711*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3712*4882a593Smuzhiyun 		},
3713*4882a593Smuzhiyun 		INTERNAL,
3714*4882a593Smuzhiyun 		{ },
3715*4882a593Smuzhiyun 		{ { 0, 0xfffffffe } },
3716*4882a593Smuzhiyun 	},
3717*4882a593Smuzhiyun 	{
3718*4882a593Smuzhiyun 		"ALU64_XOR_K: 5 ^ 6 = 3",
3719*4882a593Smuzhiyun 		.u.insns_int = {
3720*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 5),
3721*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R0, 6),
3722*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3723*4882a593Smuzhiyun 		},
3724*4882a593Smuzhiyun 		INTERNAL,
3725*4882a593Smuzhiyun 		{ },
3726*4882a593Smuzhiyun 		{ { 0, 3 } },
3727*4882a593Smuzhiyun 	},
3728*4882a593Smuzhiyun 	{
3729*4882a593Smuzhiyun 		"ALU64_XOR_K: 1 & 0xffffffff = 0xfffffffe",
3730*4882a593Smuzhiyun 		.u.insns_int = {
3731*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3732*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R0, 0xffffffff),
3733*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3734*4882a593Smuzhiyun 		},
3735*4882a593Smuzhiyun 		INTERNAL,
3736*4882a593Smuzhiyun 		{ },
3737*4882a593Smuzhiyun 		{ { 0, 0xfffffffe } },
3738*4882a593Smuzhiyun 	},
3739*4882a593Smuzhiyun 	{
3740*4882a593Smuzhiyun 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ 0x0 = 0x0000ffffffff0000",
3741*4882a593Smuzhiyun 		.u.insns_int = {
3742*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3743*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0x0000ffffffff0000LL),
3744*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R2, 0x0),
3745*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3746*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3747*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3748*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3749*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3750*4882a593Smuzhiyun 		},
3751*4882a593Smuzhiyun 		INTERNAL,
3752*4882a593Smuzhiyun 		{ },
3753*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3754*4882a593Smuzhiyun 	},
3755*4882a593Smuzhiyun 	{
3756*4882a593Smuzhiyun 		"ALU64_XOR_K: 0x0000ffffffff0000 ^ -1 = 0xffff00000000ffff",
3757*4882a593Smuzhiyun 		.u.insns_int = {
3758*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000ffffffff0000LL),
3759*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffff00000000ffffLL),
3760*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3761*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3762*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3763*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3764*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3765*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3766*4882a593Smuzhiyun 		},
3767*4882a593Smuzhiyun 		INTERNAL,
3768*4882a593Smuzhiyun 		{ },
3769*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3770*4882a593Smuzhiyun 	},
3771*4882a593Smuzhiyun 	{
3772*4882a593Smuzhiyun 		"ALU64_XOR_K: 0x000000000000000 ^ -1 = 0xffffffffffffffff",
3773*4882a593Smuzhiyun 		.u.insns_int = {
3774*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0x0000000000000000LL),
3775*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
3776*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_XOR, R2, 0xffffffff),
3777*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
3778*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
3779*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3780*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
3781*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3782*4882a593Smuzhiyun 		},
3783*4882a593Smuzhiyun 		INTERNAL,
3784*4882a593Smuzhiyun 		{ },
3785*4882a593Smuzhiyun 		{ { 0, 0x1 } },
3786*4882a593Smuzhiyun 	},
3787*4882a593Smuzhiyun 	/* BPF_ALU | BPF_LSH | BPF_X */
3788*4882a593Smuzhiyun 	{
3789*4882a593Smuzhiyun 		"ALU_LSH_X: 1 << 1 = 2",
3790*4882a593Smuzhiyun 		.u.insns_int = {
3791*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3792*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3793*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3794*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3795*4882a593Smuzhiyun 		},
3796*4882a593Smuzhiyun 		INTERNAL,
3797*4882a593Smuzhiyun 		{ },
3798*4882a593Smuzhiyun 		{ { 0, 2 } },
3799*4882a593Smuzhiyun 	},
3800*4882a593Smuzhiyun 	{
3801*4882a593Smuzhiyun 		"ALU_LSH_X: 1 << 31 = 0x80000000",
3802*4882a593Smuzhiyun 		.u.insns_int = {
3803*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3804*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3805*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_LSH, R0, R1),
3806*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3807*4882a593Smuzhiyun 		},
3808*4882a593Smuzhiyun 		INTERNAL,
3809*4882a593Smuzhiyun 		{ },
3810*4882a593Smuzhiyun 		{ { 0, 0x80000000 } },
3811*4882a593Smuzhiyun 	},
3812*4882a593Smuzhiyun 	{
3813*4882a593Smuzhiyun 		"ALU64_LSH_X: 1 << 1 = 2",
3814*4882a593Smuzhiyun 		.u.insns_int = {
3815*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3816*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3817*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3818*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3819*4882a593Smuzhiyun 		},
3820*4882a593Smuzhiyun 		INTERNAL,
3821*4882a593Smuzhiyun 		{ },
3822*4882a593Smuzhiyun 		{ { 0, 2 } },
3823*4882a593Smuzhiyun 	},
3824*4882a593Smuzhiyun 	{
3825*4882a593Smuzhiyun 		"ALU64_LSH_X: 1 << 31 = 0x80000000",
3826*4882a593Smuzhiyun 		.u.insns_int = {
3827*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3828*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3829*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_LSH, R0, R1),
3830*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3831*4882a593Smuzhiyun 		},
3832*4882a593Smuzhiyun 		INTERNAL,
3833*4882a593Smuzhiyun 		{ },
3834*4882a593Smuzhiyun 		{ { 0, 0x80000000 } },
3835*4882a593Smuzhiyun 	},
3836*4882a593Smuzhiyun 	/* BPF_ALU | BPF_LSH | BPF_K */
3837*4882a593Smuzhiyun 	{
3838*4882a593Smuzhiyun 		"ALU_LSH_K: 1 << 1 = 2",
3839*4882a593Smuzhiyun 		.u.insns_int = {
3840*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3841*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_LSH, R0, 1),
3842*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3843*4882a593Smuzhiyun 		},
3844*4882a593Smuzhiyun 		INTERNAL,
3845*4882a593Smuzhiyun 		{ },
3846*4882a593Smuzhiyun 		{ { 0, 2 } },
3847*4882a593Smuzhiyun 	},
3848*4882a593Smuzhiyun 	{
3849*4882a593Smuzhiyun 		"ALU_LSH_K: 1 << 31 = 0x80000000",
3850*4882a593Smuzhiyun 		.u.insns_int = {
3851*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3852*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_LSH, R0, 31),
3853*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3854*4882a593Smuzhiyun 		},
3855*4882a593Smuzhiyun 		INTERNAL,
3856*4882a593Smuzhiyun 		{ },
3857*4882a593Smuzhiyun 		{ { 0, 0x80000000 } },
3858*4882a593Smuzhiyun 	},
3859*4882a593Smuzhiyun 	{
3860*4882a593Smuzhiyun 		"ALU64_LSH_K: 1 << 1 = 2",
3861*4882a593Smuzhiyun 		.u.insns_int = {
3862*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3863*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_LSH, R0, 1),
3864*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3865*4882a593Smuzhiyun 		},
3866*4882a593Smuzhiyun 		INTERNAL,
3867*4882a593Smuzhiyun 		{ },
3868*4882a593Smuzhiyun 		{ { 0, 2 } },
3869*4882a593Smuzhiyun 	},
3870*4882a593Smuzhiyun 	{
3871*4882a593Smuzhiyun 		"ALU64_LSH_K: 1 << 31 = 0x80000000",
3872*4882a593Smuzhiyun 		.u.insns_int = {
3873*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 1),
3874*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_LSH, R0, 31),
3875*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3876*4882a593Smuzhiyun 		},
3877*4882a593Smuzhiyun 		INTERNAL,
3878*4882a593Smuzhiyun 		{ },
3879*4882a593Smuzhiyun 		{ { 0, 0x80000000 } },
3880*4882a593Smuzhiyun 	},
3881*4882a593Smuzhiyun 	/* BPF_ALU | BPF_RSH | BPF_X */
3882*4882a593Smuzhiyun 	{
3883*4882a593Smuzhiyun 		"ALU_RSH_X: 2 >> 1 = 1",
3884*4882a593Smuzhiyun 		.u.insns_int = {
3885*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
3886*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3887*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_RSH, R0, R1),
3888*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3889*4882a593Smuzhiyun 		},
3890*4882a593Smuzhiyun 		INTERNAL,
3891*4882a593Smuzhiyun 		{ },
3892*4882a593Smuzhiyun 		{ { 0, 1 } },
3893*4882a593Smuzhiyun 	},
3894*4882a593Smuzhiyun 	{
3895*4882a593Smuzhiyun 		"ALU_RSH_X: 0x80000000 >> 31 = 1",
3896*4882a593Smuzhiyun 		.u.insns_int = {
3897*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x80000000),
3898*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3899*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_RSH, R0, R1),
3900*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3901*4882a593Smuzhiyun 		},
3902*4882a593Smuzhiyun 		INTERNAL,
3903*4882a593Smuzhiyun 		{ },
3904*4882a593Smuzhiyun 		{ { 0, 1 } },
3905*4882a593Smuzhiyun 	},
3906*4882a593Smuzhiyun 	{
3907*4882a593Smuzhiyun 		"ALU64_RSH_X: 2 >> 1 = 1",
3908*4882a593Smuzhiyun 		.u.insns_int = {
3909*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
3910*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 1),
3911*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_RSH, R0, R1),
3912*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3913*4882a593Smuzhiyun 		},
3914*4882a593Smuzhiyun 		INTERNAL,
3915*4882a593Smuzhiyun 		{ },
3916*4882a593Smuzhiyun 		{ { 0, 1 } },
3917*4882a593Smuzhiyun 	},
3918*4882a593Smuzhiyun 	{
3919*4882a593Smuzhiyun 		"ALU64_RSH_X: 0x80000000 >> 31 = 1",
3920*4882a593Smuzhiyun 		.u.insns_int = {
3921*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x80000000),
3922*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 31),
3923*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_RSH, R0, R1),
3924*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3925*4882a593Smuzhiyun 		},
3926*4882a593Smuzhiyun 		INTERNAL,
3927*4882a593Smuzhiyun 		{ },
3928*4882a593Smuzhiyun 		{ { 0, 1 } },
3929*4882a593Smuzhiyun 	},
3930*4882a593Smuzhiyun 	/* BPF_ALU | BPF_RSH | BPF_K */
3931*4882a593Smuzhiyun 	{
3932*4882a593Smuzhiyun 		"ALU_RSH_K: 2 >> 1 = 1",
3933*4882a593Smuzhiyun 		.u.insns_int = {
3934*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
3935*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_RSH, R0, 1),
3936*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3937*4882a593Smuzhiyun 		},
3938*4882a593Smuzhiyun 		INTERNAL,
3939*4882a593Smuzhiyun 		{ },
3940*4882a593Smuzhiyun 		{ { 0, 1 } },
3941*4882a593Smuzhiyun 	},
3942*4882a593Smuzhiyun 	{
3943*4882a593Smuzhiyun 		"ALU_RSH_K: 0x80000000 >> 31 = 1",
3944*4882a593Smuzhiyun 		.u.insns_int = {
3945*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x80000000),
3946*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_RSH, R0, 31),
3947*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3948*4882a593Smuzhiyun 		},
3949*4882a593Smuzhiyun 		INTERNAL,
3950*4882a593Smuzhiyun 		{ },
3951*4882a593Smuzhiyun 		{ { 0, 1 } },
3952*4882a593Smuzhiyun 	},
3953*4882a593Smuzhiyun 	{
3954*4882a593Smuzhiyun 		"ALU64_RSH_K: 2 >> 1 = 1",
3955*4882a593Smuzhiyun 		.u.insns_int = {
3956*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 2),
3957*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R0, 1),
3958*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3959*4882a593Smuzhiyun 		},
3960*4882a593Smuzhiyun 		INTERNAL,
3961*4882a593Smuzhiyun 		{ },
3962*4882a593Smuzhiyun 		{ { 0, 1 } },
3963*4882a593Smuzhiyun 	},
3964*4882a593Smuzhiyun 	{
3965*4882a593Smuzhiyun 		"ALU64_RSH_K: 0x80000000 >> 31 = 1",
3966*4882a593Smuzhiyun 		.u.insns_int = {
3967*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x80000000),
3968*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R0, 31),
3969*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3970*4882a593Smuzhiyun 		},
3971*4882a593Smuzhiyun 		INTERNAL,
3972*4882a593Smuzhiyun 		{ },
3973*4882a593Smuzhiyun 		{ { 0, 1 } },
3974*4882a593Smuzhiyun 	},
3975*4882a593Smuzhiyun 	/* BPF_ALU | BPF_ARSH | BPF_X */
3976*4882a593Smuzhiyun 	{
3977*4882a593Smuzhiyun 		"ALU_ARSH_X: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3978*4882a593Smuzhiyun 		.u.insns_int = {
3979*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3980*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 40),
3981*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_ARSH, R0, R1),
3982*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3983*4882a593Smuzhiyun 		},
3984*4882a593Smuzhiyun 		INTERNAL,
3985*4882a593Smuzhiyun 		{ },
3986*4882a593Smuzhiyun 		{ { 0, 0xffff00ff } },
3987*4882a593Smuzhiyun 	},
3988*4882a593Smuzhiyun 	/* BPF_ALU | BPF_ARSH | BPF_K */
3989*4882a593Smuzhiyun 	{
3990*4882a593Smuzhiyun 		"ALU_ARSH_K: 0xff00ff0000000000 >> 40 = 0xffffffffffff00ff",
3991*4882a593Smuzhiyun 		.u.insns_int = {
3992*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xff00ff0000000000LL),
3993*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ARSH, R0, 40),
3994*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
3995*4882a593Smuzhiyun 		},
3996*4882a593Smuzhiyun 		INTERNAL,
3997*4882a593Smuzhiyun 		{ },
3998*4882a593Smuzhiyun 		{ { 0, 0xffff00ff } },
3999*4882a593Smuzhiyun 	},
4000*4882a593Smuzhiyun 	/* BPF_ALU | BPF_NEG */
4001*4882a593Smuzhiyun 	{
4002*4882a593Smuzhiyun 		"ALU_NEG: -(3) = -3",
4003*4882a593Smuzhiyun 		.u.insns_int = {
4004*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 3),
4005*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4006*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4007*4882a593Smuzhiyun 		},
4008*4882a593Smuzhiyun 		INTERNAL,
4009*4882a593Smuzhiyun 		{ },
4010*4882a593Smuzhiyun 		{ { 0, -3 } },
4011*4882a593Smuzhiyun 	},
4012*4882a593Smuzhiyun 	{
4013*4882a593Smuzhiyun 		"ALU_NEG: -(-3) = 3",
4014*4882a593Smuzhiyun 		.u.insns_int = {
4015*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, -3),
4016*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_NEG, R0, 0),
4017*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4018*4882a593Smuzhiyun 		},
4019*4882a593Smuzhiyun 		INTERNAL,
4020*4882a593Smuzhiyun 		{ },
4021*4882a593Smuzhiyun 		{ { 0, 3 } },
4022*4882a593Smuzhiyun 	},
4023*4882a593Smuzhiyun 	{
4024*4882a593Smuzhiyun 		"ALU64_NEG: -(3) = -3",
4025*4882a593Smuzhiyun 		.u.insns_int = {
4026*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 3),
4027*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4028*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4029*4882a593Smuzhiyun 		},
4030*4882a593Smuzhiyun 		INTERNAL,
4031*4882a593Smuzhiyun 		{ },
4032*4882a593Smuzhiyun 		{ { 0, -3 } },
4033*4882a593Smuzhiyun 	},
4034*4882a593Smuzhiyun 	{
4035*4882a593Smuzhiyun 		"ALU64_NEG: -(-3) = 3",
4036*4882a593Smuzhiyun 		.u.insns_int = {
4037*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, -3),
4038*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_NEG, R0, 0),
4039*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4040*4882a593Smuzhiyun 		},
4041*4882a593Smuzhiyun 		INTERNAL,
4042*4882a593Smuzhiyun 		{ },
4043*4882a593Smuzhiyun 		{ { 0, 3 } },
4044*4882a593Smuzhiyun 	},
4045*4882a593Smuzhiyun 	/* BPF_ALU | BPF_END | BPF_FROM_BE */
4046*4882a593Smuzhiyun 	{
4047*4882a593Smuzhiyun 		"ALU_END_FROM_BE 16: 0x0123456789abcdef -> 0xcdef",
4048*4882a593Smuzhiyun 		.u.insns_int = {
4049*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4050*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_BE, R0, 16),
4051*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4052*4882a593Smuzhiyun 		},
4053*4882a593Smuzhiyun 		INTERNAL,
4054*4882a593Smuzhiyun 		{ },
4055*4882a593Smuzhiyun 		{ { 0,  cpu_to_be16(0xcdef) } },
4056*4882a593Smuzhiyun 	},
4057*4882a593Smuzhiyun 	{
4058*4882a593Smuzhiyun 		"ALU_END_FROM_BE 32: 0x0123456789abcdef -> 0x89abcdef",
4059*4882a593Smuzhiyun 		.u.insns_int = {
4060*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4061*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_BE, R0, 32),
4062*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R1, R0),
4063*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4064*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4065*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4066*4882a593Smuzhiyun 		},
4067*4882a593Smuzhiyun 		INTERNAL,
4068*4882a593Smuzhiyun 		{ },
4069*4882a593Smuzhiyun 		{ { 0, cpu_to_be32(0x89abcdef) } },
4070*4882a593Smuzhiyun 	},
4071*4882a593Smuzhiyun 	{
4072*4882a593Smuzhiyun 		"ALU_END_FROM_BE 64: 0x0123456789abcdef -> 0x89abcdef",
4073*4882a593Smuzhiyun 		.u.insns_int = {
4074*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4075*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_BE, R0, 64),
4076*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4077*4882a593Smuzhiyun 		},
4078*4882a593Smuzhiyun 		INTERNAL,
4079*4882a593Smuzhiyun 		{ },
4080*4882a593Smuzhiyun 		{ { 0, (u32) cpu_to_be64(0x0123456789abcdefLL) } },
4081*4882a593Smuzhiyun 	},
4082*4882a593Smuzhiyun 	/* BPF_ALU | BPF_END | BPF_FROM_LE */
4083*4882a593Smuzhiyun 	{
4084*4882a593Smuzhiyun 		"ALU_END_FROM_LE 16: 0x0123456789abcdef -> 0xefcd",
4085*4882a593Smuzhiyun 		.u.insns_int = {
4086*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4087*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_LE, R0, 16),
4088*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4089*4882a593Smuzhiyun 		},
4090*4882a593Smuzhiyun 		INTERNAL,
4091*4882a593Smuzhiyun 		{ },
4092*4882a593Smuzhiyun 		{ { 0, cpu_to_le16(0xcdef) } },
4093*4882a593Smuzhiyun 	},
4094*4882a593Smuzhiyun 	{
4095*4882a593Smuzhiyun 		"ALU_END_FROM_LE 32: 0x0123456789abcdef -> 0xefcdab89",
4096*4882a593Smuzhiyun 		.u.insns_int = {
4097*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4098*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_LE, R0, 32),
4099*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R1, R0),
4100*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_RSH, R1, 32),
4101*4882a593Smuzhiyun 			BPF_ALU32_REG(BPF_ADD, R0, R1), /* R1 = 0 */
4102*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4103*4882a593Smuzhiyun 		},
4104*4882a593Smuzhiyun 		INTERNAL,
4105*4882a593Smuzhiyun 		{ },
4106*4882a593Smuzhiyun 		{ { 0, cpu_to_le32(0x89abcdef) } },
4107*4882a593Smuzhiyun 	},
4108*4882a593Smuzhiyun 	{
4109*4882a593Smuzhiyun 		"ALU_END_FROM_LE 64: 0x0123456789abcdef -> 0x67452301",
4110*4882a593Smuzhiyun 		.u.insns_int = {
4111*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0x0123456789abcdefLL),
4112*4882a593Smuzhiyun 			BPF_ENDIAN(BPF_FROM_LE, R0, 64),
4113*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4114*4882a593Smuzhiyun 		},
4115*4882a593Smuzhiyun 		INTERNAL,
4116*4882a593Smuzhiyun 		{ },
4117*4882a593Smuzhiyun 		{ { 0, (u32) cpu_to_le64(0x0123456789abcdefLL) } },
4118*4882a593Smuzhiyun 	},
4119*4882a593Smuzhiyun 	/* BPF_ST(X) | BPF_MEM | BPF_B/H/W/DW */
4120*4882a593Smuzhiyun 	{
4121*4882a593Smuzhiyun 		"ST_MEM_B: Store/Load byte: max negative",
4122*4882a593Smuzhiyun 		.u.insns_int = {
4123*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4124*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_B, R10, -40, 0xff),
4125*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4126*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4127*4882a593Smuzhiyun 		},
4128*4882a593Smuzhiyun 		INTERNAL,
4129*4882a593Smuzhiyun 		{ },
4130*4882a593Smuzhiyun 		{ { 0, 0xff } },
4131*4882a593Smuzhiyun 		.stack_depth = 40,
4132*4882a593Smuzhiyun 	},
4133*4882a593Smuzhiyun 	{
4134*4882a593Smuzhiyun 		"ST_MEM_B: Store/Load byte: max positive",
4135*4882a593Smuzhiyun 		.u.insns_int = {
4136*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4137*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_H, R10, -40, 0x7f),
4138*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4139*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4140*4882a593Smuzhiyun 		},
4141*4882a593Smuzhiyun 		INTERNAL,
4142*4882a593Smuzhiyun 		{ },
4143*4882a593Smuzhiyun 		{ { 0, 0x7f } },
4144*4882a593Smuzhiyun 		.stack_depth = 40,
4145*4882a593Smuzhiyun 	},
4146*4882a593Smuzhiyun 	{
4147*4882a593Smuzhiyun 		"STX_MEM_B: Store/Load byte: max negative",
4148*4882a593Smuzhiyun 		.u.insns_int = {
4149*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
4150*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffLL),
4151*4882a593Smuzhiyun 			BPF_STX_MEM(BPF_B, R10, R1, -40),
4152*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_B, R0, R10, -40),
4153*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4154*4882a593Smuzhiyun 		},
4155*4882a593Smuzhiyun 		INTERNAL,
4156*4882a593Smuzhiyun 		{ },
4157*4882a593Smuzhiyun 		{ { 0, 0xff } },
4158*4882a593Smuzhiyun 		.stack_depth = 40,
4159*4882a593Smuzhiyun 	},
4160*4882a593Smuzhiyun 	{
4161*4882a593Smuzhiyun 		"ST_MEM_H: Store/Load half word: max negative",
4162*4882a593Smuzhiyun 		.u.insns_int = {
4163*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4164*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_H, R10, -40, 0xffff),
4165*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4166*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4167*4882a593Smuzhiyun 		},
4168*4882a593Smuzhiyun 		INTERNAL,
4169*4882a593Smuzhiyun 		{ },
4170*4882a593Smuzhiyun 		{ { 0, 0xffff } },
4171*4882a593Smuzhiyun 		.stack_depth = 40,
4172*4882a593Smuzhiyun 	},
4173*4882a593Smuzhiyun 	{
4174*4882a593Smuzhiyun 		"ST_MEM_H: Store/Load half word: max positive",
4175*4882a593Smuzhiyun 		.u.insns_int = {
4176*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4177*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_H, R10, -40, 0x7fff),
4178*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4179*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4180*4882a593Smuzhiyun 		},
4181*4882a593Smuzhiyun 		INTERNAL,
4182*4882a593Smuzhiyun 		{ },
4183*4882a593Smuzhiyun 		{ { 0, 0x7fff } },
4184*4882a593Smuzhiyun 		.stack_depth = 40,
4185*4882a593Smuzhiyun 	},
4186*4882a593Smuzhiyun 	{
4187*4882a593Smuzhiyun 		"STX_MEM_H: Store/Load half word: max negative",
4188*4882a593Smuzhiyun 		.u.insns_int = {
4189*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
4190*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffLL),
4191*4882a593Smuzhiyun 			BPF_STX_MEM(BPF_H, R10, R1, -40),
4192*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_H, R0, R10, -40),
4193*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4194*4882a593Smuzhiyun 		},
4195*4882a593Smuzhiyun 		INTERNAL,
4196*4882a593Smuzhiyun 		{ },
4197*4882a593Smuzhiyun 		{ { 0, 0xffff } },
4198*4882a593Smuzhiyun 		.stack_depth = 40,
4199*4882a593Smuzhiyun 	},
4200*4882a593Smuzhiyun 	{
4201*4882a593Smuzhiyun 		"ST_MEM_W: Store/Load word: max negative",
4202*4882a593Smuzhiyun 		.u.insns_int = {
4203*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4204*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_W, R10, -40, 0xffffffff),
4205*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4206*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4207*4882a593Smuzhiyun 		},
4208*4882a593Smuzhiyun 		INTERNAL,
4209*4882a593Smuzhiyun 		{ },
4210*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
4211*4882a593Smuzhiyun 		.stack_depth = 40,
4212*4882a593Smuzhiyun 	},
4213*4882a593Smuzhiyun 	{
4214*4882a593Smuzhiyun 		"ST_MEM_W: Store/Load word: max positive",
4215*4882a593Smuzhiyun 		.u.insns_int = {
4216*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4217*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_W, R10, -40, 0x7fffffff),
4218*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4219*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4220*4882a593Smuzhiyun 		},
4221*4882a593Smuzhiyun 		INTERNAL,
4222*4882a593Smuzhiyun 		{ },
4223*4882a593Smuzhiyun 		{ { 0, 0x7fffffff } },
4224*4882a593Smuzhiyun 		.stack_depth = 40,
4225*4882a593Smuzhiyun 	},
4226*4882a593Smuzhiyun 	{
4227*4882a593Smuzhiyun 		"STX_MEM_W: Store/Load word: max negative",
4228*4882a593Smuzhiyun 		.u.insns_int = {
4229*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
4230*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffLL),
4231*4882a593Smuzhiyun 			BPF_STX_MEM(BPF_W, R10, R1, -40),
4232*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4233*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4234*4882a593Smuzhiyun 		},
4235*4882a593Smuzhiyun 		INTERNAL,
4236*4882a593Smuzhiyun 		{ },
4237*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
4238*4882a593Smuzhiyun 		.stack_depth = 40,
4239*4882a593Smuzhiyun 	},
4240*4882a593Smuzhiyun 	{
4241*4882a593Smuzhiyun 		"ST_MEM_DW: Store/Load double word: max negative",
4242*4882a593Smuzhiyun 		.u.insns_int = {
4243*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4244*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4245*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4246*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4247*4882a593Smuzhiyun 		},
4248*4882a593Smuzhiyun 		INTERNAL,
4249*4882a593Smuzhiyun 		{ },
4250*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
4251*4882a593Smuzhiyun 		.stack_depth = 40,
4252*4882a593Smuzhiyun 	},
4253*4882a593Smuzhiyun 	{
4254*4882a593Smuzhiyun 		"ST_MEM_DW: Store/Load double word: max negative 2",
4255*4882a593Smuzhiyun 		.u.insns_int = {
4256*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffff00000000ffffLL),
4257*4882a593Smuzhiyun 			BPF_LD_IMM64(R3, 0xffffffffffffffffLL),
4258*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0xffffffff),
4259*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_DW, R2, R10, -40),
4260*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R2, R3, 2),
4261*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 2),
4262*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4263*4882a593Smuzhiyun 			BPF_MOV32_IMM(R0, 1),
4264*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4265*4882a593Smuzhiyun 		},
4266*4882a593Smuzhiyun 		INTERNAL,
4267*4882a593Smuzhiyun 		{ },
4268*4882a593Smuzhiyun 		{ { 0, 0x1 } },
4269*4882a593Smuzhiyun 		.stack_depth = 40,
4270*4882a593Smuzhiyun 	},
4271*4882a593Smuzhiyun 	{
4272*4882a593Smuzhiyun 		"ST_MEM_DW: Store/Load double word: max positive",
4273*4882a593Smuzhiyun 		.u.insns_int = {
4274*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4275*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0x7fffffff),
4276*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4277*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4278*4882a593Smuzhiyun 		},
4279*4882a593Smuzhiyun 		INTERNAL,
4280*4882a593Smuzhiyun 		{ },
4281*4882a593Smuzhiyun 		{ { 0, 0x7fffffff } },
4282*4882a593Smuzhiyun 		.stack_depth = 40,
4283*4882a593Smuzhiyun 	},
4284*4882a593Smuzhiyun 	{
4285*4882a593Smuzhiyun 		"STX_MEM_DW: Store/Load double word: max negative",
4286*4882a593Smuzhiyun 		.u.insns_int = {
4287*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0),
4288*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4289*4882a593Smuzhiyun 			BPF_STX_MEM(BPF_DW, R10, R1, -40),
4290*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4291*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4292*4882a593Smuzhiyun 		},
4293*4882a593Smuzhiyun 		INTERNAL,
4294*4882a593Smuzhiyun 		{ },
4295*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
4296*4882a593Smuzhiyun 		.stack_depth = 40,
4297*4882a593Smuzhiyun 	},
4298*4882a593Smuzhiyun 	/* BPF_STX | BPF_XADD | BPF_W/DW */
4299*4882a593Smuzhiyun 	{
4300*4882a593Smuzhiyun 		"STX_XADD_W: Test: 0x12 + 0x10 = 0x22",
4301*4882a593Smuzhiyun 		.u.insns_int = {
4302*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4303*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4304*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4305*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_W, R0, R10, -40),
4306*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4307*4882a593Smuzhiyun 		},
4308*4882a593Smuzhiyun 		INTERNAL,
4309*4882a593Smuzhiyun 		{ },
4310*4882a593Smuzhiyun 		{ { 0, 0x22 } },
4311*4882a593Smuzhiyun 		.stack_depth = 40,
4312*4882a593Smuzhiyun 	},
4313*4882a593Smuzhiyun 	{
4314*4882a593Smuzhiyun 		"STX_XADD_W: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4315*4882a593Smuzhiyun 		.u.insns_int = {
4316*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R1, R10),
4317*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4318*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4319*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4320*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R10),
4321*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4322*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4323*4882a593Smuzhiyun 		},
4324*4882a593Smuzhiyun 		INTERNAL,
4325*4882a593Smuzhiyun 		{ },
4326*4882a593Smuzhiyun 		{ { 0, 0 } },
4327*4882a593Smuzhiyun 		.stack_depth = 40,
4328*4882a593Smuzhiyun 	},
4329*4882a593Smuzhiyun 	{
4330*4882a593Smuzhiyun 		"STX_XADD_W: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4331*4882a593Smuzhiyun 		.u.insns_int = {
4332*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4333*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_W, R10, -40, 0x10),
4334*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_W, R10, R0, -40),
4335*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4336*4882a593Smuzhiyun 		},
4337*4882a593Smuzhiyun 		INTERNAL,
4338*4882a593Smuzhiyun 		{ },
4339*4882a593Smuzhiyun 		{ { 0, 0x12 } },
4340*4882a593Smuzhiyun 		.stack_depth = 40,
4341*4882a593Smuzhiyun 	},
4342*4882a593Smuzhiyun 	{
4343*4882a593Smuzhiyun 		"STX_XADD_W: X + 1 + 1 + 1 + ...",
4344*4882a593Smuzhiyun 		{ },
4345*4882a593Smuzhiyun 		INTERNAL,
4346*4882a593Smuzhiyun 		{ },
4347*4882a593Smuzhiyun 		{ { 0, 4134 } },
4348*4882a593Smuzhiyun 		.fill_helper = bpf_fill_stxw,
4349*4882a593Smuzhiyun 	},
4350*4882a593Smuzhiyun 	{
4351*4882a593Smuzhiyun 		"STX_XADD_DW: Test: 0x12 + 0x10 = 0x22",
4352*4882a593Smuzhiyun 		.u.insns_int = {
4353*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4354*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4355*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4356*4882a593Smuzhiyun 			BPF_LDX_MEM(BPF_DW, R0, R10, -40),
4357*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4358*4882a593Smuzhiyun 		},
4359*4882a593Smuzhiyun 		INTERNAL,
4360*4882a593Smuzhiyun 		{ },
4361*4882a593Smuzhiyun 		{ { 0, 0x22 } },
4362*4882a593Smuzhiyun 		.stack_depth = 40,
4363*4882a593Smuzhiyun 	},
4364*4882a593Smuzhiyun 	{
4365*4882a593Smuzhiyun 		"STX_XADD_DW: Test side-effects, r10: 0x12 + 0x10 = 0x22",
4366*4882a593Smuzhiyun 		.u.insns_int = {
4367*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R1, R10),
4368*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4369*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4370*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4371*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_MOV, R0, R10),
4372*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_SUB, R0, R1),
4373*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4374*4882a593Smuzhiyun 		},
4375*4882a593Smuzhiyun 		INTERNAL,
4376*4882a593Smuzhiyun 		{ },
4377*4882a593Smuzhiyun 		{ { 0, 0 } },
4378*4882a593Smuzhiyun 		.stack_depth = 40,
4379*4882a593Smuzhiyun 	},
4380*4882a593Smuzhiyun 	{
4381*4882a593Smuzhiyun 		"STX_XADD_DW: Test side-effects, r0: 0x12 + 0x10 = 0x22",
4382*4882a593Smuzhiyun 		.u.insns_int = {
4383*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x12),
4384*4882a593Smuzhiyun 			BPF_ST_MEM(BPF_DW, R10, -40, 0x10),
4385*4882a593Smuzhiyun 			BPF_STX_XADD(BPF_DW, R10, R0, -40),
4386*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4387*4882a593Smuzhiyun 		},
4388*4882a593Smuzhiyun 		INTERNAL,
4389*4882a593Smuzhiyun 		{ },
4390*4882a593Smuzhiyun 		{ { 0, 0x12 } },
4391*4882a593Smuzhiyun 		.stack_depth = 40,
4392*4882a593Smuzhiyun 	},
4393*4882a593Smuzhiyun 	{
4394*4882a593Smuzhiyun 		"STX_XADD_DW: X + 1 + 1 + 1 + ...",
4395*4882a593Smuzhiyun 		{ },
4396*4882a593Smuzhiyun 		INTERNAL,
4397*4882a593Smuzhiyun 		{ },
4398*4882a593Smuzhiyun 		{ { 0, 4134 } },
4399*4882a593Smuzhiyun 		.fill_helper = bpf_fill_stxdw,
4400*4882a593Smuzhiyun 	},
4401*4882a593Smuzhiyun 	/* BPF_JMP | BPF_EXIT */
4402*4882a593Smuzhiyun 	{
4403*4882a593Smuzhiyun 		"JMP_EXIT",
4404*4882a593Smuzhiyun 		.u.insns_int = {
4405*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4711),
4406*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4407*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0x4712),
4408*4882a593Smuzhiyun 		},
4409*4882a593Smuzhiyun 		INTERNAL,
4410*4882a593Smuzhiyun 		{ },
4411*4882a593Smuzhiyun 		{ { 0, 0x4711 } },
4412*4882a593Smuzhiyun 	},
4413*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JA */
4414*4882a593Smuzhiyun 	{
4415*4882a593Smuzhiyun 		"JMP_JA: Unconditional jump: if (true) return 1",
4416*4882a593Smuzhiyun 		.u.insns_int = {
4417*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4418*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JA, 0, 0, 1),
4419*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4420*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4421*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4422*4882a593Smuzhiyun 		},
4423*4882a593Smuzhiyun 		INTERNAL,
4424*4882a593Smuzhiyun 		{ },
4425*4882a593Smuzhiyun 		{ { 0, 1 } },
4426*4882a593Smuzhiyun 	},
4427*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSLT | BPF_K */
4428*4882a593Smuzhiyun 	{
4429*4882a593Smuzhiyun 		"JMP_JSLT_K: Signed jump: if (-2 < -1) return 1",
4430*4882a593Smuzhiyun 		.u.insns_int = {
4431*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4432*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4433*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4434*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4435*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4436*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4437*4882a593Smuzhiyun 		},
4438*4882a593Smuzhiyun 		INTERNAL,
4439*4882a593Smuzhiyun 		{ },
4440*4882a593Smuzhiyun 		{ { 0, 1 } },
4441*4882a593Smuzhiyun 	},
4442*4882a593Smuzhiyun 	{
4443*4882a593Smuzhiyun 		"JMP_JSLT_K: Signed jump: if (-1 < -1) return 0",
4444*4882a593Smuzhiyun 		.u.insns_int = {
4445*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4446*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4447*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLT, R1, -1, 1),
4448*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4449*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4450*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4451*4882a593Smuzhiyun 		},
4452*4882a593Smuzhiyun 		INTERNAL,
4453*4882a593Smuzhiyun 		{ },
4454*4882a593Smuzhiyun 		{ { 0, 1 } },
4455*4882a593Smuzhiyun 	},
4456*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSGT | BPF_K */
4457*4882a593Smuzhiyun 	{
4458*4882a593Smuzhiyun 		"JMP_JSGT_K: Signed jump: if (-1 > -2) return 1",
4459*4882a593Smuzhiyun 		.u.insns_int = {
4460*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4461*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4462*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGT, R1, -2, 1),
4463*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4464*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4465*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4466*4882a593Smuzhiyun 		},
4467*4882a593Smuzhiyun 		INTERNAL,
4468*4882a593Smuzhiyun 		{ },
4469*4882a593Smuzhiyun 		{ { 0, 1 } },
4470*4882a593Smuzhiyun 	},
4471*4882a593Smuzhiyun 	{
4472*4882a593Smuzhiyun 		"JMP_JSGT_K: Signed jump: if (-1 > -1) return 0",
4473*4882a593Smuzhiyun 		.u.insns_int = {
4474*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4475*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4476*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGT, R1, -1, 1),
4477*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4478*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4479*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4480*4882a593Smuzhiyun 		},
4481*4882a593Smuzhiyun 		INTERNAL,
4482*4882a593Smuzhiyun 		{ },
4483*4882a593Smuzhiyun 		{ { 0, 1 } },
4484*4882a593Smuzhiyun 	},
4485*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSLE | BPF_K */
4486*4882a593Smuzhiyun 	{
4487*4882a593Smuzhiyun 		"JMP_JSLE_K: Signed jump: if (-2 <= -1) return 1",
4488*4882a593Smuzhiyun 		.u.insns_int = {
4489*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4490*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xfffffffffffffffeLL),
4491*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4492*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4493*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4494*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4495*4882a593Smuzhiyun 		},
4496*4882a593Smuzhiyun 		INTERNAL,
4497*4882a593Smuzhiyun 		{ },
4498*4882a593Smuzhiyun 		{ { 0, 1 } },
4499*4882a593Smuzhiyun 	},
4500*4882a593Smuzhiyun 	{
4501*4882a593Smuzhiyun 		"JMP_JSLE_K: Signed jump: if (-1 <= -1) return 1",
4502*4882a593Smuzhiyun 		.u.insns_int = {
4503*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4504*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4505*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, -1, 1),
4506*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4507*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4508*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4509*4882a593Smuzhiyun 		},
4510*4882a593Smuzhiyun 		INTERNAL,
4511*4882a593Smuzhiyun 		{ },
4512*4882a593Smuzhiyun 		{ { 0, 1 } },
4513*4882a593Smuzhiyun 	},
4514*4882a593Smuzhiyun 	{
4515*4882a593Smuzhiyun 		"JMP_JSLE_K: Signed jump: value walk 1",
4516*4882a593Smuzhiyun 		.u.insns_int = {
4517*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4518*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4519*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 6),
4520*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4521*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4522*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4523*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4524*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 1),
4525*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4526*4882a593Smuzhiyun 			BPF_EXIT_INSN(),		/* bad exit */
4527*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4528*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4529*4882a593Smuzhiyun 		},
4530*4882a593Smuzhiyun 		INTERNAL,
4531*4882a593Smuzhiyun 		{ },
4532*4882a593Smuzhiyun 		{ { 0, 1 } },
4533*4882a593Smuzhiyun 	},
4534*4882a593Smuzhiyun 	{
4535*4882a593Smuzhiyun 		"JMP_JSLE_K: Signed jump: value walk 2",
4536*4882a593Smuzhiyun 		.u.insns_int = {
4537*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4538*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4539*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 4),
4540*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4541*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 2),
4542*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_SUB, R1, 2),
4543*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSLE, R1, 0, 1),
4544*4882a593Smuzhiyun 			BPF_EXIT_INSN(),		/* bad exit */
4545*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4546*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4547*4882a593Smuzhiyun 		},
4548*4882a593Smuzhiyun 		INTERNAL,
4549*4882a593Smuzhiyun 		{ },
4550*4882a593Smuzhiyun 		{ { 0, 1 } },
4551*4882a593Smuzhiyun 	},
4552*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSGE | BPF_K */
4553*4882a593Smuzhiyun 	{
4554*4882a593Smuzhiyun 		"JMP_JSGE_K: Signed jump: if (-1 >= -2) return 1",
4555*4882a593Smuzhiyun 		.u.insns_int = {
4556*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4557*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4558*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, -2, 1),
4559*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4560*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4561*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4562*4882a593Smuzhiyun 		},
4563*4882a593Smuzhiyun 		INTERNAL,
4564*4882a593Smuzhiyun 		{ },
4565*4882a593Smuzhiyun 		{ { 0, 1 } },
4566*4882a593Smuzhiyun 	},
4567*4882a593Smuzhiyun 	{
4568*4882a593Smuzhiyun 		"JMP_JSGE_K: Signed jump: if (-1 >= -1) return 1",
4569*4882a593Smuzhiyun 		.u.insns_int = {
4570*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4571*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xffffffffffffffffLL),
4572*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, -1, 1),
4573*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4574*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4575*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4576*4882a593Smuzhiyun 		},
4577*4882a593Smuzhiyun 		INTERNAL,
4578*4882a593Smuzhiyun 		{ },
4579*4882a593Smuzhiyun 		{ { 0, 1 } },
4580*4882a593Smuzhiyun 	},
4581*4882a593Smuzhiyun 	{
4582*4882a593Smuzhiyun 		"JMP_JSGE_K: Signed jump: value walk 1",
4583*4882a593Smuzhiyun 		.u.insns_int = {
4584*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4585*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -3),
4586*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 6),
4587*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4588*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4589*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4590*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4591*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 1),
4592*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4593*4882a593Smuzhiyun 			BPF_EXIT_INSN(),		/* bad exit */
4594*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4595*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4596*4882a593Smuzhiyun 		},
4597*4882a593Smuzhiyun 		INTERNAL,
4598*4882a593Smuzhiyun 		{ },
4599*4882a593Smuzhiyun 		{ { 0, 1 } },
4600*4882a593Smuzhiyun 	},
4601*4882a593Smuzhiyun 	{
4602*4882a593Smuzhiyun 		"JMP_JSGE_K: Signed jump: value walk 2",
4603*4882a593Smuzhiyun 		.u.insns_int = {
4604*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4605*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -3),
4606*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 4),
4607*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4608*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 2),
4609*4882a593Smuzhiyun 			BPF_ALU64_IMM(BPF_ADD, R1, 2),
4610*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSGE, R1, 0, 1),
4611*4882a593Smuzhiyun 			BPF_EXIT_INSN(),		/* bad exit */
4612*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),	/* good exit */
4613*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4614*4882a593Smuzhiyun 		},
4615*4882a593Smuzhiyun 		INTERNAL,
4616*4882a593Smuzhiyun 		{ },
4617*4882a593Smuzhiyun 		{ { 0, 1 } },
4618*4882a593Smuzhiyun 	},
4619*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JGT | BPF_K */
4620*4882a593Smuzhiyun 	{
4621*4882a593Smuzhiyun 		"JMP_JGT_K: if (3 > 2) return 1",
4622*4882a593Smuzhiyun 		.u.insns_int = {
4623*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4624*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4625*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JGT, R1, 2, 1),
4626*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4627*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4628*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4629*4882a593Smuzhiyun 		},
4630*4882a593Smuzhiyun 		INTERNAL,
4631*4882a593Smuzhiyun 		{ },
4632*4882a593Smuzhiyun 		{ { 0, 1 } },
4633*4882a593Smuzhiyun 	},
4634*4882a593Smuzhiyun 	{
4635*4882a593Smuzhiyun 		"JMP_JGT_K: Unsigned jump: if (-1 > 1) return 1",
4636*4882a593Smuzhiyun 		.u.insns_int = {
4637*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4638*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4639*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JGT, R1, 1, 1),
4640*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4641*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4642*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4643*4882a593Smuzhiyun 		},
4644*4882a593Smuzhiyun 		INTERNAL,
4645*4882a593Smuzhiyun 		{ },
4646*4882a593Smuzhiyun 		{ { 0, 1 } },
4647*4882a593Smuzhiyun 	},
4648*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JLT | BPF_K */
4649*4882a593Smuzhiyun 	{
4650*4882a593Smuzhiyun 		"JMP_JLT_K: if (2 < 3) return 1",
4651*4882a593Smuzhiyun 		.u.insns_int = {
4652*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4653*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 2),
4654*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JLT, R1, 3, 1),
4655*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4656*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4657*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4658*4882a593Smuzhiyun 		},
4659*4882a593Smuzhiyun 		INTERNAL,
4660*4882a593Smuzhiyun 		{ },
4661*4882a593Smuzhiyun 		{ { 0, 1 } },
4662*4882a593Smuzhiyun 	},
4663*4882a593Smuzhiyun 	{
4664*4882a593Smuzhiyun 		"JMP_JGT_K: Unsigned jump: if (1 < -1) return 1",
4665*4882a593Smuzhiyun 		.u.insns_int = {
4666*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4667*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 1),
4668*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JLT, R1, -1, 1),
4669*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4670*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4671*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4672*4882a593Smuzhiyun 		},
4673*4882a593Smuzhiyun 		INTERNAL,
4674*4882a593Smuzhiyun 		{ },
4675*4882a593Smuzhiyun 		{ { 0, 1 } },
4676*4882a593Smuzhiyun 	},
4677*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JGE | BPF_K */
4678*4882a593Smuzhiyun 	{
4679*4882a593Smuzhiyun 		"JMP_JGE_K: if (3 >= 2) return 1",
4680*4882a593Smuzhiyun 		.u.insns_int = {
4681*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4682*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4683*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JGE, R1, 2, 1),
4684*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4685*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4686*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4687*4882a593Smuzhiyun 		},
4688*4882a593Smuzhiyun 		INTERNAL,
4689*4882a593Smuzhiyun 		{ },
4690*4882a593Smuzhiyun 		{ { 0, 1 } },
4691*4882a593Smuzhiyun 	},
4692*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JLE | BPF_K */
4693*4882a593Smuzhiyun 	{
4694*4882a593Smuzhiyun 		"JMP_JLE_K: if (2 <= 3) return 1",
4695*4882a593Smuzhiyun 		.u.insns_int = {
4696*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4697*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 2),
4698*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4699*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4700*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4701*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4702*4882a593Smuzhiyun 		},
4703*4882a593Smuzhiyun 		INTERNAL,
4704*4882a593Smuzhiyun 		{ },
4705*4882a593Smuzhiyun 		{ { 0, 1 } },
4706*4882a593Smuzhiyun 	},
4707*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JGT | BPF_K jump backwards */
4708*4882a593Smuzhiyun 	{
4709*4882a593Smuzhiyun 		"JMP_JGT_K: if (3 > 2) return 1 (jump backwards)",
4710*4882a593Smuzhiyun 		.u.insns_int = {
4711*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4712*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4713*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4714*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4715*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3), /* note: this takes 2 insns */
4716*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JGT, R1, 2, -6), /* goto out */
4717*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4718*4882a593Smuzhiyun 		},
4719*4882a593Smuzhiyun 		INTERNAL,
4720*4882a593Smuzhiyun 		{ },
4721*4882a593Smuzhiyun 		{ { 0, 1 } },
4722*4882a593Smuzhiyun 	},
4723*4882a593Smuzhiyun 	{
4724*4882a593Smuzhiyun 		"JMP_JGE_K: if (3 >= 3) return 1",
4725*4882a593Smuzhiyun 		.u.insns_int = {
4726*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4727*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4728*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JGE, R1, 3, 1),
4729*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4730*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4731*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4732*4882a593Smuzhiyun 		},
4733*4882a593Smuzhiyun 		INTERNAL,
4734*4882a593Smuzhiyun 		{ },
4735*4882a593Smuzhiyun 		{ { 0, 1 } },
4736*4882a593Smuzhiyun 	},
4737*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JLT | BPF_K jump backwards */
4738*4882a593Smuzhiyun 	{
4739*4882a593Smuzhiyun 		"JMP_JGT_K: if (2 < 3) return 1 (jump backwards)",
4740*4882a593Smuzhiyun 		.u.insns_int = {
4741*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JA, 0, 0, 2), /* goto start */
4742*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1), /* out: */
4743*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4744*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0), /* start: */
4745*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 2), /* note: this takes 2 insns */
4746*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JLT, R1, 3, -6), /* goto out */
4747*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4748*4882a593Smuzhiyun 		},
4749*4882a593Smuzhiyun 		INTERNAL,
4750*4882a593Smuzhiyun 		{ },
4751*4882a593Smuzhiyun 		{ { 0, 1 } },
4752*4882a593Smuzhiyun 	},
4753*4882a593Smuzhiyun 	{
4754*4882a593Smuzhiyun 		"JMP_JLE_K: if (3 <= 3) return 1",
4755*4882a593Smuzhiyun 		.u.insns_int = {
4756*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4757*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4758*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JLE, R1, 3, 1),
4759*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4760*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4761*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4762*4882a593Smuzhiyun 		},
4763*4882a593Smuzhiyun 		INTERNAL,
4764*4882a593Smuzhiyun 		{ },
4765*4882a593Smuzhiyun 		{ { 0, 1 } },
4766*4882a593Smuzhiyun 	},
4767*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JNE | BPF_K */
4768*4882a593Smuzhiyun 	{
4769*4882a593Smuzhiyun 		"JMP_JNE_K: if (3 != 2) return 1",
4770*4882a593Smuzhiyun 		.u.insns_int = {
4771*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4772*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4773*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R1, 2, 1),
4774*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4775*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4776*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4777*4882a593Smuzhiyun 		},
4778*4882a593Smuzhiyun 		INTERNAL,
4779*4882a593Smuzhiyun 		{ },
4780*4882a593Smuzhiyun 		{ { 0, 1 } },
4781*4882a593Smuzhiyun 	},
4782*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JEQ | BPF_K */
4783*4882a593Smuzhiyun 	{
4784*4882a593Smuzhiyun 		"JMP_JEQ_K: if (3 == 3) return 1",
4785*4882a593Smuzhiyun 		.u.insns_int = {
4786*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4787*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4788*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JEQ, R1, 3, 1),
4789*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4790*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4791*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4792*4882a593Smuzhiyun 		},
4793*4882a593Smuzhiyun 		INTERNAL,
4794*4882a593Smuzhiyun 		{ },
4795*4882a593Smuzhiyun 		{ { 0, 1 } },
4796*4882a593Smuzhiyun 	},
4797*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSET | BPF_K */
4798*4882a593Smuzhiyun 	{
4799*4882a593Smuzhiyun 		"JMP_JSET_K: if (0x3 & 0x2) return 1",
4800*4882a593Smuzhiyun 		.u.insns_int = {
4801*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4802*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4803*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSET, R1, 2, 1),
4804*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4805*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4806*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4807*4882a593Smuzhiyun 		},
4808*4882a593Smuzhiyun 		INTERNAL,
4809*4882a593Smuzhiyun 		{ },
4810*4882a593Smuzhiyun 		{ { 0, 1 } },
4811*4882a593Smuzhiyun 	},
4812*4882a593Smuzhiyun 	{
4813*4882a593Smuzhiyun 		"JMP_JSET_K: if (0x3 & 0xffffffff) return 1",
4814*4882a593Smuzhiyun 		.u.insns_int = {
4815*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4816*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4817*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JSET, R1, 0xffffffff, 1),
4818*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4819*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4820*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4821*4882a593Smuzhiyun 		},
4822*4882a593Smuzhiyun 		INTERNAL,
4823*4882a593Smuzhiyun 		{ },
4824*4882a593Smuzhiyun 		{ { 0, 1 } },
4825*4882a593Smuzhiyun 	},
4826*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSGT | BPF_X */
4827*4882a593Smuzhiyun 	{
4828*4882a593Smuzhiyun 		"JMP_JSGT_X: Signed jump: if (-1 > -2) return 1",
4829*4882a593Smuzhiyun 		.u.insns_int = {
4830*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4831*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4832*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -2),
4833*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4834*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4835*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4836*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4837*4882a593Smuzhiyun 		},
4838*4882a593Smuzhiyun 		INTERNAL,
4839*4882a593Smuzhiyun 		{ },
4840*4882a593Smuzhiyun 		{ { 0, 1 } },
4841*4882a593Smuzhiyun 	},
4842*4882a593Smuzhiyun 	{
4843*4882a593Smuzhiyun 		"JMP_JSGT_X: Signed jump: if (-1 > -1) return 0",
4844*4882a593Smuzhiyun 		.u.insns_int = {
4845*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4846*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4847*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -1),
4848*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSGT, R1, R2, 1),
4849*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4850*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4851*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4852*4882a593Smuzhiyun 		},
4853*4882a593Smuzhiyun 		INTERNAL,
4854*4882a593Smuzhiyun 		{ },
4855*4882a593Smuzhiyun 		{ { 0, 1 } },
4856*4882a593Smuzhiyun 	},
4857*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSLT | BPF_X */
4858*4882a593Smuzhiyun 	{
4859*4882a593Smuzhiyun 		"JMP_JSLT_X: Signed jump: if (-2 < -1) return 1",
4860*4882a593Smuzhiyun 		.u.insns_int = {
4861*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4862*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4863*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -2),
4864*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSLT, R2, R1, 1),
4865*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4866*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4867*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4868*4882a593Smuzhiyun 		},
4869*4882a593Smuzhiyun 		INTERNAL,
4870*4882a593Smuzhiyun 		{ },
4871*4882a593Smuzhiyun 		{ { 0, 1 } },
4872*4882a593Smuzhiyun 	},
4873*4882a593Smuzhiyun 	{
4874*4882a593Smuzhiyun 		"JMP_JSLT_X: Signed jump: if (-1 < -1) return 0",
4875*4882a593Smuzhiyun 		.u.insns_int = {
4876*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4877*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4878*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -1),
4879*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSLT, R1, R2, 1),
4880*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4881*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4882*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4883*4882a593Smuzhiyun 		},
4884*4882a593Smuzhiyun 		INTERNAL,
4885*4882a593Smuzhiyun 		{ },
4886*4882a593Smuzhiyun 		{ { 0, 1 } },
4887*4882a593Smuzhiyun 	},
4888*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSGE | BPF_X */
4889*4882a593Smuzhiyun 	{
4890*4882a593Smuzhiyun 		"JMP_JSGE_X: Signed jump: if (-1 >= -2) return 1",
4891*4882a593Smuzhiyun 		.u.insns_int = {
4892*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4893*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4894*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -2),
4895*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4896*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4897*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4898*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4899*4882a593Smuzhiyun 		},
4900*4882a593Smuzhiyun 		INTERNAL,
4901*4882a593Smuzhiyun 		{ },
4902*4882a593Smuzhiyun 		{ { 0, 1 } },
4903*4882a593Smuzhiyun 	},
4904*4882a593Smuzhiyun 	{
4905*4882a593Smuzhiyun 		"JMP_JSGE_X: Signed jump: if (-1 >= -1) return 1",
4906*4882a593Smuzhiyun 		.u.insns_int = {
4907*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4908*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4909*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -1),
4910*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSGE, R1, R2, 1),
4911*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4912*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4913*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4914*4882a593Smuzhiyun 		},
4915*4882a593Smuzhiyun 		INTERNAL,
4916*4882a593Smuzhiyun 		{ },
4917*4882a593Smuzhiyun 		{ { 0, 1 } },
4918*4882a593Smuzhiyun 	},
4919*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSLE | BPF_X */
4920*4882a593Smuzhiyun 	{
4921*4882a593Smuzhiyun 		"JMP_JSLE_X: Signed jump: if (-2 <= -1) return 1",
4922*4882a593Smuzhiyun 		.u.insns_int = {
4923*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4924*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4925*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -2),
4926*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSLE, R2, R1, 1),
4927*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4928*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4929*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4930*4882a593Smuzhiyun 		},
4931*4882a593Smuzhiyun 		INTERNAL,
4932*4882a593Smuzhiyun 		{ },
4933*4882a593Smuzhiyun 		{ { 0, 1 } },
4934*4882a593Smuzhiyun 	},
4935*4882a593Smuzhiyun 	{
4936*4882a593Smuzhiyun 		"JMP_JSLE_X: Signed jump: if (-1 <= -1) return 1",
4937*4882a593Smuzhiyun 		.u.insns_int = {
4938*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4939*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4940*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, -1),
4941*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSLE, R1, R2, 1),
4942*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4943*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4944*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4945*4882a593Smuzhiyun 		},
4946*4882a593Smuzhiyun 		INTERNAL,
4947*4882a593Smuzhiyun 		{ },
4948*4882a593Smuzhiyun 		{ { 0, 1 } },
4949*4882a593Smuzhiyun 	},
4950*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JGT | BPF_X */
4951*4882a593Smuzhiyun 	{
4952*4882a593Smuzhiyun 		"JMP_JGT_X: if (3 > 2) return 1",
4953*4882a593Smuzhiyun 		.u.insns_int = {
4954*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4955*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4956*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
4957*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
4958*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4959*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4960*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4961*4882a593Smuzhiyun 		},
4962*4882a593Smuzhiyun 		INTERNAL,
4963*4882a593Smuzhiyun 		{ },
4964*4882a593Smuzhiyun 		{ { 0, 1 } },
4965*4882a593Smuzhiyun 	},
4966*4882a593Smuzhiyun 	{
4967*4882a593Smuzhiyun 		"JMP_JGT_X: Unsigned jump: if (-1 > 1) return 1",
4968*4882a593Smuzhiyun 		.u.insns_int = {
4969*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4970*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
4971*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 1),
4972*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGT, R1, R2, 1),
4973*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4974*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4975*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4976*4882a593Smuzhiyun 		},
4977*4882a593Smuzhiyun 		INTERNAL,
4978*4882a593Smuzhiyun 		{ },
4979*4882a593Smuzhiyun 		{ { 0, 1 } },
4980*4882a593Smuzhiyun 	},
4981*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JLT | BPF_X */
4982*4882a593Smuzhiyun 	{
4983*4882a593Smuzhiyun 		"JMP_JLT_X: if (2 < 3) return 1",
4984*4882a593Smuzhiyun 		.u.insns_int = {
4985*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
4986*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
4987*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
4988*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
4989*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4990*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
4991*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
4992*4882a593Smuzhiyun 		},
4993*4882a593Smuzhiyun 		INTERNAL,
4994*4882a593Smuzhiyun 		{ },
4995*4882a593Smuzhiyun 		{ { 0, 1 } },
4996*4882a593Smuzhiyun 	},
4997*4882a593Smuzhiyun 	{
4998*4882a593Smuzhiyun 		"JMP_JLT_X: Unsigned jump: if (1 < -1) return 1",
4999*4882a593Smuzhiyun 		.u.insns_int = {
5000*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5001*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -1),
5002*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 1),
5003*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLT, R2, R1, 1),
5004*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5005*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5006*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5007*4882a593Smuzhiyun 		},
5008*4882a593Smuzhiyun 		INTERNAL,
5009*4882a593Smuzhiyun 		{ },
5010*4882a593Smuzhiyun 		{ { 0, 1 } },
5011*4882a593Smuzhiyun 	},
5012*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JGE | BPF_X */
5013*4882a593Smuzhiyun 	{
5014*4882a593Smuzhiyun 		"JMP_JGE_X: if (3 >= 2) return 1",
5015*4882a593Smuzhiyun 		.u.insns_int = {
5016*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5017*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5018*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5019*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5020*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5021*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5022*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5023*4882a593Smuzhiyun 		},
5024*4882a593Smuzhiyun 		INTERNAL,
5025*4882a593Smuzhiyun 		{ },
5026*4882a593Smuzhiyun 		{ { 0, 1 } },
5027*4882a593Smuzhiyun 	},
5028*4882a593Smuzhiyun 	{
5029*4882a593Smuzhiyun 		"JMP_JGE_X: if (3 >= 3) return 1",
5030*4882a593Smuzhiyun 		.u.insns_int = {
5031*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5032*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5033*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 3),
5034*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGE, R1, R2, 1),
5035*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5036*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5037*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5038*4882a593Smuzhiyun 		},
5039*4882a593Smuzhiyun 		INTERNAL,
5040*4882a593Smuzhiyun 		{ },
5041*4882a593Smuzhiyun 		{ { 0, 1 } },
5042*4882a593Smuzhiyun 	},
5043*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JLE | BPF_X */
5044*4882a593Smuzhiyun 	{
5045*4882a593Smuzhiyun 		"JMP_JLE_X: if (2 <= 3) return 1",
5046*4882a593Smuzhiyun 		.u.insns_int = {
5047*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5048*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5049*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5050*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLE, R2, R1, 1),
5051*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5052*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5053*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5054*4882a593Smuzhiyun 		},
5055*4882a593Smuzhiyun 		INTERNAL,
5056*4882a593Smuzhiyun 		{ },
5057*4882a593Smuzhiyun 		{ { 0, 1 } },
5058*4882a593Smuzhiyun 	},
5059*4882a593Smuzhiyun 	{
5060*4882a593Smuzhiyun 		"JMP_JLE_X: if (3 <= 3) return 1",
5061*4882a593Smuzhiyun 		.u.insns_int = {
5062*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5063*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5064*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 3),
5065*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLE, R1, R2, 1),
5066*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5067*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5068*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5069*4882a593Smuzhiyun 		},
5070*4882a593Smuzhiyun 		INTERNAL,
5071*4882a593Smuzhiyun 		{ },
5072*4882a593Smuzhiyun 		{ { 0, 1 } },
5073*4882a593Smuzhiyun 	},
5074*4882a593Smuzhiyun 	{
5075*4882a593Smuzhiyun 		/* Mainly testing JIT + imm64 here. */
5076*4882a593Smuzhiyun 		"JMP_JGE_X: ldimm64 test 1",
5077*4882a593Smuzhiyun 		.u.insns_int = {
5078*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5079*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5080*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5081*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGE, R1, R2, 2),
5082*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5083*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5084*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5085*4882a593Smuzhiyun 		},
5086*4882a593Smuzhiyun 		INTERNAL,
5087*4882a593Smuzhiyun 		{ },
5088*4882a593Smuzhiyun 		{ { 0, 0xeeeeeeeeU } },
5089*4882a593Smuzhiyun 	},
5090*4882a593Smuzhiyun 	{
5091*4882a593Smuzhiyun 		"JMP_JGE_X: ldimm64 test 2",
5092*4882a593Smuzhiyun 		.u.insns_int = {
5093*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5094*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5095*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5096*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGE, R1, R2, 0),
5097*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5098*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5099*4882a593Smuzhiyun 		},
5100*4882a593Smuzhiyun 		INTERNAL,
5101*4882a593Smuzhiyun 		{ },
5102*4882a593Smuzhiyun 		{ { 0, 0xffffffffU } },
5103*4882a593Smuzhiyun 	},
5104*4882a593Smuzhiyun 	{
5105*4882a593Smuzhiyun 		"JMP_JGE_X: ldimm64 test 3",
5106*4882a593Smuzhiyun 		.u.insns_int = {
5107*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5108*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5109*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5110*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JGE, R1, R2, 4),
5111*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5112*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5113*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5114*4882a593Smuzhiyun 		},
5115*4882a593Smuzhiyun 		INTERNAL,
5116*4882a593Smuzhiyun 		{ },
5117*4882a593Smuzhiyun 		{ { 0, 1 } },
5118*4882a593Smuzhiyun 	},
5119*4882a593Smuzhiyun 	{
5120*4882a593Smuzhiyun 		"JMP_JLE_X: ldimm64 test 1",
5121*4882a593Smuzhiyun 		.u.insns_int = {
5122*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5123*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5124*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5125*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLE, R2, R1, 2),
5126*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5127*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5128*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5129*4882a593Smuzhiyun 		},
5130*4882a593Smuzhiyun 		INTERNAL,
5131*4882a593Smuzhiyun 		{ },
5132*4882a593Smuzhiyun 		{ { 0, 0xeeeeeeeeU } },
5133*4882a593Smuzhiyun 	},
5134*4882a593Smuzhiyun 	{
5135*4882a593Smuzhiyun 		"JMP_JLE_X: ldimm64 test 2",
5136*4882a593Smuzhiyun 		.u.insns_int = {
5137*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5138*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5139*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5140*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLE, R2, R1, 0),
5141*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5142*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5143*4882a593Smuzhiyun 		},
5144*4882a593Smuzhiyun 		INTERNAL,
5145*4882a593Smuzhiyun 		{ },
5146*4882a593Smuzhiyun 		{ { 0, 0xffffffffU } },
5147*4882a593Smuzhiyun 	},
5148*4882a593Smuzhiyun 	{
5149*4882a593Smuzhiyun 		"JMP_JLE_X: ldimm64 test 3",
5150*4882a593Smuzhiyun 		.u.insns_int = {
5151*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5152*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5153*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5154*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JLE, R2, R1, 4),
5155*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xffffffffffffffffULL),
5156*4882a593Smuzhiyun 			BPF_LD_IMM64(R0, 0xeeeeeeeeeeeeeeeeULL),
5157*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5158*4882a593Smuzhiyun 		},
5159*4882a593Smuzhiyun 		INTERNAL,
5160*4882a593Smuzhiyun 		{ },
5161*4882a593Smuzhiyun 		{ { 0, 1 } },
5162*4882a593Smuzhiyun 	},
5163*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JNE | BPF_X */
5164*4882a593Smuzhiyun 	{
5165*4882a593Smuzhiyun 		"JMP_JNE_X: if (3 != 2) return 1",
5166*4882a593Smuzhiyun 		.u.insns_int = {
5167*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5168*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5169*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5170*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JNE, R1, R2, 1),
5171*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5172*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5173*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5174*4882a593Smuzhiyun 		},
5175*4882a593Smuzhiyun 		INTERNAL,
5176*4882a593Smuzhiyun 		{ },
5177*4882a593Smuzhiyun 		{ { 0, 1 } },
5178*4882a593Smuzhiyun 	},
5179*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JEQ | BPF_X */
5180*4882a593Smuzhiyun 	{
5181*4882a593Smuzhiyun 		"JMP_JEQ_X: if (3 == 3) return 1",
5182*4882a593Smuzhiyun 		.u.insns_int = {
5183*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5184*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5185*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 3),
5186*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JEQ, R1, R2, 1),
5187*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5188*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5189*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5190*4882a593Smuzhiyun 		},
5191*4882a593Smuzhiyun 		INTERNAL,
5192*4882a593Smuzhiyun 		{ },
5193*4882a593Smuzhiyun 		{ { 0, 1 } },
5194*4882a593Smuzhiyun 	},
5195*4882a593Smuzhiyun 	/* BPF_JMP | BPF_JSET | BPF_X */
5196*4882a593Smuzhiyun 	{
5197*4882a593Smuzhiyun 		"JMP_JSET_X: if (0x3 & 0x2) return 1",
5198*4882a593Smuzhiyun 		.u.insns_int = {
5199*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5200*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5201*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 2),
5202*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5203*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5204*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5205*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5206*4882a593Smuzhiyun 		},
5207*4882a593Smuzhiyun 		INTERNAL,
5208*4882a593Smuzhiyun 		{ },
5209*4882a593Smuzhiyun 		{ { 0, 1 } },
5210*4882a593Smuzhiyun 	},
5211*4882a593Smuzhiyun 	{
5212*4882a593Smuzhiyun 		"JMP_JSET_X: if (0x3 & 0xffffffff) return 1",
5213*4882a593Smuzhiyun 		.u.insns_int = {
5214*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 0),
5215*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 3),
5216*4882a593Smuzhiyun 			BPF_LD_IMM64(R2, 0xffffffff),
5217*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JSET, R1, R2, 1),
5218*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5219*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
5220*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
5221*4882a593Smuzhiyun 		},
5222*4882a593Smuzhiyun 		INTERNAL,
5223*4882a593Smuzhiyun 		{ },
5224*4882a593Smuzhiyun 		{ { 0, 1 } },
5225*4882a593Smuzhiyun 	},
5226*4882a593Smuzhiyun 	{
5227*4882a593Smuzhiyun 		"JMP_JA: Jump, gap, jump, ...",
5228*4882a593Smuzhiyun 		{ },
5229*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5230*4882a593Smuzhiyun 		{ },
5231*4882a593Smuzhiyun 		{ { 0, 0xababcbac } },
5232*4882a593Smuzhiyun 		.fill_helper = bpf_fill_ja,
5233*4882a593Smuzhiyun 	},
5234*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5235*4882a593Smuzhiyun 		"BPF_MAXINSNS: Maximum possible literals",
5236*4882a593Smuzhiyun 		{ },
5237*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5238*4882a593Smuzhiyun 		{ },
5239*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
5240*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns1,
5241*4882a593Smuzhiyun 	},
5242*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5243*4882a593Smuzhiyun 		"BPF_MAXINSNS: Single literal",
5244*4882a593Smuzhiyun 		{ },
5245*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5246*4882a593Smuzhiyun 		{ },
5247*4882a593Smuzhiyun 		{ { 0, 0xfefefefe } },
5248*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns2,
5249*4882a593Smuzhiyun 	},
5250*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5251*4882a593Smuzhiyun 		"BPF_MAXINSNS: Run/add until end",
5252*4882a593Smuzhiyun 		{ },
5253*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5254*4882a593Smuzhiyun 		{ },
5255*4882a593Smuzhiyun 		{ { 0, 0x947bf368 } },
5256*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns3,
5257*4882a593Smuzhiyun 	},
5258*4882a593Smuzhiyun 	{
5259*4882a593Smuzhiyun 		"BPF_MAXINSNS: Too many instructions",
5260*4882a593Smuzhiyun 		{ },
5261*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5262*4882a593Smuzhiyun 		{ },
5263*4882a593Smuzhiyun 		{ },
5264*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns4,
5265*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
5266*4882a593Smuzhiyun 	},
5267*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5268*4882a593Smuzhiyun 		"BPF_MAXINSNS: Very long jump",
5269*4882a593Smuzhiyun 		{ },
5270*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5271*4882a593Smuzhiyun 		{ },
5272*4882a593Smuzhiyun 		{ { 0, 0xabababab } },
5273*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns5,
5274*4882a593Smuzhiyun 	},
5275*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5276*4882a593Smuzhiyun 		"BPF_MAXINSNS: Ctx heavy transformations",
5277*4882a593Smuzhiyun 		{ },
5278*4882a593Smuzhiyun 		CLASSIC,
5279*4882a593Smuzhiyun 		{ },
5280*4882a593Smuzhiyun 		{
5281*4882a593Smuzhiyun 			{  1, SKB_VLAN_PRESENT },
5282*4882a593Smuzhiyun 			{ 10, SKB_VLAN_PRESENT }
5283*4882a593Smuzhiyun 		},
5284*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns6,
5285*4882a593Smuzhiyun 	},
5286*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5287*4882a593Smuzhiyun 		"BPF_MAXINSNS: Call heavy transformations",
5288*4882a593Smuzhiyun 		{ },
5289*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5290*4882a593Smuzhiyun 		{ },
5291*4882a593Smuzhiyun 		{ { 1, 0 }, { 10, 0 } },
5292*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns7,
5293*4882a593Smuzhiyun 	},
5294*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5295*4882a593Smuzhiyun 		"BPF_MAXINSNS: Jump heavy test",
5296*4882a593Smuzhiyun 		{ },
5297*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5298*4882a593Smuzhiyun 		{ },
5299*4882a593Smuzhiyun 		{ { 0, 0xffffffff } },
5300*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns8,
5301*4882a593Smuzhiyun 	},
5302*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5303*4882a593Smuzhiyun 		"BPF_MAXINSNS: Very long jump backwards",
5304*4882a593Smuzhiyun 		{ },
5305*4882a593Smuzhiyun 		INTERNAL | FLAG_NO_DATA,
5306*4882a593Smuzhiyun 		{ },
5307*4882a593Smuzhiyun 		{ { 0, 0xcbababab } },
5308*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns9,
5309*4882a593Smuzhiyun 	},
5310*4882a593Smuzhiyun 	{	/* Mainly checking JIT here. */
5311*4882a593Smuzhiyun 		"BPF_MAXINSNS: Edge hopping nuthouse",
5312*4882a593Smuzhiyun 		{ },
5313*4882a593Smuzhiyun 		INTERNAL | FLAG_NO_DATA,
5314*4882a593Smuzhiyun 		{ },
5315*4882a593Smuzhiyun 		{ { 0, 0xabababac } },
5316*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns10,
5317*4882a593Smuzhiyun 	},
5318*4882a593Smuzhiyun 	{
5319*4882a593Smuzhiyun 		"BPF_MAXINSNS: Jump, gap, jump, ...",
5320*4882a593Smuzhiyun 		{ },
5321*4882a593Smuzhiyun #if defined(CONFIG_BPF_JIT_ALWAYS_ON) && defined(CONFIG_X86)
5322*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA | FLAG_EXPECTED_FAIL,
5323*4882a593Smuzhiyun #else
5324*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
5325*4882a593Smuzhiyun #endif
5326*4882a593Smuzhiyun 		{ },
5327*4882a593Smuzhiyun 		{ { 0, 0xababcbac } },
5328*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns11,
5329*4882a593Smuzhiyun 		.expected_errcode = -ENOTSUPP,
5330*4882a593Smuzhiyun 	},
5331*4882a593Smuzhiyun 	{
5332*4882a593Smuzhiyun 		"BPF_MAXINSNS: jump over MSH",
5333*4882a593Smuzhiyun 		{ },
5334*4882a593Smuzhiyun 		CLASSIC | FLAG_EXPECTED_FAIL,
5335*4882a593Smuzhiyun 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
5336*4882a593Smuzhiyun 		{ { 4, 0xabababab } },
5337*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns12,
5338*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
5339*4882a593Smuzhiyun 	},
5340*4882a593Smuzhiyun 	{
5341*4882a593Smuzhiyun 		"BPF_MAXINSNS: exec all MSH",
5342*4882a593Smuzhiyun 		{ },
5343*4882a593Smuzhiyun 		CLASSIC,
5344*4882a593Smuzhiyun 		{ 0xfa, 0xfb, 0xfc, 0xfd, },
5345*4882a593Smuzhiyun 		{ { 4, 0xababab83 } },
5346*4882a593Smuzhiyun 		.fill_helper = bpf_fill_maxinsns13,
5347*4882a593Smuzhiyun 	},
5348*4882a593Smuzhiyun 	{
5349*4882a593Smuzhiyun 		"BPF_MAXINSNS: ld_abs+get_processor_id",
5350*4882a593Smuzhiyun 		{ },
5351*4882a593Smuzhiyun 		CLASSIC,
5352*4882a593Smuzhiyun 		{ },
5353*4882a593Smuzhiyun 		{ { 1, 0xbee } },
5354*4882a593Smuzhiyun 		.fill_helper = bpf_fill_ld_abs_get_processor_id,
5355*4882a593Smuzhiyun 	},
5356*4882a593Smuzhiyun 	/*
5357*4882a593Smuzhiyun 	 * LD_IND / LD_ABS on fragmented SKBs
5358*4882a593Smuzhiyun 	 */
5359*4882a593Smuzhiyun 	{
5360*4882a593Smuzhiyun 		"LD_IND byte frag",
5361*4882a593Smuzhiyun 		.u.insns = {
5362*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5363*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x0),
5364*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5365*4882a593Smuzhiyun 		},
5366*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5367*4882a593Smuzhiyun 		{ },
5368*4882a593Smuzhiyun 		{ {0x40, 0x42} },
5369*4882a593Smuzhiyun 		.frag_data = {
5370*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5371*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5372*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5373*4882a593Smuzhiyun 		},
5374*4882a593Smuzhiyun 	},
5375*4882a593Smuzhiyun 	{
5376*4882a593Smuzhiyun 		"LD_IND halfword frag",
5377*4882a593Smuzhiyun 		.u.insns = {
5378*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5379*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x4),
5380*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5381*4882a593Smuzhiyun 		},
5382*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5383*4882a593Smuzhiyun 		{ },
5384*4882a593Smuzhiyun 		{ {0x40, 0x4344} },
5385*4882a593Smuzhiyun 		.frag_data = {
5386*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5387*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5388*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5389*4882a593Smuzhiyun 		},
5390*4882a593Smuzhiyun 	},
5391*4882a593Smuzhiyun 	{
5392*4882a593Smuzhiyun 		"LD_IND word frag",
5393*4882a593Smuzhiyun 		.u.insns = {
5394*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5395*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x8),
5396*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5397*4882a593Smuzhiyun 		},
5398*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5399*4882a593Smuzhiyun 		{ },
5400*4882a593Smuzhiyun 		{ {0x40, 0x21071983} },
5401*4882a593Smuzhiyun 		.frag_data = {
5402*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5403*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5404*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5405*4882a593Smuzhiyun 		},
5406*4882a593Smuzhiyun 	},
5407*4882a593Smuzhiyun 	{
5408*4882a593Smuzhiyun 		"LD_IND halfword mixed head/frag",
5409*4882a593Smuzhiyun 		.u.insns = {
5410*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5411*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5412*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5413*4882a593Smuzhiyun 		},
5414*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5415*4882a593Smuzhiyun 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5416*4882a593Smuzhiyun 		{ {0x40, 0x0519} },
5417*4882a593Smuzhiyun 		.frag_data = { 0x19, 0x82 },
5418*4882a593Smuzhiyun 	},
5419*4882a593Smuzhiyun 	{
5420*4882a593Smuzhiyun 		"LD_IND word mixed head/frag",
5421*4882a593Smuzhiyun 		.u.insns = {
5422*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x40),
5423*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5424*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5425*4882a593Smuzhiyun 		},
5426*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5427*4882a593Smuzhiyun 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5428*4882a593Smuzhiyun 		{ {0x40, 0x25051982} },
5429*4882a593Smuzhiyun 		.frag_data = { 0x19, 0x82 },
5430*4882a593Smuzhiyun 	},
5431*4882a593Smuzhiyun 	{
5432*4882a593Smuzhiyun 		"LD_ABS byte frag",
5433*4882a593Smuzhiyun 		.u.insns = {
5434*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x40),
5435*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5436*4882a593Smuzhiyun 		},
5437*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5438*4882a593Smuzhiyun 		{ },
5439*4882a593Smuzhiyun 		{ {0x40, 0x42} },
5440*4882a593Smuzhiyun 		.frag_data = {
5441*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5442*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5443*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5444*4882a593Smuzhiyun 		},
5445*4882a593Smuzhiyun 	},
5446*4882a593Smuzhiyun 	{
5447*4882a593Smuzhiyun 		"LD_ABS halfword frag",
5448*4882a593Smuzhiyun 		.u.insns = {
5449*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x44),
5450*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5451*4882a593Smuzhiyun 		},
5452*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5453*4882a593Smuzhiyun 		{ },
5454*4882a593Smuzhiyun 		{ {0x40, 0x4344} },
5455*4882a593Smuzhiyun 		.frag_data = {
5456*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5457*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5458*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5459*4882a593Smuzhiyun 		},
5460*4882a593Smuzhiyun 	},
5461*4882a593Smuzhiyun 	{
5462*4882a593Smuzhiyun 		"LD_ABS word frag",
5463*4882a593Smuzhiyun 		.u.insns = {
5464*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x48),
5465*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5466*4882a593Smuzhiyun 		},
5467*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5468*4882a593Smuzhiyun 		{ },
5469*4882a593Smuzhiyun 		{ {0x40, 0x21071983} },
5470*4882a593Smuzhiyun 		.frag_data = {
5471*4882a593Smuzhiyun 			0x42, 0x00, 0x00, 0x00,
5472*4882a593Smuzhiyun 			0x43, 0x44, 0x00, 0x00,
5473*4882a593Smuzhiyun 			0x21, 0x07, 0x19, 0x83,
5474*4882a593Smuzhiyun 		},
5475*4882a593Smuzhiyun 	},
5476*4882a593Smuzhiyun 	{
5477*4882a593Smuzhiyun 		"LD_ABS halfword mixed head/frag",
5478*4882a593Smuzhiyun 		.u.insns = {
5479*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5480*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5481*4882a593Smuzhiyun 		},
5482*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5483*4882a593Smuzhiyun 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5484*4882a593Smuzhiyun 		{ {0x40, 0x0519} },
5485*4882a593Smuzhiyun 		.frag_data = { 0x19, 0x82 },
5486*4882a593Smuzhiyun 	},
5487*4882a593Smuzhiyun 	{
5488*4882a593Smuzhiyun 		"LD_ABS word mixed head/frag",
5489*4882a593Smuzhiyun 		.u.insns = {
5490*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3e),
5491*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5492*4882a593Smuzhiyun 		},
5493*4882a593Smuzhiyun 		CLASSIC | FLAG_SKB_FRAG,
5494*4882a593Smuzhiyun 		{ [0x3e] = 0x25, [0x3f] = 0x05, },
5495*4882a593Smuzhiyun 		{ {0x40, 0x25051982} },
5496*4882a593Smuzhiyun 		.frag_data = { 0x19, 0x82 },
5497*4882a593Smuzhiyun 	},
5498*4882a593Smuzhiyun 	/*
5499*4882a593Smuzhiyun 	 * LD_IND / LD_ABS on non fragmented SKBs
5500*4882a593Smuzhiyun 	 */
5501*4882a593Smuzhiyun 	{
5502*4882a593Smuzhiyun 		/*
5503*4882a593Smuzhiyun 		 * this tests that the JIT/interpreter correctly resets X
5504*4882a593Smuzhiyun 		 * before using it in an LD_IND instruction.
5505*4882a593Smuzhiyun 		 */
5506*4882a593Smuzhiyun 		"LD_IND byte default X",
5507*4882a593Smuzhiyun 		.u.insns = {
5508*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5509*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5510*4882a593Smuzhiyun 		},
5511*4882a593Smuzhiyun 		CLASSIC,
5512*4882a593Smuzhiyun 		{ [0x1] = 0x42 },
5513*4882a593Smuzhiyun 		{ {0x40, 0x42 } },
5514*4882a593Smuzhiyun 	},
5515*4882a593Smuzhiyun 	{
5516*4882a593Smuzhiyun 		"LD_IND byte positive offset",
5517*4882a593Smuzhiyun 		.u.insns = {
5518*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5519*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5520*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5521*4882a593Smuzhiyun 		},
5522*4882a593Smuzhiyun 		CLASSIC,
5523*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5524*4882a593Smuzhiyun 		{ {0x40, 0x82 } },
5525*4882a593Smuzhiyun 	},
5526*4882a593Smuzhiyun 	{
5527*4882a593Smuzhiyun 		"LD_IND byte negative offset",
5528*4882a593Smuzhiyun 		.u.insns = {
5529*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5530*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x1),
5531*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5532*4882a593Smuzhiyun 		},
5533*4882a593Smuzhiyun 		CLASSIC,
5534*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5535*4882a593Smuzhiyun 		{ {0x40, 0x05 } },
5536*4882a593Smuzhiyun 	},
5537*4882a593Smuzhiyun 	{
5538*4882a593Smuzhiyun 		"LD_IND byte positive offset, all ff",
5539*4882a593Smuzhiyun 		.u.insns = {
5540*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5541*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5542*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5543*4882a593Smuzhiyun 		},
5544*4882a593Smuzhiyun 		CLASSIC,
5545*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5546*4882a593Smuzhiyun 		{ {0x40, 0xff } },
5547*4882a593Smuzhiyun 	},
5548*4882a593Smuzhiyun 	{
5549*4882a593Smuzhiyun 		"LD_IND byte positive offset, out of bounds",
5550*4882a593Smuzhiyun 		.u.insns = {
5551*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5552*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, 0x1),
5553*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5554*4882a593Smuzhiyun 		},
5555*4882a593Smuzhiyun 		CLASSIC,
5556*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5557*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5558*4882a593Smuzhiyun 	},
5559*4882a593Smuzhiyun 	{
5560*4882a593Smuzhiyun 		"LD_IND byte negative offset, out of bounds",
5561*4882a593Smuzhiyun 		.u.insns = {
5562*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5563*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, -0x3f),
5564*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5565*4882a593Smuzhiyun 		},
5566*4882a593Smuzhiyun 		CLASSIC,
5567*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5568*4882a593Smuzhiyun 		{ {0x3f, 0 } },
5569*4882a593Smuzhiyun 	},
5570*4882a593Smuzhiyun 	{
5571*4882a593Smuzhiyun 		"LD_IND byte negative offset, multiple calls",
5572*4882a593Smuzhiyun 		.u.insns = {
5573*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
5574*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 1),
5575*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 2),
5576*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 3),
5577*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_B, SKF_LL_OFF + 4),
5578*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5579*4882a593Smuzhiyun 		},
5580*4882a593Smuzhiyun 		CLASSIC,
5581*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5582*4882a593Smuzhiyun 		{ {0x40, 0x82 }, },
5583*4882a593Smuzhiyun 	},
5584*4882a593Smuzhiyun 	{
5585*4882a593Smuzhiyun 		"LD_IND halfword positive offset",
5586*4882a593Smuzhiyun 		.u.insns = {
5587*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5588*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x2),
5589*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5590*4882a593Smuzhiyun 		},
5591*4882a593Smuzhiyun 		CLASSIC,
5592*4882a593Smuzhiyun 		{
5593*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5594*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5595*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5596*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5597*4882a593Smuzhiyun 		},
5598*4882a593Smuzhiyun 		{ {0x40, 0xdd88 } },
5599*4882a593Smuzhiyun 	},
5600*4882a593Smuzhiyun 	{
5601*4882a593Smuzhiyun 		"LD_IND halfword negative offset",
5602*4882a593Smuzhiyun 		.u.insns = {
5603*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5604*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x2),
5605*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5606*4882a593Smuzhiyun 		},
5607*4882a593Smuzhiyun 		CLASSIC,
5608*4882a593Smuzhiyun 		{
5609*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5610*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5611*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5612*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5613*4882a593Smuzhiyun 		},
5614*4882a593Smuzhiyun 		{ {0x40, 0xbb66 } },
5615*4882a593Smuzhiyun 	},
5616*4882a593Smuzhiyun 	{
5617*4882a593Smuzhiyun 		"LD_IND halfword unaligned",
5618*4882a593Smuzhiyun 		.u.insns = {
5619*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5620*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x1),
5621*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5622*4882a593Smuzhiyun 		},
5623*4882a593Smuzhiyun 		CLASSIC,
5624*4882a593Smuzhiyun 		{
5625*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5626*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5627*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5628*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5629*4882a593Smuzhiyun 		},
5630*4882a593Smuzhiyun 		{ {0x40, 0x66cc } },
5631*4882a593Smuzhiyun 	},
5632*4882a593Smuzhiyun 	{
5633*4882a593Smuzhiyun 		"LD_IND halfword positive offset, all ff",
5634*4882a593Smuzhiyun 		.u.insns = {
5635*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3d),
5636*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
5637*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5638*4882a593Smuzhiyun 		},
5639*4882a593Smuzhiyun 		CLASSIC,
5640*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5641*4882a593Smuzhiyun 		{ {0x40, 0xffff } },
5642*4882a593Smuzhiyun 	},
5643*4882a593Smuzhiyun 	{
5644*4882a593Smuzhiyun 		"LD_IND halfword positive offset, out of bounds",
5645*4882a593Smuzhiyun 		.u.insns = {
5646*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5647*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, 0x1),
5648*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5649*4882a593Smuzhiyun 		},
5650*4882a593Smuzhiyun 		CLASSIC,
5651*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5652*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5653*4882a593Smuzhiyun 	},
5654*4882a593Smuzhiyun 	{
5655*4882a593Smuzhiyun 		"LD_IND halfword negative offset, out of bounds",
5656*4882a593Smuzhiyun 		.u.insns = {
5657*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5658*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_H, -0x3f),
5659*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5660*4882a593Smuzhiyun 		},
5661*4882a593Smuzhiyun 		CLASSIC,
5662*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5663*4882a593Smuzhiyun 		{ {0x3f, 0 } },
5664*4882a593Smuzhiyun 	},
5665*4882a593Smuzhiyun 	{
5666*4882a593Smuzhiyun 		"LD_IND word positive offset",
5667*4882a593Smuzhiyun 		.u.insns = {
5668*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5669*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x4),
5670*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5671*4882a593Smuzhiyun 		},
5672*4882a593Smuzhiyun 		CLASSIC,
5673*4882a593Smuzhiyun 		{
5674*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5675*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5676*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5677*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5678*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5679*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5680*4882a593Smuzhiyun 		},
5681*4882a593Smuzhiyun 		{ {0x40, 0xee99ffaa } },
5682*4882a593Smuzhiyun 	},
5683*4882a593Smuzhiyun 	{
5684*4882a593Smuzhiyun 		"LD_IND word negative offset",
5685*4882a593Smuzhiyun 		.u.insns = {
5686*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5687*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x4),
5688*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5689*4882a593Smuzhiyun 		},
5690*4882a593Smuzhiyun 		CLASSIC,
5691*4882a593Smuzhiyun 		{
5692*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5693*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5694*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5695*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5696*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5697*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5698*4882a593Smuzhiyun 		},
5699*4882a593Smuzhiyun 		{ {0x40, 0xaa55bb66 } },
5700*4882a593Smuzhiyun 	},
5701*4882a593Smuzhiyun 	{
5702*4882a593Smuzhiyun 		"LD_IND word unaligned (addr & 3 == 2)",
5703*4882a593Smuzhiyun 		.u.insns = {
5704*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5705*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x2),
5706*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5707*4882a593Smuzhiyun 		},
5708*4882a593Smuzhiyun 		CLASSIC,
5709*4882a593Smuzhiyun 		{
5710*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5711*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5712*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5713*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5714*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5715*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5716*4882a593Smuzhiyun 		},
5717*4882a593Smuzhiyun 		{ {0x40, 0xbb66cc77 } },
5718*4882a593Smuzhiyun 	},
5719*4882a593Smuzhiyun 	{
5720*4882a593Smuzhiyun 		"LD_IND word unaligned (addr & 3 == 1)",
5721*4882a593Smuzhiyun 		.u.insns = {
5722*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5723*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3),
5724*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5725*4882a593Smuzhiyun 		},
5726*4882a593Smuzhiyun 		CLASSIC,
5727*4882a593Smuzhiyun 		{
5728*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5729*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5730*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5731*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5732*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5733*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5734*4882a593Smuzhiyun 		},
5735*4882a593Smuzhiyun 		{ {0x40, 0x55bb66cc } },
5736*4882a593Smuzhiyun 	},
5737*4882a593Smuzhiyun 	{
5738*4882a593Smuzhiyun 		"LD_IND word unaligned (addr & 3 == 3)",
5739*4882a593Smuzhiyun 		.u.insns = {
5740*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x20),
5741*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x1),
5742*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5743*4882a593Smuzhiyun 		},
5744*4882a593Smuzhiyun 		CLASSIC,
5745*4882a593Smuzhiyun 		{
5746*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5747*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5748*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5749*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5750*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5751*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5752*4882a593Smuzhiyun 		},
5753*4882a593Smuzhiyun 		{ {0x40, 0x66cc77dd } },
5754*4882a593Smuzhiyun 	},
5755*4882a593Smuzhiyun 	{
5756*4882a593Smuzhiyun 		"LD_IND word positive offset, all ff",
5757*4882a593Smuzhiyun 		.u.insns = {
5758*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3b),
5759*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
5760*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5761*4882a593Smuzhiyun 		},
5762*4882a593Smuzhiyun 		CLASSIC,
5763*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5764*4882a593Smuzhiyun 		{ {0x40, 0xffffffff } },
5765*4882a593Smuzhiyun 	},
5766*4882a593Smuzhiyun 	{
5767*4882a593Smuzhiyun 		"LD_IND word positive offset, out of bounds",
5768*4882a593Smuzhiyun 		.u.insns = {
5769*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5770*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, 0x1),
5771*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5772*4882a593Smuzhiyun 		},
5773*4882a593Smuzhiyun 		CLASSIC,
5774*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5775*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5776*4882a593Smuzhiyun 	},
5777*4882a593Smuzhiyun 	{
5778*4882a593Smuzhiyun 		"LD_IND word negative offset, out of bounds",
5779*4882a593Smuzhiyun 		.u.insns = {
5780*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_IMM, 0x3e),
5781*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IND | BPF_W, -0x3f),
5782*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5783*4882a593Smuzhiyun 		},
5784*4882a593Smuzhiyun 		CLASSIC,
5785*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5786*4882a593Smuzhiyun 		{ {0x3f, 0 } },
5787*4882a593Smuzhiyun 	},
5788*4882a593Smuzhiyun 	{
5789*4882a593Smuzhiyun 		"LD_ABS byte",
5790*4882a593Smuzhiyun 		.u.insns = {
5791*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x20),
5792*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5793*4882a593Smuzhiyun 		},
5794*4882a593Smuzhiyun 		CLASSIC,
5795*4882a593Smuzhiyun 		{
5796*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5797*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5798*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5799*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5800*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5801*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5802*4882a593Smuzhiyun 		},
5803*4882a593Smuzhiyun 		{ {0x40, 0xcc } },
5804*4882a593Smuzhiyun 	},
5805*4882a593Smuzhiyun 	{
5806*4882a593Smuzhiyun 		"LD_ABS byte positive offset, all ff",
5807*4882a593Smuzhiyun 		.u.insns = {
5808*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
5809*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5810*4882a593Smuzhiyun 		},
5811*4882a593Smuzhiyun 		CLASSIC,
5812*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5813*4882a593Smuzhiyun 		{ {0x40, 0xff } },
5814*4882a593Smuzhiyun 	},
5815*4882a593Smuzhiyun 	{
5816*4882a593Smuzhiyun 		"LD_ABS byte positive offset, out of bounds",
5817*4882a593Smuzhiyun 		.u.insns = {
5818*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, 0x3f),
5819*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5820*4882a593Smuzhiyun 		},
5821*4882a593Smuzhiyun 		CLASSIC,
5822*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5823*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5824*4882a593Smuzhiyun 	},
5825*4882a593Smuzhiyun 	{
5826*4882a593Smuzhiyun 		"LD_ABS byte negative offset, out of bounds load",
5827*4882a593Smuzhiyun 		.u.insns = {
5828*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, -1),
5829*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5830*4882a593Smuzhiyun 		},
5831*4882a593Smuzhiyun 		CLASSIC | FLAG_EXPECTED_FAIL,
5832*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
5833*4882a593Smuzhiyun 	},
5834*4882a593Smuzhiyun 	{
5835*4882a593Smuzhiyun 		"LD_ABS byte negative offset, in bounds",
5836*4882a593Smuzhiyun 		.u.insns = {
5837*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5838*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5839*4882a593Smuzhiyun 		},
5840*4882a593Smuzhiyun 		CLASSIC,
5841*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5842*4882a593Smuzhiyun 		{ {0x40, 0x82 }, },
5843*4882a593Smuzhiyun 	},
5844*4882a593Smuzhiyun 	{
5845*4882a593Smuzhiyun 		"LD_ABS byte negative offset, out of bounds",
5846*4882a593Smuzhiyun 		.u.insns = {
5847*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5848*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5849*4882a593Smuzhiyun 		},
5850*4882a593Smuzhiyun 		CLASSIC,
5851*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5852*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5853*4882a593Smuzhiyun 	},
5854*4882a593Smuzhiyun 	{
5855*4882a593Smuzhiyun 		"LD_ABS byte negative offset, multiple calls",
5856*4882a593Smuzhiyun 		.u.insns = {
5857*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3c),
5858*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3d),
5859*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3e),
5860*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_B, SKF_LL_OFF + 0x3f),
5861*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5862*4882a593Smuzhiyun 		},
5863*4882a593Smuzhiyun 		CLASSIC,
5864*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5865*4882a593Smuzhiyun 		{ {0x40, 0x82 }, },
5866*4882a593Smuzhiyun 	},
5867*4882a593Smuzhiyun 	{
5868*4882a593Smuzhiyun 		"LD_ABS halfword",
5869*4882a593Smuzhiyun 		.u.insns = {
5870*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x22),
5871*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5872*4882a593Smuzhiyun 		},
5873*4882a593Smuzhiyun 		CLASSIC,
5874*4882a593Smuzhiyun 		{
5875*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5876*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5877*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5878*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5879*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5880*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5881*4882a593Smuzhiyun 		},
5882*4882a593Smuzhiyun 		{ {0x40, 0xdd88 } },
5883*4882a593Smuzhiyun 	},
5884*4882a593Smuzhiyun 	{
5885*4882a593Smuzhiyun 		"LD_ABS halfword unaligned",
5886*4882a593Smuzhiyun 		.u.insns = {
5887*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x25),
5888*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5889*4882a593Smuzhiyun 		},
5890*4882a593Smuzhiyun 		CLASSIC,
5891*4882a593Smuzhiyun 		{
5892*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5893*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5894*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5895*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5896*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5897*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5898*4882a593Smuzhiyun 		},
5899*4882a593Smuzhiyun 		{ {0x40, 0x99ff } },
5900*4882a593Smuzhiyun 	},
5901*4882a593Smuzhiyun 	{
5902*4882a593Smuzhiyun 		"LD_ABS halfword positive offset, all ff",
5903*4882a593Smuzhiyun 		.u.insns = {
5904*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3e),
5905*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5906*4882a593Smuzhiyun 		},
5907*4882a593Smuzhiyun 		CLASSIC,
5908*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
5909*4882a593Smuzhiyun 		{ {0x40, 0xffff } },
5910*4882a593Smuzhiyun 	},
5911*4882a593Smuzhiyun 	{
5912*4882a593Smuzhiyun 		"LD_ABS halfword positive offset, out of bounds",
5913*4882a593Smuzhiyun 		.u.insns = {
5914*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, 0x3f),
5915*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5916*4882a593Smuzhiyun 		},
5917*4882a593Smuzhiyun 		CLASSIC,
5918*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5919*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5920*4882a593Smuzhiyun 	},
5921*4882a593Smuzhiyun 	{
5922*4882a593Smuzhiyun 		"LD_ABS halfword negative offset, out of bounds load",
5923*4882a593Smuzhiyun 		.u.insns = {
5924*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, -1),
5925*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5926*4882a593Smuzhiyun 		},
5927*4882a593Smuzhiyun 		CLASSIC | FLAG_EXPECTED_FAIL,
5928*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
5929*4882a593Smuzhiyun 	},
5930*4882a593Smuzhiyun 	{
5931*4882a593Smuzhiyun 		"LD_ABS halfword negative offset, in bounds",
5932*4882a593Smuzhiyun 		.u.insns = {
5933*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
5934*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5935*4882a593Smuzhiyun 		},
5936*4882a593Smuzhiyun 		CLASSIC,
5937*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5938*4882a593Smuzhiyun 		{ {0x40, 0x1982 }, },
5939*4882a593Smuzhiyun 	},
5940*4882a593Smuzhiyun 	{
5941*4882a593Smuzhiyun 		"LD_ABS halfword negative offset, out of bounds",
5942*4882a593Smuzhiyun 		.u.insns = {
5943*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_H, SKF_LL_OFF + 0x3e),
5944*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5945*4882a593Smuzhiyun 		},
5946*4882a593Smuzhiyun 		CLASSIC,
5947*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
5948*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
5949*4882a593Smuzhiyun 	},
5950*4882a593Smuzhiyun 	{
5951*4882a593Smuzhiyun 		"LD_ABS word",
5952*4882a593Smuzhiyun 		.u.insns = {
5953*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x1c),
5954*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5955*4882a593Smuzhiyun 		},
5956*4882a593Smuzhiyun 		CLASSIC,
5957*4882a593Smuzhiyun 		{
5958*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5959*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5960*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5961*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5962*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5963*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5964*4882a593Smuzhiyun 		},
5965*4882a593Smuzhiyun 		{ {0x40, 0xaa55bb66 } },
5966*4882a593Smuzhiyun 	},
5967*4882a593Smuzhiyun 	{
5968*4882a593Smuzhiyun 		"LD_ABS word unaligned (addr & 3 == 2)",
5969*4882a593Smuzhiyun 		.u.insns = {
5970*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x22),
5971*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5972*4882a593Smuzhiyun 		},
5973*4882a593Smuzhiyun 		CLASSIC,
5974*4882a593Smuzhiyun 		{
5975*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5976*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5977*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5978*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5979*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5980*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5981*4882a593Smuzhiyun 		},
5982*4882a593Smuzhiyun 		{ {0x40, 0xdd88ee99 } },
5983*4882a593Smuzhiyun 	},
5984*4882a593Smuzhiyun 	{
5985*4882a593Smuzhiyun 		"LD_ABS word unaligned (addr & 3 == 1)",
5986*4882a593Smuzhiyun 		.u.insns = {
5987*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x21),
5988*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
5989*4882a593Smuzhiyun 		},
5990*4882a593Smuzhiyun 		CLASSIC,
5991*4882a593Smuzhiyun 		{
5992*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
5993*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
5994*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
5995*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
5996*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
5997*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
5998*4882a593Smuzhiyun 		},
5999*4882a593Smuzhiyun 		{ {0x40, 0x77dd88ee } },
6000*4882a593Smuzhiyun 	},
6001*4882a593Smuzhiyun 	{
6002*4882a593Smuzhiyun 		"LD_ABS word unaligned (addr & 3 == 3)",
6003*4882a593Smuzhiyun 		.u.insns = {
6004*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x23),
6005*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6006*4882a593Smuzhiyun 		},
6007*4882a593Smuzhiyun 		CLASSIC,
6008*4882a593Smuzhiyun 		{
6009*4882a593Smuzhiyun 			[0x1c] = 0xaa, [0x1d] = 0x55,
6010*4882a593Smuzhiyun 			[0x1e] = 0xbb, [0x1f] = 0x66,
6011*4882a593Smuzhiyun 			[0x20] = 0xcc, [0x21] = 0x77,
6012*4882a593Smuzhiyun 			[0x22] = 0xdd, [0x23] = 0x88,
6013*4882a593Smuzhiyun 			[0x24] = 0xee, [0x25] = 0x99,
6014*4882a593Smuzhiyun 			[0x26] = 0xff, [0x27] = 0xaa,
6015*4882a593Smuzhiyun 		},
6016*4882a593Smuzhiyun 		{ {0x40, 0x88ee99ff } },
6017*4882a593Smuzhiyun 	},
6018*4882a593Smuzhiyun 	{
6019*4882a593Smuzhiyun 		"LD_ABS word positive offset, all ff",
6020*4882a593Smuzhiyun 		.u.insns = {
6021*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3c),
6022*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6023*4882a593Smuzhiyun 		},
6024*4882a593Smuzhiyun 		CLASSIC,
6025*4882a593Smuzhiyun 		{ [0x3c] = 0xff, [0x3d] = 0xff,  [0x3e] = 0xff, [0x3f] = 0xff },
6026*4882a593Smuzhiyun 		{ {0x40, 0xffffffff } },
6027*4882a593Smuzhiyun 	},
6028*4882a593Smuzhiyun 	{
6029*4882a593Smuzhiyun 		"LD_ABS word positive offset, out of bounds",
6030*4882a593Smuzhiyun 		.u.insns = {
6031*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, 0x3f),
6032*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6033*4882a593Smuzhiyun 		},
6034*4882a593Smuzhiyun 		CLASSIC,
6035*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6036*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
6037*4882a593Smuzhiyun 	},
6038*4882a593Smuzhiyun 	{
6039*4882a593Smuzhiyun 		"LD_ABS word negative offset, out of bounds load",
6040*4882a593Smuzhiyun 		.u.insns = {
6041*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, -1),
6042*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6043*4882a593Smuzhiyun 		},
6044*4882a593Smuzhiyun 		CLASSIC | FLAG_EXPECTED_FAIL,
6045*4882a593Smuzhiyun 		.expected_errcode = -EINVAL,
6046*4882a593Smuzhiyun 	},
6047*4882a593Smuzhiyun 	{
6048*4882a593Smuzhiyun 		"LD_ABS word negative offset, in bounds",
6049*4882a593Smuzhiyun 		.u.insns = {
6050*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
6051*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6052*4882a593Smuzhiyun 		},
6053*4882a593Smuzhiyun 		CLASSIC,
6054*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6055*4882a593Smuzhiyun 		{ {0x40, 0x25051982 }, },
6056*4882a593Smuzhiyun 	},
6057*4882a593Smuzhiyun 	{
6058*4882a593Smuzhiyun 		"LD_ABS word negative offset, out of bounds",
6059*4882a593Smuzhiyun 		.u.insns = {
6060*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_ABS | BPF_W, SKF_LL_OFF + 0x3c),
6061*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6062*4882a593Smuzhiyun 		},
6063*4882a593Smuzhiyun 		CLASSIC,
6064*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6065*4882a593Smuzhiyun 		{ {0x3f, 0 }, },
6066*4882a593Smuzhiyun 	},
6067*4882a593Smuzhiyun 	{
6068*4882a593Smuzhiyun 		"LDX_MSH standalone, preserved A",
6069*4882a593Smuzhiyun 		.u.insns = {
6070*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6071*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
6072*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6073*4882a593Smuzhiyun 		},
6074*4882a593Smuzhiyun 		CLASSIC,
6075*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6076*4882a593Smuzhiyun 		{ {0x40, 0xffeebbaa }, },
6077*4882a593Smuzhiyun 	},
6078*4882a593Smuzhiyun 	{
6079*4882a593Smuzhiyun 		"LDX_MSH standalone, preserved A 2",
6080*4882a593Smuzhiyun 		.u.insns = {
6081*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x175e9d63),
6082*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
6083*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3d),
6084*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
6085*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3f),
6086*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6087*4882a593Smuzhiyun 		},
6088*4882a593Smuzhiyun 		CLASSIC,
6089*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6090*4882a593Smuzhiyun 		{ {0x40, 0x175e9d63 }, },
6091*4882a593Smuzhiyun 	},
6092*4882a593Smuzhiyun 	{
6093*4882a593Smuzhiyun 		"LDX_MSH standalone, test result 1",
6094*4882a593Smuzhiyun 		.u.insns = {
6095*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6096*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3c),
6097*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6098*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6099*4882a593Smuzhiyun 		},
6100*4882a593Smuzhiyun 		CLASSIC,
6101*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6102*4882a593Smuzhiyun 		{ {0x40, 0x14 }, },
6103*4882a593Smuzhiyun 	},
6104*4882a593Smuzhiyun 	{
6105*4882a593Smuzhiyun 		"LDX_MSH standalone, test result 2",
6106*4882a593Smuzhiyun 		.u.insns = {
6107*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6108*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x3e),
6109*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6110*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6111*4882a593Smuzhiyun 		},
6112*4882a593Smuzhiyun 		CLASSIC,
6113*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6114*4882a593Smuzhiyun 		{ {0x40, 0x24 }, },
6115*4882a593Smuzhiyun 	},
6116*4882a593Smuzhiyun 	{
6117*4882a593Smuzhiyun 		"LDX_MSH standalone, negative offset",
6118*4882a593Smuzhiyun 		.u.insns = {
6119*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6120*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, -1),
6121*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6122*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6123*4882a593Smuzhiyun 		},
6124*4882a593Smuzhiyun 		CLASSIC,
6125*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6126*4882a593Smuzhiyun 		{ {0x40, 0 }, },
6127*4882a593Smuzhiyun 	},
6128*4882a593Smuzhiyun 	{
6129*4882a593Smuzhiyun 		"LDX_MSH standalone, negative offset 2",
6130*4882a593Smuzhiyun 		.u.insns = {
6131*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6132*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, SKF_LL_OFF + 0x3e),
6133*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6134*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6135*4882a593Smuzhiyun 		},
6136*4882a593Smuzhiyun 		CLASSIC,
6137*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6138*4882a593Smuzhiyun 		{ {0x40, 0x24 }, },
6139*4882a593Smuzhiyun 	},
6140*4882a593Smuzhiyun 	{
6141*4882a593Smuzhiyun 		"LDX_MSH standalone, out of bounds",
6142*4882a593Smuzhiyun 		.u.insns = {
6143*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffeebbaa),
6144*4882a593Smuzhiyun 			BPF_STMT(BPF_LDX | BPF_B | BPF_MSH, 0x40),
6145*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TXA, 0),
6146*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6147*4882a593Smuzhiyun 		},
6148*4882a593Smuzhiyun 		CLASSIC,
6149*4882a593Smuzhiyun 		{ [0x3c] = 0x25, [0x3d] = 0x05,  [0x3e] = 0x19, [0x3f] = 0x82 },
6150*4882a593Smuzhiyun 		{ {0x40, 0 }, },
6151*4882a593Smuzhiyun 	},
6152*4882a593Smuzhiyun 	/*
6153*4882a593Smuzhiyun 	 * verify that the interpreter or JIT correctly sets A and X
6154*4882a593Smuzhiyun 	 * to 0.
6155*4882a593Smuzhiyun 	 */
6156*4882a593Smuzhiyun 	{
6157*4882a593Smuzhiyun 		"ADD default X",
6158*4882a593Smuzhiyun 		.u.insns = {
6159*4882a593Smuzhiyun 			/*
6160*4882a593Smuzhiyun 			 * A = 0x42
6161*4882a593Smuzhiyun 			 * A = A + X
6162*4882a593Smuzhiyun 			 * ret A
6163*4882a593Smuzhiyun 			 */
6164*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6165*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_X, 0),
6166*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6167*4882a593Smuzhiyun 		},
6168*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6169*4882a593Smuzhiyun 		{},
6170*4882a593Smuzhiyun 		{ {0x1, 0x42 } },
6171*4882a593Smuzhiyun 	},
6172*4882a593Smuzhiyun 	{
6173*4882a593Smuzhiyun 		"ADD default A",
6174*4882a593Smuzhiyun 		.u.insns = {
6175*4882a593Smuzhiyun 			/*
6176*4882a593Smuzhiyun 			 * A = A + 0x42
6177*4882a593Smuzhiyun 			 * ret A
6178*4882a593Smuzhiyun 			 */
6179*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x42),
6180*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6181*4882a593Smuzhiyun 		},
6182*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6183*4882a593Smuzhiyun 		{},
6184*4882a593Smuzhiyun 		{ {0x1, 0x42 } },
6185*4882a593Smuzhiyun 	},
6186*4882a593Smuzhiyun 	{
6187*4882a593Smuzhiyun 		"SUB default X",
6188*4882a593Smuzhiyun 		.u.insns = {
6189*4882a593Smuzhiyun 			/*
6190*4882a593Smuzhiyun 			 * A = 0x66
6191*4882a593Smuzhiyun 			 * A = A - X
6192*4882a593Smuzhiyun 			 * ret A
6193*4882a593Smuzhiyun 			 */
6194*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x66),
6195*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0),
6196*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6197*4882a593Smuzhiyun 		},
6198*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6199*4882a593Smuzhiyun 		{},
6200*4882a593Smuzhiyun 		{ {0x1, 0x66 } },
6201*4882a593Smuzhiyun 	},
6202*4882a593Smuzhiyun 	{
6203*4882a593Smuzhiyun 		"SUB default A",
6204*4882a593Smuzhiyun 		.u.insns = {
6205*4882a593Smuzhiyun 			/*
6206*4882a593Smuzhiyun 			 * A = A - -0x66
6207*4882a593Smuzhiyun 			 * ret A
6208*4882a593Smuzhiyun 			 */
6209*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_SUB | BPF_K, -0x66),
6210*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6211*4882a593Smuzhiyun 		},
6212*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6213*4882a593Smuzhiyun 		{},
6214*4882a593Smuzhiyun 		{ {0x1, 0x66 } },
6215*4882a593Smuzhiyun 	},
6216*4882a593Smuzhiyun 	{
6217*4882a593Smuzhiyun 		"MUL default X",
6218*4882a593Smuzhiyun 		.u.insns = {
6219*4882a593Smuzhiyun 			/*
6220*4882a593Smuzhiyun 			 * A = 0x42
6221*4882a593Smuzhiyun 			 * A = A * X
6222*4882a593Smuzhiyun 			 * ret A
6223*4882a593Smuzhiyun 			 */
6224*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6225*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_X, 0),
6226*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6227*4882a593Smuzhiyun 		},
6228*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6229*4882a593Smuzhiyun 		{},
6230*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6231*4882a593Smuzhiyun 	},
6232*4882a593Smuzhiyun 	{
6233*4882a593Smuzhiyun 		"MUL default A",
6234*4882a593Smuzhiyun 		.u.insns = {
6235*4882a593Smuzhiyun 			/*
6236*4882a593Smuzhiyun 			 * A = A * 0x66
6237*4882a593Smuzhiyun 			 * ret A
6238*4882a593Smuzhiyun 			 */
6239*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x66),
6240*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6241*4882a593Smuzhiyun 		},
6242*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6243*4882a593Smuzhiyun 		{},
6244*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6245*4882a593Smuzhiyun 	},
6246*4882a593Smuzhiyun 	{
6247*4882a593Smuzhiyun 		"DIV default X",
6248*4882a593Smuzhiyun 		.u.insns = {
6249*4882a593Smuzhiyun 			/*
6250*4882a593Smuzhiyun 			 * A = 0x42
6251*4882a593Smuzhiyun 			 * A = A / X ; this halt the filter execution if X is 0
6252*4882a593Smuzhiyun 			 * ret 0x42
6253*4882a593Smuzhiyun 			 */
6254*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6255*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0),
6256*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6257*4882a593Smuzhiyun 		},
6258*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6259*4882a593Smuzhiyun 		{},
6260*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6261*4882a593Smuzhiyun 	},
6262*4882a593Smuzhiyun 	{
6263*4882a593Smuzhiyun 		"DIV default A",
6264*4882a593Smuzhiyun 		.u.insns = {
6265*4882a593Smuzhiyun 			/*
6266*4882a593Smuzhiyun 			 * A = A / 1
6267*4882a593Smuzhiyun 			 * ret A
6268*4882a593Smuzhiyun 			 */
6269*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_DIV | BPF_K, 0x1),
6270*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6271*4882a593Smuzhiyun 		},
6272*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6273*4882a593Smuzhiyun 		{},
6274*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6275*4882a593Smuzhiyun 	},
6276*4882a593Smuzhiyun 	{
6277*4882a593Smuzhiyun 		"MOD default X",
6278*4882a593Smuzhiyun 		.u.insns = {
6279*4882a593Smuzhiyun 			/*
6280*4882a593Smuzhiyun 			 * A = 0x42
6281*4882a593Smuzhiyun 			 * A = A mod X ; this halt the filter execution if X is 0
6282*4882a593Smuzhiyun 			 * ret 0x42
6283*4882a593Smuzhiyun 			 */
6284*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x42),
6285*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_X, 0),
6286*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6287*4882a593Smuzhiyun 		},
6288*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6289*4882a593Smuzhiyun 		{},
6290*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6291*4882a593Smuzhiyun 	},
6292*4882a593Smuzhiyun 	{
6293*4882a593Smuzhiyun 		"MOD default A",
6294*4882a593Smuzhiyun 		.u.insns = {
6295*4882a593Smuzhiyun 			/*
6296*4882a593Smuzhiyun 			 * A = A mod 1
6297*4882a593Smuzhiyun 			 * ret A
6298*4882a593Smuzhiyun 			 */
6299*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_MOD | BPF_K, 0x1),
6300*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_A, 0x0),
6301*4882a593Smuzhiyun 		},
6302*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6303*4882a593Smuzhiyun 		{},
6304*4882a593Smuzhiyun 		{ {0x1, 0x0 } },
6305*4882a593Smuzhiyun 	},
6306*4882a593Smuzhiyun 	{
6307*4882a593Smuzhiyun 		"JMP EQ default A",
6308*4882a593Smuzhiyun 		.u.insns = {
6309*4882a593Smuzhiyun 			/*
6310*4882a593Smuzhiyun 			 * cmp A, 0x0, 0, 1
6311*4882a593Smuzhiyun 			 * ret 0x42
6312*4882a593Smuzhiyun 			 * ret 0x66
6313*4882a593Smuzhiyun 			 */
6314*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x0, 0, 1),
6315*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6316*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6317*4882a593Smuzhiyun 		},
6318*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6319*4882a593Smuzhiyun 		{},
6320*4882a593Smuzhiyun 		{ {0x1, 0x42 } },
6321*4882a593Smuzhiyun 	},
6322*4882a593Smuzhiyun 	{
6323*4882a593Smuzhiyun 		"JMP EQ default X",
6324*4882a593Smuzhiyun 		.u.insns = {
6325*4882a593Smuzhiyun 			/*
6326*4882a593Smuzhiyun 			 * A = 0x0
6327*4882a593Smuzhiyun 			 * cmp A, X, 0, 1
6328*4882a593Smuzhiyun 			 * ret 0x42
6329*4882a593Smuzhiyun 			 * ret 0x66
6330*4882a593Smuzhiyun 			 */
6331*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0x0),
6332*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0x0, 0, 1),
6333*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x42),
6334*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 0x66),
6335*4882a593Smuzhiyun 		},
6336*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6337*4882a593Smuzhiyun 		{},
6338*4882a593Smuzhiyun 		{ {0x1, 0x42 } },
6339*4882a593Smuzhiyun 	},
6340*4882a593Smuzhiyun 	/* Checking interpreter vs JIT wrt signed extended imms. */
6341*4882a593Smuzhiyun 	{
6342*4882a593Smuzhiyun 		"JNE signed compare, test 1",
6343*4882a593Smuzhiyun 		.u.insns_int = {
6344*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6345*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6346*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
6347*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_AND, R2, R3),
6348*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6349*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R2, -17104896, 1),
6350*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6351*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6352*4882a593Smuzhiyun 		},
6353*4882a593Smuzhiyun 		INTERNAL,
6354*4882a593Smuzhiyun 		{ },
6355*4882a593Smuzhiyun 		{ { 0, 1 } },
6356*4882a593Smuzhiyun 	},
6357*4882a593Smuzhiyun 	{
6358*4882a593Smuzhiyun 		"JNE signed compare, test 2",
6359*4882a593Smuzhiyun 		.u.insns_int = {
6360*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6361*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6362*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
6363*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_AND, R2, R3),
6364*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6365*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R2, 0xfefb0000, 1),
6366*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6367*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6368*4882a593Smuzhiyun 		},
6369*4882a593Smuzhiyun 		INTERNAL,
6370*4882a593Smuzhiyun 		{ },
6371*4882a593Smuzhiyun 		{ { 0, 1 } },
6372*4882a593Smuzhiyun 	},
6373*4882a593Smuzhiyun 	{
6374*4882a593Smuzhiyun 		"JNE signed compare, test 3",
6375*4882a593Smuzhiyun 		.u.insns_int = {
6376*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R1, 0xfefbbc12),
6377*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R3, 0xffff0000),
6378*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R4, 0xfefb0000),
6379*4882a593Smuzhiyun 			BPF_MOV64_REG(R2, R1),
6380*4882a593Smuzhiyun 			BPF_ALU64_REG(BPF_AND, R2, R3),
6381*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6382*4882a593Smuzhiyun 			BPF_JMP_REG(BPF_JNE, R2, R4, 1),
6383*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6384*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6385*4882a593Smuzhiyun 		},
6386*4882a593Smuzhiyun 		INTERNAL,
6387*4882a593Smuzhiyun 		{ },
6388*4882a593Smuzhiyun 		{ { 0, 2 } },
6389*4882a593Smuzhiyun 	},
6390*4882a593Smuzhiyun 	{
6391*4882a593Smuzhiyun 		"JNE signed compare, test 4",
6392*4882a593Smuzhiyun 		.u.insns_int = {
6393*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, -17104896),
6394*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6395*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R1, -17104896, 1),
6396*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6397*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6398*4882a593Smuzhiyun 		},
6399*4882a593Smuzhiyun 		INTERNAL,
6400*4882a593Smuzhiyun 		{ },
6401*4882a593Smuzhiyun 		{ { 0, 2 } },
6402*4882a593Smuzhiyun 	},
6403*4882a593Smuzhiyun 	{
6404*4882a593Smuzhiyun 		"JNE signed compare, test 5",
6405*4882a593Smuzhiyun 		.u.insns_int = {
6406*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0xfefb0000),
6407*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6408*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R1, 0xfefb0000, 1),
6409*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6410*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6411*4882a593Smuzhiyun 		},
6412*4882a593Smuzhiyun 		INTERNAL,
6413*4882a593Smuzhiyun 		{ },
6414*4882a593Smuzhiyun 		{ { 0, 1 } },
6415*4882a593Smuzhiyun 	},
6416*4882a593Smuzhiyun 	{
6417*4882a593Smuzhiyun 		"JNE signed compare, test 6",
6418*4882a593Smuzhiyun 		.u.insns_int = {
6419*4882a593Smuzhiyun 			BPF_LD_IMM64(R1, 0x7efb0000),
6420*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 1),
6421*4882a593Smuzhiyun 			BPF_JMP_IMM(BPF_JNE, R1, 0x7efb0000, 1),
6422*4882a593Smuzhiyun 			BPF_ALU32_IMM(BPF_MOV, R0, 2),
6423*4882a593Smuzhiyun 			BPF_EXIT_INSN(),
6424*4882a593Smuzhiyun 		},
6425*4882a593Smuzhiyun 		INTERNAL,
6426*4882a593Smuzhiyun 		{ },
6427*4882a593Smuzhiyun 		{ { 0, 2 } },
6428*4882a593Smuzhiyun 	},
6429*4882a593Smuzhiyun 	{
6430*4882a593Smuzhiyun 		"JNE signed compare, test 7",
6431*4882a593Smuzhiyun 		.u.insns = {
6432*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xffff0000),
6433*4882a593Smuzhiyun 			BPF_STMT(BPF_MISC | BPF_TAX, 0),
6434*4882a593Smuzhiyun 			BPF_STMT(BPF_LD | BPF_IMM, 0xfefbbc12),
6435*4882a593Smuzhiyun 			BPF_STMT(BPF_ALU | BPF_AND | BPF_X, 0),
6436*4882a593Smuzhiyun 			BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xfefb0000, 1, 0),
6437*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 1),
6438*4882a593Smuzhiyun 			BPF_STMT(BPF_RET | BPF_K, 2),
6439*4882a593Smuzhiyun 		},
6440*4882a593Smuzhiyun 		CLASSIC | FLAG_NO_DATA,
6441*4882a593Smuzhiyun 		{},
6442*4882a593Smuzhiyun 		{ { 0, 2 } },
6443*4882a593Smuzhiyun 	},
6444*4882a593Smuzhiyun };
6445*4882a593Smuzhiyun 
6446*4882a593Smuzhiyun static struct net_device dev;
6447*4882a593Smuzhiyun 
populate_skb(char * buf,int size)6448*4882a593Smuzhiyun static struct sk_buff *populate_skb(char *buf, int size)
6449*4882a593Smuzhiyun {
6450*4882a593Smuzhiyun 	struct sk_buff *skb;
6451*4882a593Smuzhiyun 
6452*4882a593Smuzhiyun 	if (size >= MAX_DATA)
6453*4882a593Smuzhiyun 		return NULL;
6454*4882a593Smuzhiyun 
6455*4882a593Smuzhiyun 	skb = alloc_skb(MAX_DATA, GFP_KERNEL);
6456*4882a593Smuzhiyun 	if (!skb)
6457*4882a593Smuzhiyun 		return NULL;
6458*4882a593Smuzhiyun 
6459*4882a593Smuzhiyun 	__skb_put_data(skb, buf, size);
6460*4882a593Smuzhiyun 
6461*4882a593Smuzhiyun 	/* Initialize a fake skb with test pattern. */
6462*4882a593Smuzhiyun 	skb_reset_mac_header(skb);
6463*4882a593Smuzhiyun 	skb->protocol = htons(ETH_P_IP);
6464*4882a593Smuzhiyun 	skb->pkt_type = SKB_TYPE;
6465*4882a593Smuzhiyun 	skb->mark = SKB_MARK;
6466*4882a593Smuzhiyun 	skb->hash = SKB_HASH;
6467*4882a593Smuzhiyun 	skb->queue_mapping = SKB_QUEUE_MAP;
6468*4882a593Smuzhiyun 	skb->vlan_tci = SKB_VLAN_TCI;
6469*4882a593Smuzhiyun 	skb->vlan_present = SKB_VLAN_PRESENT;
6470*4882a593Smuzhiyun 	skb->vlan_proto = htons(ETH_P_IP);
6471*4882a593Smuzhiyun 	dev_net_set(&dev, &init_net);
6472*4882a593Smuzhiyun 	skb->dev = &dev;
6473*4882a593Smuzhiyun 	skb->dev->ifindex = SKB_DEV_IFINDEX;
6474*4882a593Smuzhiyun 	skb->dev->type = SKB_DEV_TYPE;
6475*4882a593Smuzhiyun 	skb_set_network_header(skb, min(size, ETH_HLEN));
6476*4882a593Smuzhiyun 
6477*4882a593Smuzhiyun 	return skb;
6478*4882a593Smuzhiyun }
6479*4882a593Smuzhiyun 
generate_test_data(struct bpf_test * test,int sub)6480*4882a593Smuzhiyun static void *generate_test_data(struct bpf_test *test, int sub)
6481*4882a593Smuzhiyun {
6482*4882a593Smuzhiyun 	struct sk_buff *skb;
6483*4882a593Smuzhiyun 	struct page *page;
6484*4882a593Smuzhiyun 
6485*4882a593Smuzhiyun 	if (test->aux & FLAG_NO_DATA)
6486*4882a593Smuzhiyun 		return NULL;
6487*4882a593Smuzhiyun 
6488*4882a593Smuzhiyun 	/* Test case expects an skb, so populate one. Various
6489*4882a593Smuzhiyun 	 * subtests generate skbs of different sizes based on
6490*4882a593Smuzhiyun 	 * the same data.
6491*4882a593Smuzhiyun 	 */
6492*4882a593Smuzhiyun 	skb = populate_skb(test->data, test->test[sub].data_size);
6493*4882a593Smuzhiyun 	if (!skb)
6494*4882a593Smuzhiyun 		return NULL;
6495*4882a593Smuzhiyun 
6496*4882a593Smuzhiyun 	if (test->aux & FLAG_SKB_FRAG) {
6497*4882a593Smuzhiyun 		/*
6498*4882a593Smuzhiyun 		 * when the test requires a fragmented skb, add a
6499*4882a593Smuzhiyun 		 * single fragment to the skb, filled with
6500*4882a593Smuzhiyun 		 * test->frag_data.
6501*4882a593Smuzhiyun 		 */
6502*4882a593Smuzhiyun 		void *ptr;
6503*4882a593Smuzhiyun 
6504*4882a593Smuzhiyun 		page = alloc_page(GFP_KERNEL);
6505*4882a593Smuzhiyun 
6506*4882a593Smuzhiyun 		if (!page)
6507*4882a593Smuzhiyun 			goto err_kfree_skb;
6508*4882a593Smuzhiyun 
6509*4882a593Smuzhiyun 		ptr = kmap(page);
6510*4882a593Smuzhiyun 		if (!ptr)
6511*4882a593Smuzhiyun 			goto err_free_page;
6512*4882a593Smuzhiyun 		memcpy(ptr, test->frag_data, MAX_DATA);
6513*4882a593Smuzhiyun 		kunmap(page);
6514*4882a593Smuzhiyun 		skb_add_rx_frag(skb, 0, page, 0, MAX_DATA, MAX_DATA);
6515*4882a593Smuzhiyun 	}
6516*4882a593Smuzhiyun 
6517*4882a593Smuzhiyun 	return skb;
6518*4882a593Smuzhiyun 
6519*4882a593Smuzhiyun err_free_page:
6520*4882a593Smuzhiyun 	__free_page(page);
6521*4882a593Smuzhiyun err_kfree_skb:
6522*4882a593Smuzhiyun 	kfree_skb(skb);
6523*4882a593Smuzhiyun 	return NULL;
6524*4882a593Smuzhiyun }
6525*4882a593Smuzhiyun 
release_test_data(const struct bpf_test * test,void * data)6526*4882a593Smuzhiyun static void release_test_data(const struct bpf_test *test, void *data)
6527*4882a593Smuzhiyun {
6528*4882a593Smuzhiyun 	if (test->aux & FLAG_NO_DATA)
6529*4882a593Smuzhiyun 		return;
6530*4882a593Smuzhiyun 
6531*4882a593Smuzhiyun 	kfree_skb(data);
6532*4882a593Smuzhiyun }
6533*4882a593Smuzhiyun 
filter_length(int which)6534*4882a593Smuzhiyun static int filter_length(int which)
6535*4882a593Smuzhiyun {
6536*4882a593Smuzhiyun 	struct sock_filter *fp;
6537*4882a593Smuzhiyun 	int len;
6538*4882a593Smuzhiyun 
6539*4882a593Smuzhiyun 	if (tests[which].fill_helper)
6540*4882a593Smuzhiyun 		return tests[which].u.ptr.len;
6541*4882a593Smuzhiyun 
6542*4882a593Smuzhiyun 	fp = tests[which].u.insns;
6543*4882a593Smuzhiyun 	for (len = MAX_INSNS - 1; len > 0; --len)
6544*4882a593Smuzhiyun 		if (fp[len].code != 0 || fp[len].k != 0)
6545*4882a593Smuzhiyun 			break;
6546*4882a593Smuzhiyun 
6547*4882a593Smuzhiyun 	return len + 1;
6548*4882a593Smuzhiyun }
6549*4882a593Smuzhiyun 
filter_pointer(int which)6550*4882a593Smuzhiyun static void *filter_pointer(int which)
6551*4882a593Smuzhiyun {
6552*4882a593Smuzhiyun 	if (tests[which].fill_helper)
6553*4882a593Smuzhiyun 		return tests[which].u.ptr.insns;
6554*4882a593Smuzhiyun 	else
6555*4882a593Smuzhiyun 		return tests[which].u.insns;
6556*4882a593Smuzhiyun }
6557*4882a593Smuzhiyun 
generate_filter(int which,int * err)6558*4882a593Smuzhiyun static struct bpf_prog *generate_filter(int which, int *err)
6559*4882a593Smuzhiyun {
6560*4882a593Smuzhiyun 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6561*4882a593Smuzhiyun 	unsigned int flen = filter_length(which);
6562*4882a593Smuzhiyun 	void *fptr = filter_pointer(which);
6563*4882a593Smuzhiyun 	struct sock_fprog_kern fprog;
6564*4882a593Smuzhiyun 	struct bpf_prog *fp;
6565*4882a593Smuzhiyun 
6566*4882a593Smuzhiyun 	switch (test_type) {
6567*4882a593Smuzhiyun 	case CLASSIC:
6568*4882a593Smuzhiyun 		fprog.filter = fptr;
6569*4882a593Smuzhiyun 		fprog.len = flen;
6570*4882a593Smuzhiyun 
6571*4882a593Smuzhiyun 		*err = bpf_prog_create(&fp, &fprog);
6572*4882a593Smuzhiyun 		if (tests[which].aux & FLAG_EXPECTED_FAIL) {
6573*4882a593Smuzhiyun 			if (*err == tests[which].expected_errcode) {
6574*4882a593Smuzhiyun 				pr_cont("PASS\n");
6575*4882a593Smuzhiyun 				/* Verifier rejected filter as expected. */
6576*4882a593Smuzhiyun 				*err = 0;
6577*4882a593Smuzhiyun 				return NULL;
6578*4882a593Smuzhiyun 			} else {
6579*4882a593Smuzhiyun 				pr_cont("UNEXPECTED_PASS\n");
6580*4882a593Smuzhiyun 				/* Verifier didn't reject the test that's
6581*4882a593Smuzhiyun 				 * bad enough, just return!
6582*4882a593Smuzhiyun 				 */
6583*4882a593Smuzhiyun 				*err = -EINVAL;
6584*4882a593Smuzhiyun 				return NULL;
6585*4882a593Smuzhiyun 			}
6586*4882a593Smuzhiyun 		}
6587*4882a593Smuzhiyun 		if (*err) {
6588*4882a593Smuzhiyun 			pr_cont("FAIL to prog_create err=%d len=%d\n",
6589*4882a593Smuzhiyun 				*err, fprog.len);
6590*4882a593Smuzhiyun 			return NULL;
6591*4882a593Smuzhiyun 		}
6592*4882a593Smuzhiyun 		break;
6593*4882a593Smuzhiyun 
6594*4882a593Smuzhiyun 	case INTERNAL:
6595*4882a593Smuzhiyun 		fp = bpf_prog_alloc(bpf_prog_size(flen), 0);
6596*4882a593Smuzhiyun 		if (fp == NULL) {
6597*4882a593Smuzhiyun 			pr_cont("UNEXPECTED_FAIL no memory left\n");
6598*4882a593Smuzhiyun 			*err = -ENOMEM;
6599*4882a593Smuzhiyun 			return NULL;
6600*4882a593Smuzhiyun 		}
6601*4882a593Smuzhiyun 
6602*4882a593Smuzhiyun 		fp->len = flen;
6603*4882a593Smuzhiyun 		/* Type doesn't really matter here as long as it's not unspec. */
6604*4882a593Smuzhiyun 		fp->type = BPF_PROG_TYPE_SOCKET_FILTER;
6605*4882a593Smuzhiyun 		memcpy(fp->insnsi, fptr, fp->len * sizeof(struct bpf_insn));
6606*4882a593Smuzhiyun 		fp->aux->stack_depth = tests[which].stack_depth;
6607*4882a593Smuzhiyun 
6608*4882a593Smuzhiyun 		/* We cannot error here as we don't need type compatibility
6609*4882a593Smuzhiyun 		 * checks.
6610*4882a593Smuzhiyun 		 */
6611*4882a593Smuzhiyun 		fp = bpf_prog_select_runtime(fp, err);
6612*4882a593Smuzhiyun 		if (*err) {
6613*4882a593Smuzhiyun 			pr_cont("FAIL to select_runtime err=%d\n", *err);
6614*4882a593Smuzhiyun 			return NULL;
6615*4882a593Smuzhiyun 		}
6616*4882a593Smuzhiyun 		break;
6617*4882a593Smuzhiyun 	}
6618*4882a593Smuzhiyun 
6619*4882a593Smuzhiyun 	*err = 0;
6620*4882a593Smuzhiyun 	return fp;
6621*4882a593Smuzhiyun }
6622*4882a593Smuzhiyun 
release_filter(struct bpf_prog * fp,int which)6623*4882a593Smuzhiyun static void release_filter(struct bpf_prog *fp, int which)
6624*4882a593Smuzhiyun {
6625*4882a593Smuzhiyun 	__u8 test_type = tests[which].aux & TEST_TYPE_MASK;
6626*4882a593Smuzhiyun 
6627*4882a593Smuzhiyun 	switch (test_type) {
6628*4882a593Smuzhiyun 	case CLASSIC:
6629*4882a593Smuzhiyun 		bpf_prog_destroy(fp);
6630*4882a593Smuzhiyun 		break;
6631*4882a593Smuzhiyun 	case INTERNAL:
6632*4882a593Smuzhiyun 		bpf_prog_free(fp);
6633*4882a593Smuzhiyun 		break;
6634*4882a593Smuzhiyun 	}
6635*4882a593Smuzhiyun }
6636*4882a593Smuzhiyun 
__run_one(const struct bpf_prog * fp,const void * data,int runs,u64 * duration)6637*4882a593Smuzhiyun static int __run_one(const struct bpf_prog *fp, const void *data,
6638*4882a593Smuzhiyun 		     int runs, u64 *duration)
6639*4882a593Smuzhiyun {
6640*4882a593Smuzhiyun 	u64 start, finish;
6641*4882a593Smuzhiyun 	int ret = 0, i;
6642*4882a593Smuzhiyun 
6643*4882a593Smuzhiyun 	migrate_disable();
6644*4882a593Smuzhiyun 	start = ktime_get_ns();
6645*4882a593Smuzhiyun 
6646*4882a593Smuzhiyun 	for (i = 0; i < runs; i++)
6647*4882a593Smuzhiyun 		ret = BPF_PROG_RUN(fp, data);
6648*4882a593Smuzhiyun 
6649*4882a593Smuzhiyun 	finish = ktime_get_ns();
6650*4882a593Smuzhiyun 	migrate_enable();
6651*4882a593Smuzhiyun 
6652*4882a593Smuzhiyun 	*duration = finish - start;
6653*4882a593Smuzhiyun 	do_div(*duration, runs);
6654*4882a593Smuzhiyun 
6655*4882a593Smuzhiyun 	return ret;
6656*4882a593Smuzhiyun }
6657*4882a593Smuzhiyun 
run_one(const struct bpf_prog * fp,struct bpf_test * test)6658*4882a593Smuzhiyun static int run_one(const struct bpf_prog *fp, struct bpf_test *test)
6659*4882a593Smuzhiyun {
6660*4882a593Smuzhiyun 	int err_cnt = 0, i, runs = MAX_TESTRUNS;
6661*4882a593Smuzhiyun 
6662*4882a593Smuzhiyun 	for (i = 0; i < MAX_SUBTESTS; i++) {
6663*4882a593Smuzhiyun 		void *data;
6664*4882a593Smuzhiyun 		u64 duration;
6665*4882a593Smuzhiyun 		u32 ret;
6666*4882a593Smuzhiyun 
6667*4882a593Smuzhiyun 		/*
6668*4882a593Smuzhiyun 		 * NOTE: Several sub-tests may be present, in which case
6669*4882a593Smuzhiyun 		 * a zero {data_size, result} tuple indicates the end of
6670*4882a593Smuzhiyun 		 * the sub-test array. The first test is always run,
6671*4882a593Smuzhiyun 		 * even if both data_size and result happen to be zero.
6672*4882a593Smuzhiyun 		 */
6673*4882a593Smuzhiyun 		if (i > 0 &&
6674*4882a593Smuzhiyun 		    test->test[i].data_size == 0 &&
6675*4882a593Smuzhiyun 		    test->test[i].result == 0)
6676*4882a593Smuzhiyun 			break;
6677*4882a593Smuzhiyun 
6678*4882a593Smuzhiyun 		data = generate_test_data(test, i);
6679*4882a593Smuzhiyun 		if (!data && !(test->aux & FLAG_NO_DATA)) {
6680*4882a593Smuzhiyun 			pr_cont("data generation failed ");
6681*4882a593Smuzhiyun 			err_cnt++;
6682*4882a593Smuzhiyun 			break;
6683*4882a593Smuzhiyun 		}
6684*4882a593Smuzhiyun 		ret = __run_one(fp, data, runs, &duration);
6685*4882a593Smuzhiyun 		release_test_data(test, data);
6686*4882a593Smuzhiyun 
6687*4882a593Smuzhiyun 		if (ret == test->test[i].result) {
6688*4882a593Smuzhiyun 			pr_cont("%lld ", duration);
6689*4882a593Smuzhiyun 		} else {
6690*4882a593Smuzhiyun 			pr_cont("ret %d != %d ", ret,
6691*4882a593Smuzhiyun 				test->test[i].result);
6692*4882a593Smuzhiyun 			err_cnt++;
6693*4882a593Smuzhiyun 		}
6694*4882a593Smuzhiyun 	}
6695*4882a593Smuzhiyun 
6696*4882a593Smuzhiyun 	return err_cnt;
6697*4882a593Smuzhiyun }
6698*4882a593Smuzhiyun 
6699*4882a593Smuzhiyun static char test_name[64];
6700*4882a593Smuzhiyun module_param_string(test_name, test_name, sizeof(test_name), 0);
6701*4882a593Smuzhiyun 
6702*4882a593Smuzhiyun static int test_id = -1;
6703*4882a593Smuzhiyun module_param(test_id, int, 0);
6704*4882a593Smuzhiyun 
6705*4882a593Smuzhiyun static int test_range[2] = { 0, ARRAY_SIZE(tests) - 1 };
6706*4882a593Smuzhiyun module_param_array(test_range, int, NULL, 0);
6707*4882a593Smuzhiyun 
find_test_index(const char * test_name)6708*4882a593Smuzhiyun static __init int find_test_index(const char *test_name)
6709*4882a593Smuzhiyun {
6710*4882a593Smuzhiyun 	int i;
6711*4882a593Smuzhiyun 
6712*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6713*4882a593Smuzhiyun 		if (!strcmp(tests[i].descr, test_name))
6714*4882a593Smuzhiyun 			return i;
6715*4882a593Smuzhiyun 	}
6716*4882a593Smuzhiyun 	return -1;
6717*4882a593Smuzhiyun }
6718*4882a593Smuzhiyun 
prepare_bpf_tests(void)6719*4882a593Smuzhiyun static __init int prepare_bpf_tests(void)
6720*4882a593Smuzhiyun {
6721*4882a593Smuzhiyun 	int i;
6722*4882a593Smuzhiyun 
6723*4882a593Smuzhiyun 	if (test_id >= 0) {
6724*4882a593Smuzhiyun 		/*
6725*4882a593Smuzhiyun 		 * if a test_id was specified, use test_range to
6726*4882a593Smuzhiyun 		 * cover only that test.
6727*4882a593Smuzhiyun 		 */
6728*4882a593Smuzhiyun 		if (test_id >= ARRAY_SIZE(tests)) {
6729*4882a593Smuzhiyun 			pr_err("test_bpf: invalid test_id specified.\n");
6730*4882a593Smuzhiyun 			return -EINVAL;
6731*4882a593Smuzhiyun 		}
6732*4882a593Smuzhiyun 
6733*4882a593Smuzhiyun 		test_range[0] = test_id;
6734*4882a593Smuzhiyun 		test_range[1] = test_id;
6735*4882a593Smuzhiyun 	} else if (*test_name) {
6736*4882a593Smuzhiyun 		/*
6737*4882a593Smuzhiyun 		 * if a test_name was specified, find it and setup
6738*4882a593Smuzhiyun 		 * test_range to cover only that test.
6739*4882a593Smuzhiyun 		 */
6740*4882a593Smuzhiyun 		int idx = find_test_index(test_name);
6741*4882a593Smuzhiyun 
6742*4882a593Smuzhiyun 		if (idx < 0) {
6743*4882a593Smuzhiyun 			pr_err("test_bpf: no test named '%s' found.\n",
6744*4882a593Smuzhiyun 			       test_name);
6745*4882a593Smuzhiyun 			return -EINVAL;
6746*4882a593Smuzhiyun 		}
6747*4882a593Smuzhiyun 		test_range[0] = idx;
6748*4882a593Smuzhiyun 		test_range[1] = idx;
6749*4882a593Smuzhiyun 	} else {
6750*4882a593Smuzhiyun 		/*
6751*4882a593Smuzhiyun 		 * check that the supplied test_range is valid.
6752*4882a593Smuzhiyun 		 */
6753*4882a593Smuzhiyun 		if (test_range[0] >= ARRAY_SIZE(tests) ||
6754*4882a593Smuzhiyun 		    test_range[1] >= ARRAY_SIZE(tests) ||
6755*4882a593Smuzhiyun 		    test_range[0] < 0 || test_range[1] < 0) {
6756*4882a593Smuzhiyun 			pr_err("test_bpf: test_range is out of bound.\n");
6757*4882a593Smuzhiyun 			return -EINVAL;
6758*4882a593Smuzhiyun 		}
6759*4882a593Smuzhiyun 
6760*4882a593Smuzhiyun 		if (test_range[1] < test_range[0]) {
6761*4882a593Smuzhiyun 			pr_err("test_bpf: test_range is ending before it starts.\n");
6762*4882a593Smuzhiyun 			return -EINVAL;
6763*4882a593Smuzhiyun 		}
6764*4882a593Smuzhiyun 	}
6765*4882a593Smuzhiyun 
6766*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6767*4882a593Smuzhiyun 		if (tests[i].fill_helper &&
6768*4882a593Smuzhiyun 		    tests[i].fill_helper(&tests[i]) < 0)
6769*4882a593Smuzhiyun 			return -ENOMEM;
6770*4882a593Smuzhiyun 	}
6771*4882a593Smuzhiyun 
6772*4882a593Smuzhiyun 	return 0;
6773*4882a593Smuzhiyun }
6774*4882a593Smuzhiyun 
destroy_bpf_tests(void)6775*4882a593Smuzhiyun static __init void destroy_bpf_tests(void)
6776*4882a593Smuzhiyun {
6777*4882a593Smuzhiyun 	int i;
6778*4882a593Smuzhiyun 
6779*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6780*4882a593Smuzhiyun 		if (tests[i].fill_helper)
6781*4882a593Smuzhiyun 			kfree(tests[i].u.ptr.insns);
6782*4882a593Smuzhiyun 	}
6783*4882a593Smuzhiyun }
6784*4882a593Smuzhiyun 
exclude_test(int test_id)6785*4882a593Smuzhiyun static bool exclude_test(int test_id)
6786*4882a593Smuzhiyun {
6787*4882a593Smuzhiyun 	return test_id < test_range[0] || test_id > test_range[1];
6788*4882a593Smuzhiyun }
6789*4882a593Smuzhiyun 
build_test_skb(void)6790*4882a593Smuzhiyun static __init struct sk_buff *build_test_skb(void)
6791*4882a593Smuzhiyun {
6792*4882a593Smuzhiyun 	u32 headroom = NET_SKB_PAD + NET_IP_ALIGN + ETH_HLEN;
6793*4882a593Smuzhiyun 	struct sk_buff *skb[2];
6794*4882a593Smuzhiyun 	struct page *page[2];
6795*4882a593Smuzhiyun 	int i, data_size = 8;
6796*4882a593Smuzhiyun 
6797*4882a593Smuzhiyun 	for (i = 0; i < 2; i++) {
6798*4882a593Smuzhiyun 		page[i] = alloc_page(GFP_KERNEL);
6799*4882a593Smuzhiyun 		if (!page[i]) {
6800*4882a593Smuzhiyun 			if (i == 0)
6801*4882a593Smuzhiyun 				goto err_page0;
6802*4882a593Smuzhiyun 			else
6803*4882a593Smuzhiyun 				goto err_page1;
6804*4882a593Smuzhiyun 		}
6805*4882a593Smuzhiyun 
6806*4882a593Smuzhiyun 		/* this will set skb[i]->head_frag */
6807*4882a593Smuzhiyun 		skb[i] = dev_alloc_skb(headroom + data_size);
6808*4882a593Smuzhiyun 		if (!skb[i]) {
6809*4882a593Smuzhiyun 			if (i == 0)
6810*4882a593Smuzhiyun 				goto err_skb0;
6811*4882a593Smuzhiyun 			else
6812*4882a593Smuzhiyun 				goto err_skb1;
6813*4882a593Smuzhiyun 		}
6814*4882a593Smuzhiyun 
6815*4882a593Smuzhiyun 		skb_reserve(skb[i], headroom);
6816*4882a593Smuzhiyun 		skb_put(skb[i], data_size);
6817*4882a593Smuzhiyun 		skb[i]->protocol = htons(ETH_P_IP);
6818*4882a593Smuzhiyun 		skb_reset_network_header(skb[i]);
6819*4882a593Smuzhiyun 		skb_set_mac_header(skb[i], -ETH_HLEN);
6820*4882a593Smuzhiyun 
6821*4882a593Smuzhiyun 		skb_add_rx_frag(skb[i], 0, page[i], 0, 64, 64);
6822*4882a593Smuzhiyun 		// skb_headlen(skb[i]): 8, skb[i]->head_frag = 1
6823*4882a593Smuzhiyun 	}
6824*4882a593Smuzhiyun 
6825*4882a593Smuzhiyun 	/* setup shinfo */
6826*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_size = 1448;
6827*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV4;
6828*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_type |= SKB_GSO_DODGY;
6829*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_segs = 0;
6830*4882a593Smuzhiyun 	skb_shinfo(skb[0])->frag_list = skb[1];
6831*4882a593Smuzhiyun 
6832*4882a593Smuzhiyun 	/* adjust skb[0]'s len */
6833*4882a593Smuzhiyun 	skb[0]->len += skb[1]->len;
6834*4882a593Smuzhiyun 	skb[0]->data_len += skb[1]->data_len;
6835*4882a593Smuzhiyun 	skb[0]->truesize += skb[1]->truesize;
6836*4882a593Smuzhiyun 
6837*4882a593Smuzhiyun 	return skb[0];
6838*4882a593Smuzhiyun 
6839*4882a593Smuzhiyun err_skb1:
6840*4882a593Smuzhiyun 	__free_page(page[1]);
6841*4882a593Smuzhiyun err_page1:
6842*4882a593Smuzhiyun 	kfree_skb(skb[0]);
6843*4882a593Smuzhiyun err_skb0:
6844*4882a593Smuzhiyun 	__free_page(page[0]);
6845*4882a593Smuzhiyun err_page0:
6846*4882a593Smuzhiyun 	return NULL;
6847*4882a593Smuzhiyun }
6848*4882a593Smuzhiyun 
build_test_skb_linear_no_head_frag(void)6849*4882a593Smuzhiyun static __init struct sk_buff *build_test_skb_linear_no_head_frag(void)
6850*4882a593Smuzhiyun {
6851*4882a593Smuzhiyun 	unsigned int alloc_size = 2000;
6852*4882a593Smuzhiyun 	unsigned int headroom = 102, doffset = 72, data_size = 1308;
6853*4882a593Smuzhiyun 	struct sk_buff *skb[2];
6854*4882a593Smuzhiyun 	int i;
6855*4882a593Smuzhiyun 
6856*4882a593Smuzhiyun 	/* skbs linked in a frag_list, both with linear data, with head_frag=0
6857*4882a593Smuzhiyun 	 * (data allocated by kmalloc), both have tcp data of 1308 bytes
6858*4882a593Smuzhiyun 	 * (total payload is 2616 bytes).
6859*4882a593Smuzhiyun 	 * Data offset is 72 bytes (40 ipv6 hdr, 32 tcp hdr). Some headroom.
6860*4882a593Smuzhiyun 	 */
6861*4882a593Smuzhiyun 	for (i = 0; i < 2; i++) {
6862*4882a593Smuzhiyun 		skb[i] = alloc_skb(alloc_size, GFP_KERNEL);
6863*4882a593Smuzhiyun 		if (!skb[i]) {
6864*4882a593Smuzhiyun 			if (i == 0)
6865*4882a593Smuzhiyun 				goto err_skb0;
6866*4882a593Smuzhiyun 			else
6867*4882a593Smuzhiyun 				goto err_skb1;
6868*4882a593Smuzhiyun 		}
6869*4882a593Smuzhiyun 
6870*4882a593Smuzhiyun 		skb[i]->protocol = htons(ETH_P_IPV6);
6871*4882a593Smuzhiyun 		skb_reserve(skb[i], headroom);
6872*4882a593Smuzhiyun 		skb_put(skb[i], doffset + data_size);
6873*4882a593Smuzhiyun 		skb_reset_network_header(skb[i]);
6874*4882a593Smuzhiyun 		if (i == 0)
6875*4882a593Smuzhiyun 			skb_reset_mac_header(skb[i]);
6876*4882a593Smuzhiyun 		else
6877*4882a593Smuzhiyun 			skb_set_mac_header(skb[i], -ETH_HLEN);
6878*4882a593Smuzhiyun 		__skb_pull(skb[i], doffset);
6879*4882a593Smuzhiyun 	}
6880*4882a593Smuzhiyun 
6881*4882a593Smuzhiyun 	/* setup shinfo.
6882*4882a593Smuzhiyun 	 * mimic bpf_skb_proto_4_to_6, which resets gso_segs and assigns a
6883*4882a593Smuzhiyun 	 * reduced gso_size.
6884*4882a593Smuzhiyun 	 */
6885*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_size = 1288;
6886*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_type = SKB_GSO_TCPV6 | SKB_GSO_DODGY;
6887*4882a593Smuzhiyun 	skb_shinfo(skb[0])->gso_segs = 0;
6888*4882a593Smuzhiyun 	skb_shinfo(skb[0])->frag_list = skb[1];
6889*4882a593Smuzhiyun 
6890*4882a593Smuzhiyun 	/* adjust skb[0]'s len */
6891*4882a593Smuzhiyun 	skb[0]->len += skb[1]->len;
6892*4882a593Smuzhiyun 	skb[0]->data_len += skb[1]->len;
6893*4882a593Smuzhiyun 	skb[0]->truesize += skb[1]->truesize;
6894*4882a593Smuzhiyun 
6895*4882a593Smuzhiyun 	return skb[0];
6896*4882a593Smuzhiyun 
6897*4882a593Smuzhiyun err_skb1:
6898*4882a593Smuzhiyun 	kfree_skb(skb[0]);
6899*4882a593Smuzhiyun err_skb0:
6900*4882a593Smuzhiyun 	return NULL;
6901*4882a593Smuzhiyun }
6902*4882a593Smuzhiyun 
6903*4882a593Smuzhiyun struct skb_segment_test {
6904*4882a593Smuzhiyun 	const char *descr;
6905*4882a593Smuzhiyun 	struct sk_buff *(*build_skb)(void);
6906*4882a593Smuzhiyun 	netdev_features_t features;
6907*4882a593Smuzhiyun };
6908*4882a593Smuzhiyun 
6909*4882a593Smuzhiyun static struct skb_segment_test skb_segment_tests[] __initconst = {
6910*4882a593Smuzhiyun 	{
6911*4882a593Smuzhiyun 		.descr = "gso_with_rx_frags",
6912*4882a593Smuzhiyun 		.build_skb = build_test_skb,
6913*4882a593Smuzhiyun 		.features = NETIF_F_SG | NETIF_F_GSO_PARTIAL | NETIF_F_IP_CSUM |
6914*4882a593Smuzhiyun 			    NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM
6915*4882a593Smuzhiyun 	},
6916*4882a593Smuzhiyun 	{
6917*4882a593Smuzhiyun 		.descr = "gso_linear_no_head_frag",
6918*4882a593Smuzhiyun 		.build_skb = build_test_skb_linear_no_head_frag,
6919*4882a593Smuzhiyun 		.features = NETIF_F_SG | NETIF_F_FRAGLIST |
6920*4882a593Smuzhiyun 			    NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_GSO |
6921*4882a593Smuzhiyun 			    NETIF_F_LLTX | NETIF_F_GRO |
6922*4882a593Smuzhiyun 			    NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
6923*4882a593Smuzhiyun 			    NETIF_F_HW_VLAN_STAG_TX
6924*4882a593Smuzhiyun 	}
6925*4882a593Smuzhiyun };
6926*4882a593Smuzhiyun 
test_skb_segment_single(const struct skb_segment_test * test)6927*4882a593Smuzhiyun static __init int test_skb_segment_single(const struct skb_segment_test *test)
6928*4882a593Smuzhiyun {
6929*4882a593Smuzhiyun 	struct sk_buff *skb, *segs;
6930*4882a593Smuzhiyun 	int ret = -1;
6931*4882a593Smuzhiyun 
6932*4882a593Smuzhiyun 	skb = test->build_skb();
6933*4882a593Smuzhiyun 	if (!skb) {
6934*4882a593Smuzhiyun 		pr_info("%s: failed to build_test_skb", __func__);
6935*4882a593Smuzhiyun 		goto done;
6936*4882a593Smuzhiyun 	}
6937*4882a593Smuzhiyun 
6938*4882a593Smuzhiyun 	segs = skb_segment(skb, test->features);
6939*4882a593Smuzhiyun 	if (!IS_ERR(segs)) {
6940*4882a593Smuzhiyun 		kfree_skb_list(segs);
6941*4882a593Smuzhiyun 		ret = 0;
6942*4882a593Smuzhiyun 	}
6943*4882a593Smuzhiyun 	kfree_skb(skb);
6944*4882a593Smuzhiyun done:
6945*4882a593Smuzhiyun 	return ret;
6946*4882a593Smuzhiyun }
6947*4882a593Smuzhiyun 
test_skb_segment(void)6948*4882a593Smuzhiyun static __init int test_skb_segment(void)
6949*4882a593Smuzhiyun {
6950*4882a593Smuzhiyun 	int i, err_cnt = 0, pass_cnt = 0;
6951*4882a593Smuzhiyun 
6952*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(skb_segment_tests); i++) {
6953*4882a593Smuzhiyun 		const struct skb_segment_test *test = &skb_segment_tests[i];
6954*4882a593Smuzhiyun 
6955*4882a593Smuzhiyun 		pr_info("#%d %s ", i, test->descr);
6956*4882a593Smuzhiyun 
6957*4882a593Smuzhiyun 		if (test_skb_segment_single(test)) {
6958*4882a593Smuzhiyun 			pr_cont("FAIL\n");
6959*4882a593Smuzhiyun 			err_cnt++;
6960*4882a593Smuzhiyun 		} else {
6961*4882a593Smuzhiyun 			pr_cont("PASS\n");
6962*4882a593Smuzhiyun 			pass_cnt++;
6963*4882a593Smuzhiyun 		}
6964*4882a593Smuzhiyun 	}
6965*4882a593Smuzhiyun 
6966*4882a593Smuzhiyun 	pr_info("%s: Summary: %d PASSED, %d FAILED\n", __func__,
6967*4882a593Smuzhiyun 		pass_cnt, err_cnt);
6968*4882a593Smuzhiyun 	return err_cnt ? -EINVAL : 0;
6969*4882a593Smuzhiyun }
6970*4882a593Smuzhiyun 
test_bpf(void)6971*4882a593Smuzhiyun static __init int test_bpf(void)
6972*4882a593Smuzhiyun {
6973*4882a593Smuzhiyun 	int i, err_cnt = 0, pass_cnt = 0;
6974*4882a593Smuzhiyun 	int jit_cnt = 0, run_cnt = 0;
6975*4882a593Smuzhiyun 
6976*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(tests); i++) {
6977*4882a593Smuzhiyun 		struct bpf_prog *fp;
6978*4882a593Smuzhiyun 		int err;
6979*4882a593Smuzhiyun 
6980*4882a593Smuzhiyun 		cond_resched();
6981*4882a593Smuzhiyun 		if (exclude_test(i))
6982*4882a593Smuzhiyun 			continue;
6983*4882a593Smuzhiyun 
6984*4882a593Smuzhiyun 		pr_info("#%d %s ", i, tests[i].descr);
6985*4882a593Smuzhiyun 
6986*4882a593Smuzhiyun 		fp = generate_filter(i, &err);
6987*4882a593Smuzhiyun 		if (fp == NULL) {
6988*4882a593Smuzhiyun 			if (err == 0) {
6989*4882a593Smuzhiyun 				pass_cnt++;
6990*4882a593Smuzhiyun 				continue;
6991*4882a593Smuzhiyun 			}
6992*4882a593Smuzhiyun 			err_cnt++;
6993*4882a593Smuzhiyun 			continue;
6994*4882a593Smuzhiyun 		}
6995*4882a593Smuzhiyun 
6996*4882a593Smuzhiyun 		pr_cont("jited:%u ", fp->jited);
6997*4882a593Smuzhiyun 
6998*4882a593Smuzhiyun 		run_cnt++;
6999*4882a593Smuzhiyun 		if (fp->jited)
7000*4882a593Smuzhiyun 			jit_cnt++;
7001*4882a593Smuzhiyun 
7002*4882a593Smuzhiyun 		err = run_one(fp, &tests[i]);
7003*4882a593Smuzhiyun 		release_filter(fp, i);
7004*4882a593Smuzhiyun 
7005*4882a593Smuzhiyun 		if (err) {
7006*4882a593Smuzhiyun 			pr_cont("FAIL (%d times)\n", err);
7007*4882a593Smuzhiyun 			err_cnt++;
7008*4882a593Smuzhiyun 		} else {
7009*4882a593Smuzhiyun 			pr_cont("PASS\n");
7010*4882a593Smuzhiyun 			pass_cnt++;
7011*4882a593Smuzhiyun 		}
7012*4882a593Smuzhiyun 	}
7013*4882a593Smuzhiyun 
7014*4882a593Smuzhiyun 	pr_info("Summary: %d PASSED, %d FAILED, [%d/%d JIT'ed]\n",
7015*4882a593Smuzhiyun 		pass_cnt, err_cnt, jit_cnt, run_cnt);
7016*4882a593Smuzhiyun 
7017*4882a593Smuzhiyun 	return err_cnt ? -EINVAL : 0;
7018*4882a593Smuzhiyun }
7019*4882a593Smuzhiyun 
test_bpf_init(void)7020*4882a593Smuzhiyun static int __init test_bpf_init(void)
7021*4882a593Smuzhiyun {
7022*4882a593Smuzhiyun 	int ret;
7023*4882a593Smuzhiyun 
7024*4882a593Smuzhiyun 	ret = prepare_bpf_tests();
7025*4882a593Smuzhiyun 	if (ret < 0)
7026*4882a593Smuzhiyun 		return ret;
7027*4882a593Smuzhiyun 
7028*4882a593Smuzhiyun 	ret = test_bpf();
7029*4882a593Smuzhiyun 	destroy_bpf_tests();
7030*4882a593Smuzhiyun 	if (ret)
7031*4882a593Smuzhiyun 		return ret;
7032*4882a593Smuzhiyun 
7033*4882a593Smuzhiyun 	return test_skb_segment();
7034*4882a593Smuzhiyun }
7035*4882a593Smuzhiyun 
test_bpf_exit(void)7036*4882a593Smuzhiyun static void __exit test_bpf_exit(void)
7037*4882a593Smuzhiyun {
7038*4882a593Smuzhiyun }
7039*4882a593Smuzhiyun 
7040*4882a593Smuzhiyun module_init(test_bpf_init);
7041*4882a593Smuzhiyun module_exit(test_bpf_exit);
7042*4882a593Smuzhiyun 
7043*4882a593Smuzhiyun MODULE_LICENSE("GPL");
7044