1{
2	"ld_abs: check calling conv, r1",
3	.insns = {
4	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
5	BPF_MOV64_IMM(BPF_REG_1, 0),
6	BPF_LD_ABS(BPF_W, -0x200000),
7	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
8	BPF_EXIT_INSN(),
9	},
10	.errstr = "R1 !read_ok",
11	.result = REJECT,
12},
13{
14	"ld_abs: check calling conv, r2",
15	.insns = {
16	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
17	BPF_MOV64_IMM(BPF_REG_2, 0),
18	BPF_LD_ABS(BPF_W, -0x200000),
19	BPF_MOV64_REG(BPF_REG_0, BPF_REG_2),
20	BPF_EXIT_INSN(),
21	},
22	.errstr = "R2 !read_ok",
23	.result = REJECT,
24},
25{
26	"ld_abs: check calling conv, r3",
27	.insns = {
28	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
29	BPF_MOV64_IMM(BPF_REG_3, 0),
30	BPF_LD_ABS(BPF_W, -0x200000),
31	BPF_MOV64_REG(BPF_REG_0, BPF_REG_3),
32	BPF_EXIT_INSN(),
33	},
34	.errstr = "R3 !read_ok",
35	.result = REJECT,
36},
37{
38	"ld_abs: check calling conv, r4",
39	.insns = {
40	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
41	BPF_MOV64_IMM(BPF_REG_4, 0),
42	BPF_LD_ABS(BPF_W, -0x200000),
43	BPF_MOV64_REG(BPF_REG_0, BPF_REG_4),
44	BPF_EXIT_INSN(),
45	},
46	.errstr = "R4 !read_ok",
47	.result = REJECT,
48},
49{
50	"ld_abs: check calling conv, r5",
51	.insns = {
52	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
53	BPF_MOV64_IMM(BPF_REG_5, 0),
54	BPF_LD_ABS(BPF_W, -0x200000),
55	BPF_MOV64_REG(BPF_REG_0, BPF_REG_5),
56	BPF_EXIT_INSN(),
57	},
58	.errstr = "R5 !read_ok",
59	.result = REJECT,
60},
61{
62	"ld_abs: check calling conv, r7",
63	.insns = {
64	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
65	BPF_MOV64_IMM(BPF_REG_7, 0),
66	BPF_LD_ABS(BPF_W, -0x200000),
67	BPF_MOV64_REG(BPF_REG_0, BPF_REG_7),
68	BPF_EXIT_INSN(),
69	},
70	.result = ACCEPT,
71},
72{
73	"ld_abs: tests on r6 and skb data reload helper",
74	.insns = {
75	BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
76	BPF_LD_ABS(BPF_B, 0),
77	BPF_LD_ABS(BPF_H, 0),
78	BPF_LD_ABS(BPF_W, 0),
79	BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
80	BPF_MOV64_IMM(BPF_REG_6, 0),
81	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
82	BPF_MOV64_IMM(BPF_REG_2, 1),
83	BPF_MOV64_IMM(BPF_REG_3, 2),
84	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push),
85	BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
86	BPF_LD_ABS(BPF_B, 0),
87	BPF_LD_ABS(BPF_H, 0),
88	BPF_LD_ABS(BPF_W, 0),
89	BPF_MOV64_IMM(BPF_REG_0, 42),
90	BPF_EXIT_INSN(),
91	},
92	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
93	.result = ACCEPT,
94	.retval = 42 /* ultimate return value */,
95},
96{
97	"ld_abs: invalid op 1",
98	.insns = {
99		BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
100		BPF_LD_ABS(BPF_DW, 0),
101		BPF_EXIT_INSN(),
102	},
103	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
104	.result = REJECT,
105	.errstr = "unknown opcode",
106},
107{
108	"ld_abs: invalid op 2",
109	.insns = {
110		BPF_MOV32_IMM(BPF_REG_0, 256),
111		BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
112		BPF_LD_IND(BPF_DW, BPF_REG_0, 0),
113		BPF_EXIT_INSN(),
114	},
115	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
116	.result = REJECT,
117	.errstr = "unknown opcode",
118},
119{
120	"ld_abs: nmap reduced",
121	.insns = {
122		BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
123		BPF_LD_ABS(BPF_H, 12),
124		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 28),
125		BPF_LD_ABS(BPF_H, 12),
126		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 26),
127		BPF_MOV32_IMM(BPF_REG_0, 18),
128		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -64),
129		BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -64),
130		BPF_LD_IND(BPF_W, BPF_REG_7, 14),
131		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -60),
132		BPF_MOV32_IMM(BPF_REG_0, 280971478),
133		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
134		BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
135		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -60),
136		BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
137		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 15),
138		BPF_LD_ABS(BPF_H, 12),
139		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0x806, 13),
140		BPF_MOV32_IMM(BPF_REG_0, 22),
141		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -56),
142		BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -56),
143		BPF_LD_IND(BPF_H, BPF_REG_7, 14),
144		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -52),
145		BPF_MOV32_IMM(BPF_REG_0, 17366),
146		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -48),
147		BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_10, -48),
148		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -52),
149		BPF_ALU32_REG(BPF_SUB, BPF_REG_0, BPF_REG_7),
150		BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2),
151		BPF_MOV32_IMM(BPF_REG_0, 256),
152		BPF_EXIT_INSN(),
153		BPF_MOV32_IMM(BPF_REG_0, 0),
154		BPF_EXIT_INSN(),
155	},
156	.data = {
157		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0x06, 0,
158		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159		0x10, 0xbf, 0x48, 0xd6, 0x43, 0xd6,
160	},
161	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
162	.result = ACCEPT,
163	.retval = 256,
164},
165{
166	"ld_abs: div + abs, test 1",
167	.insns = {
168		BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
169		BPF_LD_ABS(BPF_B, 3),
170		BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
171		BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
172		BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
173		BPF_LD_ABS(BPF_B, 4),
174		BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
175		BPF_LD_IND(BPF_B, BPF_REG_8, -70),
176		BPF_EXIT_INSN(),
177	},
178	.data = {
179		10, 20, 30, 40, 50,
180	},
181	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
182	.result = ACCEPT,
183	.retval = 10,
184},
185{
186	"ld_abs: div + abs, test 2",
187	.insns = {
188		BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
189		BPF_LD_ABS(BPF_B, 3),
190		BPF_ALU64_IMM(BPF_MOV, BPF_REG_2, 2),
191		BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_2),
192		BPF_ALU64_REG(BPF_MOV, BPF_REG_8, BPF_REG_0),
193		BPF_LD_ABS(BPF_B, 128),
194		BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0),
195		BPF_LD_IND(BPF_B, BPF_REG_8, -70),
196		BPF_EXIT_INSN(),
197	},
198	.data = {
199		10, 20, 30, 40, 50,
200	},
201	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
202	.result = ACCEPT,
203	.retval = 0,
204},
205{
206	"ld_abs: div + abs, test 3",
207	.insns = {
208		BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
209		BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
210		BPF_LD_ABS(BPF_B, 3),
211		BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
212		BPF_EXIT_INSN(),
213	},
214	.data = {
215		10, 20, 30, 40, 50,
216	},
217	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
218	.result = ACCEPT,
219	.retval = 0,
220},
221{
222	"ld_abs: div + abs, test 4",
223	.insns = {
224		BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_1),
225		BPF_ALU64_IMM(BPF_MOV, BPF_REG_7, 0),
226		BPF_LD_ABS(BPF_B, 256),
227		BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_7),
228		BPF_EXIT_INSN(),
229	},
230	.data = {
231		10, 20, 30, 40, 50,
232	},
233	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
234	.result = ACCEPT,
235	.retval = 0,
236},
237{
238	"ld_abs: vlan + abs, test 1",
239	.insns = { },
240	.data = {
241		0x34,
242	},
243	.fill_helper = bpf_fill_ld_abs_vlan_push_pop,
244	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
245	.result = ACCEPT,
246	.retval = 0xbef,
247},
248{
249	"ld_abs: vlan + abs, test 2",
250	.insns = {
251		BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
252		BPF_LD_ABS(BPF_B, 0),
253		BPF_LD_ABS(BPF_H, 0),
254		BPF_LD_ABS(BPF_W, 0),
255		BPF_MOV64_REG(BPF_REG_7, BPF_REG_6),
256		BPF_MOV64_IMM(BPF_REG_6, 0),
257		BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
258		BPF_MOV64_IMM(BPF_REG_2, 1),
259		BPF_MOV64_IMM(BPF_REG_3, 2),
260		BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0,
261			     BPF_FUNC_skb_vlan_push),
262		BPF_MOV64_REG(BPF_REG_6, BPF_REG_7),
263		BPF_LD_ABS(BPF_B, 0),
264		BPF_LD_ABS(BPF_H, 0),
265		BPF_LD_ABS(BPF_W, 0),
266		BPF_MOV64_IMM(BPF_REG_0, 42),
267		BPF_EXIT_INSN(),
268	},
269	.data = {
270		0x34,
271	},
272	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
273	.result = ACCEPT,
274	.retval = 42,
275},
276{
277	"ld_abs: jump around ld_abs",
278	.insns = { },
279	.data = {
280		10, 11,
281	},
282	.fill_helper = bpf_fill_jump_around_ld_abs,
283	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
284	.result = ACCEPT,
285	.retval = 10,
286},
287