xref: /linux/tools/testing/selftests/bpf/verifier/jit.c (revision 8c994eff8fcfe8ecb1f1dbebed25b4d7bb75be12)
1 {
2 	"jit: lsh, rsh, arsh by 1",
3 	.insns = {
4 	BPF_MOV64_IMM(BPF_REG_0, 1),
5 	BPF_MOV64_IMM(BPF_REG_1, 0xff),
6 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 1),
7 	BPF_ALU32_IMM(BPF_LSH, BPF_REG_1, 1),
8 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1),
9 	BPF_EXIT_INSN(),
10 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 1),
11 	BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 1),
12 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0xff, 1),
13 	BPF_EXIT_INSN(),
14 	BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 1),
15 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x7f, 1),
16 	BPF_EXIT_INSN(),
17 	BPF_MOV64_IMM(BPF_REG_0, 2),
18 	BPF_EXIT_INSN(),
19 	},
20 	.result = ACCEPT,
21 	.retval = 2,
22 },
23 {
24 	"jit: lsh, rsh, arsh by reg",
25 	.insns = {
26 	BPF_MOV64_IMM(BPF_REG_0, 1),
27 	BPF_MOV64_IMM(BPF_REG_4, 1),
28 	BPF_MOV64_IMM(BPF_REG_1, 0xff),
29 	BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_0),
30 	BPF_ALU32_REG(BPF_LSH, BPF_REG_1, BPF_REG_4),
31 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0x3fc, 1),
32 	BPF_EXIT_INSN(),
33 	BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_4),
34 	BPF_MOV64_REG(BPF_REG_4, BPF_REG_1),
35 	BPF_ALU32_REG(BPF_RSH, BPF_REG_4, BPF_REG_0),
36 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_4, 0xff, 1),
37 	BPF_EXIT_INSN(),
38 	BPF_ALU64_REG(BPF_ARSH, BPF_REG_4, BPF_REG_4),
39 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_4, 0, 1),
40 	BPF_EXIT_INSN(),
41 	BPF_MOV64_IMM(BPF_REG_0, 2),
42 	BPF_EXIT_INSN(),
43 	},
44 	.result = ACCEPT,
45 	.retval = 2,
46 },
47 {
48 	"jit: mov32 for ldimm64, 1",
49 	.insns = {
50 	BPF_MOV64_IMM(BPF_REG_0, 2),
51 	BPF_LD_IMM64(BPF_REG_1, 0xfeffffffffffffffULL),
52 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 32),
53 	BPF_LD_IMM64(BPF_REG_2, 0xfeffffffULL),
54 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
55 	BPF_MOV64_IMM(BPF_REG_0, 1),
56 	BPF_EXIT_INSN(),
57 	},
58 	.result = ACCEPT,
59 	.retval = 2,
60 },
61 {
62 	"jit: mov32 for ldimm64, 2",
63 	.insns = {
64 	BPF_MOV64_IMM(BPF_REG_0, 1),
65 	BPF_LD_IMM64(BPF_REG_1, 0x1ffffffffULL),
66 	BPF_LD_IMM64(BPF_REG_2, 0xffffffffULL),
67 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
68 	BPF_MOV64_IMM(BPF_REG_0, 2),
69 	BPF_EXIT_INSN(),
70 	},
71 	.result = ACCEPT,
72 	.retval = 2,
73 },
74 {
75 	"jit: various mul tests",
76 	.insns = {
77 	BPF_LD_IMM64(BPF_REG_2, 0xeeff0d413122ULL),
78 	BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
79 	BPF_LD_IMM64(BPF_REG_1, 0xefefefULL),
80 	BPF_ALU64_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
81 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
82 	BPF_MOV64_IMM(BPF_REG_0, 1),
83 	BPF_EXIT_INSN(),
84 	BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
85 	BPF_ALU64_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
86 	BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
87 	BPF_MOV64_IMM(BPF_REG_0, 1),
88 	BPF_EXIT_INSN(),
89 	BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
90 	BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
91 	BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
92 	BPF_MOV64_IMM(BPF_REG_0, 1),
93 	BPF_EXIT_INSN(),
94 	BPF_MOV32_REG(BPF_REG_2, BPF_REG_2),
95 	BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
96 	BPF_ALU32_REG(BPF_MUL, BPF_REG_0, BPF_REG_1),
97 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
98 	BPF_MOV64_IMM(BPF_REG_0, 1),
99 	BPF_EXIT_INSN(),
100 	BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
101 	BPF_ALU32_REG(BPF_MUL, BPF_REG_3, BPF_REG_1),
102 	BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
103 	BPF_MOV64_IMM(BPF_REG_0, 1),
104 	BPF_EXIT_INSN(),
105 	BPF_LD_IMM64(BPF_REG_3, 0xfefefeULL),
106 	BPF_ALU32_IMM(BPF_MUL, BPF_REG_3, 0xefefef),
107 	BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
108 	BPF_MOV64_IMM(BPF_REG_0, 1),
109 	BPF_EXIT_INSN(),
110 	BPF_LD_IMM64(BPF_REG_0, 0xfefefeULL),
111 	BPF_LD_IMM64(BPF_REG_2, 0x2ad4d4aaULL),
112 	BPF_ALU32_IMM(BPF_MUL, BPF_REG_0, 0x2b),
113 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
114 	BPF_MOV64_IMM(BPF_REG_0, 1),
115 	BPF_EXIT_INSN(),
116 	BPF_LD_IMM64(BPF_REG_0, 0x952a7bbcULL),
117 	BPF_LD_IMM64(BPF_REG_1, 0xfefefeULL),
118 	BPF_LD_IMM64(BPF_REG_5, 0xeeff0d413122ULL),
119 	BPF_ALU32_REG(BPF_MUL, BPF_REG_5, BPF_REG_1),
120 	BPF_JMP_REG(BPF_JEQ, BPF_REG_5, BPF_REG_0, 2),
121 	BPF_MOV64_IMM(BPF_REG_0, 1),
122 	BPF_EXIT_INSN(),
123 	BPF_MOV64_IMM(BPF_REG_0, 2),
124 	BPF_EXIT_INSN(),
125 	},
126 	.result = ACCEPT,
127 	.retval = 2,
128 },
129 {
130 	"jit: various div tests",
131 	.insns = {
132 	BPF_LD_IMM64(BPF_REG_2, 0xefeffeULL),
133 	BPF_LD_IMM64(BPF_REG_0, 0xeeff0d413122ULL),
134 	BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
135 	BPF_ALU64_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
136 	BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 2),
137 	BPF_MOV64_IMM(BPF_REG_0, 1),
138 	BPF_EXIT_INSN(),
139 	BPF_LD_IMM64(BPF_REG_3, 0xeeff0d413122ULL),
140 	BPF_ALU64_IMM(BPF_DIV, BPF_REG_3, 0xfefeeeULL),
141 	BPF_JMP_REG(BPF_JEQ, BPF_REG_3, BPF_REG_2, 2),
142 	BPF_MOV64_IMM(BPF_REG_0, 1),
143 	BPF_EXIT_INSN(),
144 	BPF_LD_IMM64(BPF_REG_2, 0xaa93ULL),
145 	BPF_ALU64_IMM(BPF_MOD, BPF_REG_1, 0xbeefULL),
146 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
147 	BPF_MOV64_IMM(BPF_REG_0, 1),
148 	BPF_EXIT_INSN(),
149 	BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
150 	BPF_LD_IMM64(BPF_REG_3, 0xbeefULL),
151 	BPF_ALU64_REG(BPF_MOD, BPF_REG_1, BPF_REG_3),
152 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
153 	BPF_MOV64_IMM(BPF_REG_0, 1),
154 	BPF_EXIT_INSN(),
155 	BPF_LD_IMM64(BPF_REG_2, 0x5ee1dULL),
156 	BPF_LD_IMM64(BPF_REG_1, 0xfefeeeULL),
157 	BPF_LD_IMM64(BPF_REG_3, 0x2bULL),
158 	BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_3),
159 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 2),
160 	BPF_MOV64_IMM(BPF_REG_0, 1),
161 	BPF_EXIT_INSN(),
162 	BPF_ALU32_REG(BPF_DIV, BPF_REG_1, BPF_REG_1),
163 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 2),
164 	BPF_MOV64_IMM(BPF_REG_0, 1),
165 	BPF_EXIT_INSN(),
166 	BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_2),
167 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_2, 0, 2),
168 	BPF_MOV64_IMM(BPF_REG_0, 1),
169 	BPF_EXIT_INSN(),
170 	BPF_MOV64_IMM(BPF_REG_0, 2),
171 	BPF_EXIT_INSN(),
172 	},
173 	.result = ACCEPT,
174 	.retval = 2,
175 },
176 {
177 	"jit: jsgt, jslt",
178 	.insns = {
179 	BPF_LD_IMM64(BPF_REG_1, 0x80000000ULL),
180 	BPF_LD_IMM64(BPF_REG_2, 0x0ULL),
181 	BPF_JMP_REG(BPF_JSGT, BPF_REG_1, BPF_REG_2, 2),
182 	BPF_MOV64_IMM(BPF_REG_0, 1),
183 	BPF_EXIT_INSN(),
184 
185 	BPF_JMP_REG(BPF_JSLT, BPF_REG_2, BPF_REG_1, 2),
186 	BPF_MOV64_IMM(BPF_REG_0, 1),
187 	BPF_EXIT_INSN(),
188 
189 	BPF_MOV64_IMM(BPF_REG_0, 2),
190 	BPF_EXIT_INSN(),
191 	},
192 	.result = ACCEPT,
193 	.retval = 2,
194 },
195 {
196 	"jit: torturous jumps, imm8 nop jmp and pure jump padding",
197 	.insns = { },
198 	.fill_helper = bpf_fill_torturous_jumps,
199 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
200 	.result = ACCEPT,
201 	.retval = 1,
202 },
203 {
204 	"jit: torturous jumps, imm32 nop jmp and jmp_cond padding",
205 	.insns = { },
206 	.fill_helper = bpf_fill_torturous_jumps,
207 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
208 	.result = ACCEPT,
209 	.retval = 2,
210 },
211 {
212 	"jit: torturous jumps in subprog",
213 	.insns = { },
214 	.fill_helper = bpf_fill_torturous_jumps,
215 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
216 	.result = ACCEPT,
217 	.retval = 3,
218 },
219