OLD | NEW |
| (Empty) |
1 @hex: | |
2 # Originally these tests came from | |
3 # https://github.com/mseaborn/x86-decoder/blob/x86-64/validator_test.py | |
4 | |
5 # Check some simple allowed instructions. | |
6 # nop | |
7 90 | |
8 # hlt | |
9 f4 | |
10 # mov $0x12345678, %rax | |
11 48 c7 c0 78 56 34 12 | |
12 # mov $0x1234567812345678, %rax | |
13 48 b8 78 56 34 12 78 56 34 12 | |
14 @rval: | |
15 VALIDATOR: Checking jump targets: 0 to 13 | |
16 VALIDATOR: Checking that basic blocks are aligned | |
17 *** <input> is safe *** | |
18 @dis: | |
19 0000000000000000: 90 nop | |
20 0000000000000001: f4 hlt | |
21 0000000000000002: 48 c7 c0 78 56 34 12 mov %rax, 0x123
45678 | |
22 0000000000000009: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
23 @rdfa_output: | |
24 return code: 0 | |
25 ---------------------------------------------------------------------- | |
26 @hex: | |
27 # Check a disallowed instruction. | |
28 # nop | |
29 90 | |
30 # int $0x80 | |
31 cd 80 | |
32 @rval: | |
33 VALIDATOR: 0000000000000001: cd 80 int
0x80 | |
34 VALIDATOR: ERROR: This instruction has been marked illegal by Native Client | |
35 VALIDATOR: Checking jump targets: 0 to 3 | |
36 VALIDATOR: Checking that basic blocks are aligned | |
37 *** <input> IS UNSAFE *** | |
38 @dis: | |
39 0000000000000000: 90 nop | |
40 0000000000000001: cd 80 int 0x80 | |
41 @rdfa_output: | |
42 1: [0] unrecognized instruction | |
43 return code: 1 | |
44 ---------------------------------------------------------------------- | |
45 @hex: | |
46 # ret | |
47 c3 | |
48 @rval: | |
49 VALIDATOR: 0000000000000000: c3 ret | |
50 VALIDATOR: ERROR: This instruction has been marked illegal by Native Client | |
51 VALIDATOR: 0000000000000000: c3 ret | |
52 VALIDATOR: ERROR: Illegal assignment to RSP | |
53 VALIDATOR: Checking jump targets: 0 to 1 | |
54 VALIDATOR: Checking that basic blocks are aligned | |
55 *** <input> IS UNSAFE *** | |
56 @dis: | |
57 0000000000000000: c3 ret | |
58 @rdfa_output: | |
59 0: [0] unrecognized instruction | |
60 return code: 1 | |
61 ---------------------------------------------------------------------- | |
62 @hex: | |
63 # syscall | |
64 0f 05 | |
65 @rval: | |
66 VALIDATOR: 0000000000000000: 0f 05 sysc
all | |
67 VALIDATOR: ERROR: This instruction has been marked illegal by Native Client | |
68 VALIDATOR: 0000000000000000: 0f 05 sysc
all | |
69 VALIDATOR: ERROR: System instructions are not allowed by Native Client | |
70 VALIDATOR: Checking jump targets: 0 to 2 | |
71 VALIDATOR: Checking that basic blocks are aligned | |
72 *** <input> IS UNSAFE *** | |
73 @dis: | |
74 0000000000000000: 0f 05 syscall | |
75 @rdfa_output: | |
76 0: [0] unrecognized instruction | |
77 return code: 1 | |
78 ---------------------------------------------------------------------- | |
79 @hex: | |
80 # mov $0x1234567812345678, %rax | |
81 48 b8 78 56 34 12 78 56 34 12 | |
82 # mov $0x1234567812345678, %rax | |
83 48 b8 78 56 34 12 78 56 34 12 | |
84 # mov $0x1234567812345678, %rax | |
85 48 b8 78 56 34 12 78 56 34 12 | |
86 # mov $0x1234567812345678, %rax | |
87 48 b8 78 56 34 12 78 56 34 12 | |
88 @rval: | |
89 VALIDATOR: Checking jump targets: 0 to 28 | |
90 VALIDATOR: Checking that basic blocks are aligned | |
91 VALIDATOR: ERROR: 20: Bad basic block alignment. | |
92 *** <input> IS UNSAFE *** | |
93 @dis: | |
94 0000000000000000: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
95 000000000000000a: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
96 0000000000000014: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
97 000000000000001e: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
98 @rdfa_output: | |
99 1e: [0] unrecognized instruction | |
100 20: [0] direct jump out of range | |
101 24: [0] direct jump out of range | |
102 return code: 1 | |
103 @validators_disagree: | |
104 Because RDFA validator recovered after bundle boundary. | |
105 ---------------------------------------------------------------------- | |
106 @hex: | |
107 # Forwards and backwards jumps. | |
108 # nop | |
109 90 | |
110 # jmp .+6 | |
111 eb 04 | |
112 # jmp .+0 | |
113 eb fe | |
114 # jmp .-2 | |
115 eb fc | |
116 # jmp .-4 | |
117 eb fa | |
118 @rval: | |
119 VALIDATOR: Checking jump targets: 0 to 9 | |
120 VALIDATOR: Checking that basic blocks are aligned | |
121 *** <input> is safe *** | |
122 @dis: | |
123 0000000000000000: 90 nop | |
124 0000000000000001: eb 04 jmp 0x7 | |
125 0000000000000003: eb fe jmp 0x3 | |
126 0000000000000005: eb fc jmp 0x3 | |
127 0000000000000007: eb fa jmp 0x3 | |
128 @rdfa_output: | |
129 return code: 0 | |
130 ---------------------------------------------------------------------- | |
131 @hex: | |
132 # Out-of-range unaligned jump. | |
133 # jmp .-1 | |
134 eb fd | |
135 @rval: | |
136 VALIDATOR: 0000000000000000: eb fd jmp
0xffffffffffffffff | |
137 VALIDATOR: ERROR: Instruction jumps to bad address | |
138 VALIDATOR: Checking jump targets: 0 to 2 | |
139 VALIDATOR: Checking that basic blocks are aligned | |
140 *** <input> IS UNSAFE *** | |
141 @dis: | |
142 0000000000000000: eb fd jmp 0xfffffffff
fffffff | |
143 @rdfa_output: | |
144 0: [0] direct jump out of range | |
145 return code: 1 | |
146 ---------------------------------------------------------------------- | |
147 @hex: | |
148 # Out-of-range unaligned jump. | |
149 # jmp .+33 | |
150 eb 1f | |
151 @rval: | |
152 VALIDATOR: 0000000000000000: eb 1f jmp
0x21 | |
153 VALIDATOR: ERROR: Instruction jumps to bad address | |
154 VALIDATOR: Checking jump targets: 0 to 2 | |
155 VALIDATOR: Checking that basic blocks are aligned | |
156 *** <input> IS UNSAFE *** | |
157 @dis: | |
158 0000000000000000: eb 1f jmp 0x21 | |
159 @rdfa_output: | |
160 0: [0] direct jump out of range | |
161 return code: 1 | |
162 ---------------------------------------------------------------------- | |
163 @hex: | |
164 # Jump into instruction. | |
165 # mov $0x1234567812345678, %rax | |
166 48 b8 78 56 34 12 78 56 34 12 | |
167 # jmp .-5 | |
168 eb f9 | |
169 @rval: | |
170 VALIDATOR: Checking jump targets: 0 to c | |
171 VALIDATOR: ERROR: 5: Bad jump target | |
172 VALIDATOR: Checking that basic blocks are aligned | |
173 *** <input> IS UNSAFE *** | |
174 @dis: | |
175 0000000000000000: 48 b8 78 56 34 12 78 56 34 12 mov %rax, 0x123
4567812345678 | |
176 000000000000000a: eb f9 jmp 0x5 | |
177 @rdfa_output: | |
178 a: [0] bad jump target | |
179 return code: 1 | |
180 @validators_disagree: | |
181 Difference in jump reporting. | |
182 ---------------------------------------------------------------------- | |
183 @hex: | |
184 # Unmasked indirect jumps are disallowed. | |
185 # jmp *%rax | |
186 ff e0 | |
187 @rval: | |
188 VALIDATOR: 0000000000000000: ff e0 jmp
%rax | |
189 VALIDATOR: ERROR: Invalid indirect jump | |
190 VALIDATOR: Checking jump targets: 0 to 2 | |
191 VALIDATOR: Checking that basic blocks are aligned | |
192 *** <input> IS UNSAFE *** | |
193 @dis: | |
194 0000000000000000: ff e0 jmp %rax | |
195 @rdfa_output: | |
196 0: [0] unrecognized instruction | |
197 return code: 1 | |
198 ---------------------------------------------------------------------- | |
199 @hex: | |
200 # jmp *(%rax) | |
201 ff 20 | |
202 @rval: | |
203 VALIDATOR: 0000000000000000: ff 20 jmp
[%rax] | |
204 VALIDATOR: ERROR: Invalid base register in memory offset | |
205 VALIDATOR: 0000000000000000: ff 20 jmp
[%rax] | |
206 VALIDATOR: ERROR: Jump not native client compliant | |
207 VALIDATOR: Checking jump targets: 0 to 2 | |
208 VALIDATOR: Checking that basic blocks are aligned | |
209 *** <input> IS UNSAFE *** | |
210 @dis: | |
211 0000000000000000: ff 20 jmp [%rax] | |
212 @rdfa_output: | |
213 0: [0] unrecognized instruction | |
214 return code: 1 | |
215 ---------------------------------------------------------------------- | |
216 @hex: | |
217 # call *%rax | |
218 ff d0 | |
219 @rval: | |
220 VALIDATOR: 0000000000000000: ff d0 call
%rax | |
221 VALIDATOR: ERROR: Invalid indirect jump | |
222 VALIDATOR: 0000000000000000: ff d0 call
%rax | |
223 VALIDATOR: WARNING: Bad call alignment, return pc = 2 | |
224 VALIDATOR: Checking jump targets: 0 to 2 | |
225 VALIDATOR: Checking that basic blocks are aligned | |
226 *** <input> IS UNSAFE *** | |
227 @dis: | |
228 0000000000000000: ff d0 call %rax | |
229 @rdfa_output: | |
230 0: [0] unrecognized instruction | |
231 return code: 1 | |
232 ---------------------------------------------------------------------- | |
233 @hex: | |
234 # call *(%rax) | |
235 ff 10 | |
236 @rval: | |
237 VALIDATOR: 0000000000000000: ff 10 call
[%rax] | |
238 VALIDATOR: ERROR: Invalid base register in memory offset | |
239 VALIDATOR: 0000000000000000: ff 10 call
[%rax] | |
240 VALIDATOR: ERROR: Jump not native client compliant | |
241 VALIDATOR: 0000000000000000: ff 10 call
[%rax] | |
242 VALIDATOR: WARNING: Bad call alignment, return pc = 2 | |
243 VALIDATOR: Checking jump targets: 0 to 2 | |
244 VALIDATOR: Checking that basic blocks are aligned | |
245 *** <input> IS UNSAFE *** | |
246 @dis: | |
247 0000000000000000: ff 10 call [%rax] | |
248 @rdfa_output: | |
249 0: [0] unrecognized instruction | |
250 return code: 1 | |
251 ---------------------------------------------------------------------- | |
252 @hex: | |
253 # Masking instructions on their own are allowed. | |
254 # and $~31, %eax | |
255 83 e0 e0 | |
256 # and $~31, %ebx | |
257 83 e3 e0 | |
258 # and $~31, %rax | |
259 48 83 e0 e0 | |
260 # and $~31, %rbx | |
261 48 83 e3 e0 | |
262 @rval: | |
263 VALIDATOR: Checking jump targets: 0 to e | |
264 VALIDATOR: Checking that basic blocks are aligned | |
265 *** <input> is safe *** | |
266 @dis: | |
267 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
268 0000000000000003: 83 e3 e0 and %ebx, 0xe0 | |
269 0000000000000006: 48 83 e0 e0 and %rax, 0xe0 | |
270 000000000000000a: 48 83 e3 e0 and %rbx, 0xe0 | |
271 @rdfa_output: | |
272 return code: 0 | |
273 ---------------------------------------------------------------------- | |
274 @hex: | |
275 # and $~31, %eax | |
276 83 e0 e0 | |
277 # add %r15, %rax | |
278 4c 01 f8 | |
279 | |
280 # and $~31, %ebx | |
281 83 e3 e0 | |
282 # add %r15, %rbx | |
283 4c 01 fb | |
284 @rval: | |
285 VALIDATOR: Checking jump targets: 0 to c | |
286 VALIDATOR: Checking that basic blocks are aligned | |
287 *** <input> is safe *** | |
288 @dis: | |
289 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
290 0000000000000003: 4c 01 f8 add %rax, %r15 | |
291 0000000000000006: 83 e3 e0 and %ebx, 0xe0 | |
292 0000000000000009: 4c 01 fb add %rbx, %r15 | |
293 @rdfa_output: | |
294 return code: 0 | |
295 ---------------------------------------------------------------------- | |
296 @hex: | |
297 # Masked indirect jumps are allowed. | |
298 # and $~31, %eax | |
299 83 e0 e0 \\ | |
300 # add %r15, %rax | |
301 4c 01 f8 \\ | |
302 # jmp *%rax | |
303 ff e0 | |
304 @rval: | |
305 VALIDATOR: Checking jump targets: 0 to 8 | |
306 VALIDATOR: Checking that basic blocks are aligned | |
307 *** <input> is safe *** | |
308 @dis: | |
309 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
310 0000000000000003: 4c 01 f8 add %rax, %r15 | |
311 0000000000000006: ff e0 jmp %rax | |
312 @rdfa_output: | |
313 return code: 0 | |
314 ---------------------------------------------------------------------- | |
315 @hex: | |
316 # and $~31, %ebx | |
317 83 e3 e0 \\ | |
318 # add %r15, %rbx | |
319 4c 01 fb \\ | |
320 # call *%rbx | |
321 ff d3 | |
322 @rval: | |
323 VALIDATOR: 0000000000000006: ff d3 call
%rbx | |
324 VALIDATOR: WARNING: Bad call alignment, return pc = 8 | |
325 VALIDATOR: Checking jump targets: 0 to 8 | |
326 VALIDATOR: Checking that basic blocks are aligned | |
327 *** <input> is safe *** | |
328 @dis: | |
329 0000000000000000: 83 e3 e0 and %ebx, 0xe0 | |
330 0000000000000003: 4c 01 fb add %rbx, %r15 | |
331 0000000000000006: ff d3 call %rbx | |
332 @rdfa_output: | |
333 return code: 0 | |
334 ---------------------------------------------------------------------- | |
335 @hex: | |
336 # The registers must match up for the mask and the jump. | |
337 # and $~31, %ebx | |
338 83 e3 e0 | |
339 # add %r15, %rax | |
340 4c 01 f8 | |
341 # jmp *%rax | |
342 ff e0 | |
343 @rval: | |
344 VALIDATOR: 0000000000000006: ff e0 jmp
%rax | |
345 VALIDATOR: ERROR: Invalid indirect jump | |
346 VALIDATOR: Checking jump targets: 0 to 8 | |
347 VALIDATOR: Checking that basic blocks are aligned | |
348 *** <input> IS UNSAFE *** | |
349 @dis: | |
350 0000000000000000: 83 e3 e0 and %ebx, 0xe0 | |
351 0000000000000003: 4c 01 f8 add %rax, %r15 | |
352 0000000000000006: ff e0 jmp %rax | |
353 @rdfa_output: | |
354 6: [0] unrecognized instruction | |
355 return code: 1 | |
356 @validators_disagree: | |
357 Difference in error reporting. | |
358 ---------------------------------------------------------------------- | |
359 @hex: | |
360 # and $~31, %eax | |
361 83 e0 e0 | |
362 # add %r15, %rbx | |
363 4c 01 fb | |
364 # jmp *%rax | |
365 ff e0 | |
366 @rval: | |
367 VALIDATOR: 0000000000000006: ff e0 jmp
%rax | |
368 VALIDATOR: ERROR: Invalid indirect jump | |
369 VALIDATOR: Checking jump targets: 0 to 8 | |
370 VALIDATOR: Checking that basic blocks are aligned | |
371 *** <input> IS UNSAFE *** | |
372 @dis: | |
373 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
374 0000000000000003: 4c 01 fb add %rbx, %r15 | |
375 0000000000000006: ff e0 jmp %rax | |
376 @rdfa_output: | |
377 6: [0] unrecognized instruction | |
378 return code: 1 | |
379 @validators_disagree: | |
380 Difference in error reporting. | |
381 ---------------------------------------------------------------------- | |
382 @hex: | |
383 # and $~31, %eax | |
384 83 e0 e0 | |
385 # add %r15, %rax | |
386 4c 01 f8 | |
387 # jmp *%rbx | |
388 ff e3 | |
389 @rval: | |
390 VALIDATOR: 0000000000000006: ff e3 jmp
%rbx | |
391 VALIDATOR: ERROR: Invalid indirect jump | |
392 VALIDATOR: Checking jump targets: 0 to 8 | |
393 VALIDATOR: Checking that basic blocks are aligned | |
394 *** <input> IS UNSAFE *** | |
395 @dis: | |
396 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
397 0000000000000003: 4c 01 f8 add %rax, %r15 | |
398 0000000000000006: ff e3 jmp %rbx | |
399 @rdfa_output: | |
400 6: [0] unrecognized instruction | |
401 return code: 1 | |
402 @validators_disagree: | |
403 Difference in error reporting. | |
404 ---------------------------------------------------------------------- | |
405 @hex: | |
406 # and $~31, %eax | |
407 83 e0 e0 | |
408 # add %r15, %rbx | |
409 4c 01 fb | |
410 # jmp *%rbx | |
411 ff e3 | |
412 @rval: | |
413 VALIDATOR: 0000000000000006: ff e3 jmp
%rbx | |
414 VALIDATOR: ERROR: Invalid indirect jump | |
415 VALIDATOR: Checking jump targets: 0 to 8 | |
416 VALIDATOR: Checking that basic blocks are aligned | |
417 *** <input> IS UNSAFE *** | |
418 @dis: | |
419 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
420 0000000000000003: 4c 01 fb add %rbx, %r15 | |
421 0000000000000006: ff e3 jmp %rbx | |
422 @rdfa_output: | |
423 6: [0] unrecognized instruction | |
424 return code: 1 | |
425 @validators_disagree: | |
426 Difference in error reporting. | |
427 ---------------------------------------------------------------------- | |
428 @hex: | |
429 # and $~31, %ebx | |
430 83 e3 e0 | |
431 # add %r15, %rbx | |
432 4c 01 fb | |
433 # jmp *%rax | |
434 ff e0 | |
435 @rval: | |
436 VALIDATOR: 0000000000000006: ff e0 jmp
%rax | |
437 VALIDATOR: ERROR: Invalid indirect jump | |
438 VALIDATOR: Checking jump targets: 0 to 8 | |
439 VALIDATOR: Checking that basic blocks are aligned | |
440 *** <input> IS UNSAFE *** | |
441 @dis: | |
442 0000000000000000: 83 e3 e0 and %ebx, 0xe0 | |
443 0000000000000003: 4c 01 fb add %rbx, %r15 | |
444 0000000000000006: ff e0 jmp %rax | |
445 @rdfa_output: | |
446 6: [0] unrecognized instruction | |
447 return code: 1 | |
448 @validators_disagree: | |
449 Difference in error reporting. | |
450 ---------------------------------------------------------------------- | |
451 @hex: | |
452 # The mask and the jump must be adjacent. | |
453 # and $~31, %eax | |
454 83 e0 e0 | |
455 # nop | |
456 90 | |
457 # add %r15, %rax | |
458 4c 01 f8 | |
459 # jmp *%rax | |
460 ff e0 | |
461 @rval: | |
462 VALIDATOR: 0000000000000007: ff e0 jmp
%rax | |
463 VALIDATOR: ERROR: Invalid indirect jump | |
464 VALIDATOR: Checking jump targets: 0 to 9 | |
465 VALIDATOR: Checking that basic blocks are aligned | |
466 *** <input> IS UNSAFE *** | |
467 @dis: | |
468 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
469 0000000000000003: 90 nop | |
470 0000000000000004: 4c 01 f8 add %rax, %r15 | |
471 0000000000000007: ff e0 jmp %rax | |
472 @rdfa_output: | |
473 7: [0] unrecognized instruction | |
474 return code: 1 | |
475 ---------------------------------------------------------------------- | |
476 @hex: | |
477 # and $~31, %eax | |
478 83 e0 e0 | |
479 # add %r15, %rax | |
480 4c 01 f8 | |
481 # nop | |
482 90 | |
483 # jmp *%rax | |
484 ff e0 | |
485 @rval: | |
486 VALIDATOR: 0000000000000007: ff e0 jmp
%rax | |
487 VALIDATOR: ERROR: Invalid indirect jump | |
488 VALIDATOR: Checking jump targets: 0 to 9 | |
489 VALIDATOR: Checking that basic blocks are aligned | |
490 *** <input> IS UNSAFE *** | |
491 @dis: | |
492 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
493 0000000000000003: 4c 01 f8 add %rax, %r15 | |
494 0000000000000006: 90 nop | |
495 0000000000000007: ff e0 jmp %rax | |
496 @rdfa_output: | |
497 7: [0] unrecognized instruction | |
498 return code: 1 | |
499 ---------------------------------------------------------------------- | |
500 @hex: | |
501 # Jumping into the middle of the superinstruction must be rejected. | |
502 # and $~31, %eax | |
503 83 e0 e0 | |
504 # add %r15, %rax | |
505 4c 01 f8 | |
506 # jmp *%rax | |
507 ff e0 | |
508 # jmp .-2 | |
509 eb fc | |
510 @rval: | |
511 VALIDATOR: Checking jump targets: 0 to a | |
512 VALIDATOR: ERROR: 6: Bad jump target | |
513 VALIDATOR: Checking that basic blocks are aligned | |
514 *** <input> IS UNSAFE *** | |
515 @dis: | |
516 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
517 0000000000000003: 4c 01 f8 add %rax, %r15 | |
518 0000000000000006: ff e0 jmp %rax | |
519 0000000000000008: eb fc jmp 0x6 | |
520 @rdfa_output: | |
521 8: [0] bad jump target | |
522 return code: 1 | |
523 @validators_disagree: | |
524 Difference in jump reporting. | |
525 ---------------------------------------------------------------------- | |
526 @hex: | |
527 # and $~31, %eax | |
528 83 e0 e0 | |
529 # add %r15, %rax | |
530 4c 01 f8 | |
531 # jmp *%rax | |
532 ff e0 | |
533 # jmp .-5 | |
534 eb f9 | |
535 @rval: | |
536 VALIDATOR: Checking jump targets: 0 to a | |
537 VALIDATOR: ERROR: 3: Bad jump target | |
538 VALIDATOR: Checking that basic blocks are aligned | |
539 *** <input> IS UNSAFE *** | |
540 @dis: | |
541 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
542 0000000000000003: 4c 01 f8 add %rax, %r15 | |
543 0000000000000006: ff e0 jmp %rax | |
544 0000000000000008: eb f9 jmp 0x3 | |
545 @rdfa_output: | |
546 8: [0] bad jump target | |
547 return code: 1 | |
548 @validators_disagree: | |
549 TODO: explain this | |
550 Difference in jump reporting. | |
551 ---------------------------------------------------------------------- | |
552 @hex: | |
553 # Read-only access to special registers is allowed. | |
554 # push %rax | |
555 50 | |
556 # push %rbp | |
557 55 | |
558 # push %rsp | |
559 54 | |
560 # push %r15 | |
561 41 57 | |
562 # mov %rsp, %rax | |
563 48 89 e0 | |
564 @rval: | |
565 VALIDATOR: Checking jump targets: 0 to 8 | |
566 VALIDATOR: Checking that basic blocks are aligned | |
567 *** <input> is safe *** | |
568 @dis: | |
569 0000000000000000: 50 push %rax | |
570 0000000000000001: 55 push %rbp | |
571 0000000000000002: 54 push %rsp | |
572 0000000000000003: 41 57 push %r15 | |
573 0000000000000005: 48 89 e0 mov %rax, %rsp | |
574 @rdfa_output: | |
575 return code: 0 | |
576 ---------------------------------------------------------------------- | |
577 @hex: | |
578 # Write access to special registers is not allowed. | |
579 # pop %rax | |
580 58 | |
581 @rval: | |
582 VALIDATOR: Checking jump targets: 0 to 1 | |
583 VALIDATOR: Checking that basic blocks are aligned | |
584 *** <input> is safe *** | |
585 @dis: | |
586 0000000000000000: 58 pop %rax | |
587 @rdfa_output: | |
588 return code: 0 | |
589 ---------------------------------------------------------------------- | |
590 @hex: | |
591 # pop %rbp | |
592 5d | |
593 @rval: | |
594 VALIDATOR: 0000000000000000: 5d pop
%rbp | |
595 VALIDATOR: ERROR: Illegal change to register RBP | |
596 VALIDATOR: Checking jump targets: 0 to 1 | |
597 VALIDATOR: Checking that basic blocks are aligned | |
598 *** <input> IS UNSAFE *** | |
599 @dis: | |
600 0000000000000000: 5d pop %rbp | |
601 @rdfa_output: | |
602 0: [0] error - %bpl or %bp is changed | |
603 return code: 1 | |
604 ---------------------------------------------------------------------- | |
605 @hex: | |
606 # pop %rsp | |
607 5c | |
608 @rval: | |
609 VALIDATOR: 0000000000000000: 5c pop
%rsp | |
610 VALIDATOR: ERROR: Illegal assignment to RSP | |
611 VALIDATOR: Checking jump targets: 0 to 1 | |
612 VALIDATOR: Checking that basic blocks are aligned | |
613 *** <input> IS UNSAFE *** | |
614 @dis: | |
615 0000000000000000: 5c pop %rsp | |
616 @rdfa_output: | |
617 0: [0] error - %spl or %sp is changed | |
618 return code: 1 | |
619 ---------------------------------------------------------------------- | |
620 @hex: | |
621 # pop %r15 | |
622 41 5f | |
623 @rval: | |
624 VALIDATOR: 0000000000000000: 41 5f pop
%r15 | |
625 VALIDATOR: ERROR: Illegal to change the value of register RegR15 | |
626 VALIDATOR: Checking jump targets: 0 to 2 | |
627 VALIDATOR: Checking that basic blocks are aligned | |
628 *** <input> IS UNSAFE *** | |
629 @dis: | |
630 0000000000000000: 41 5f pop %r15 | |
631 @rdfa_output: | |
632 0: [0] error - %r15 is changed | |
633 return code: 1 | |
634 ---------------------------------------------------------------------- | |
635 @hex: | |
636 # Memory accesses. | |
637 # mov %eax, %eax | |
638 89 c0 \\ | |
639 # mov (%r15, %rax), %ebx | |
640 41 8b 1c 07 | |
641 @rval: | |
642 VALIDATOR: Checking jump targets: 0 to 6 | |
643 VALIDATOR: Checking that basic blocks are aligned | |
644 *** <input> is safe *** | |
645 @dis: | |
646 0000000000000000: 89 c0 mov %eax, %eax | |
647 0000000000000002: 41 8b 1c 07 mov %ebx, [%r15
+%rax*1] | |
648 @rdfa_output: | |
649 return code: 0 | |
650 ---------------------------------------------------------------------- | |
651 @hex: | |
652 # Test for a top-bit-set register. | |
653 # mov %r12d, %r12d | |
654 45 89 e4 \\ | |
655 # mov (%r15, %r12), %ebx | |
656 43 8b 1c 27 | |
657 @rval: | |
658 VALIDATOR: Checking jump targets: 0 to 7 | |
659 VALIDATOR: Checking that basic blocks are aligned | |
660 *** <input> is safe *** | |
661 @dis: | |
662 0000000000000000: 45 89 e4 mov %r12d, %r12
d | |
663 0000000000000003: 43 8b 1c 27 mov %ebx, [%r15
+%r12*1] | |
664 @rdfa_output: | |
665 return code: 0 | |
666 ---------------------------------------------------------------------- | |
667 @hex: | |
668 # Check %edi and %esi because the first 'mov' also begins superinstructions. | |
669 # mov %edi, %edi | |
670 89 ff \\ | |
671 # mov (%r15, %rdi), %ebx | |
672 41 8b 1c 3f | |
673 @rval: | |
674 VALIDATOR: Checking jump targets: 0 to 6 | |
675 VALIDATOR: Checking that basic blocks are aligned | |
676 *** <input> is safe *** | |
677 @dis: | |
678 0000000000000000: 89 ff mov %edi, %edi | |
679 0000000000000002: 41 8b 1c 3f mov %ebx, [%r15
+%rdi*1] | |
680 @rdfa_output: | |
681 return code: 0 | |
682 ---------------------------------------------------------------------- | |
683 @hex: | |
684 # mov %esi, %esi | |
685 89 f6 \\ | |
686 # mov (%r15, %rsi), %ebx | |
687 41 8b 1c 37 | |
688 @rval: | |
689 VALIDATOR: Checking jump targets: 0 to 6 | |
690 VALIDATOR: Checking that basic blocks are aligned | |
691 *** <input> is safe *** | |
692 @dis: | |
693 0000000000000000: 89 f6 mov %esi, %esi | |
694 0000000000000002: 41 8b 1c 37 mov %ebx, [%r15
+%rsi*1] | |
695 @rdfa_output: | |
696 return code: 0 | |
697 ---------------------------------------------------------------------- | |
698 @hex: | |
699 # Check mask on its own. | |
700 # mov %eax, %eax | |
701 89 c0 | |
702 @rval: | |
703 VALIDATOR: Checking jump targets: 0 to 2 | |
704 VALIDATOR: Checking that basic blocks are aligned | |
705 *** <input> is safe *** | |
706 @dis: | |
707 0000000000000000: 89 c0 mov %eax, %eax | |
708 @rdfa_output: | |
709 return code: 0 | |
710 ---------------------------------------------------------------------- | |
711 @hex: | |
712 # mov (%r15, %rax), %ebx | |
713 41 8b 1c 07 | |
714 @rval: | |
715 VALIDATOR: 0000000000000000: 41 8b 1c 07 mov
%ebx, [%r15+%rax*1] | |
716 VALIDATOR: ERROR: Invalid index register in memory offset | |
717 VALIDATOR: Checking jump targets: 0 to 4 | |
718 VALIDATOR: Checking that basic blocks are aligned | |
719 *** <input> IS UNSAFE *** | |
720 @dis: | |
721 0000000000000000: 41 8b 1c 07 mov %ebx, [%r15
+%rax*1] | |
722 @rdfa_output: | |
723 0: [0] improper memory address - bad index | |
724 return code: 1 | |
725 ---------------------------------------------------------------------- | |
726 @hex: | |
727 # mov %eax, %eax | |
728 89 c0 | |
729 # mov (%r15, %rax), %ebx | |
730 41 8b 1c 07 | |
731 # jmp .-4 | |
732 eb fa | |
733 @rval: | |
734 VALIDATOR: Checking jump targets: 0 to 8 | |
735 VALIDATOR: ERROR: 2: Bad jump target | |
736 VALIDATOR: Checking that basic blocks are aligned | |
737 *** <input> IS UNSAFE *** | |
738 @dis: | |
739 0000000000000000: 89 c0 mov %eax, %eax | |
740 0000000000000002: 41 8b 1c 07 mov %ebx, [%r15
+%rax*1] | |
741 0000000000000006: eb fa jmp 0x2 | |
742 @rdfa_output: | |
743 6: [0] bad jump target | |
744 return code: 1 | |
745 @validators_disagree: | |
746 Difference in jump reporting. | |
747 ---------------------------------------------------------------------- | |
748 @hex: | |
749 # Check that post-conditions do not leak from a superinstruction. In the | |
750 # PyDFA validator, to share DFT states, the first instruction of the | |
751 # nacljmp, "and $~31, %eax", records a post-condition, just as when it is | |
752 # used on its own. Although the code below is safe, we don't really want | |
753 # the post-condition to leak through. | |
754 # and $~31, %eax | |
755 83 e0 e0 | |
756 # add %r15, %rax | |
757 4c 01 f8 | |
758 # jmp *%rax | |
759 ff e0 | |
760 # %rax should not be regarded as zero-extended here. | |
761 # mov (%r15, %rax), %ebx | |
762 41 8b 1c 07 | |
763 @rval: | |
764 VALIDATOR: 0000000000000008: 41 8b 1c 07 mov
%ebx, [%r15+%rax*1] | |
765 VALIDATOR: ERROR: Invalid index register in memory offset | |
766 VALIDATOR: Checking jump targets: 0 to c | |
767 VALIDATOR: Checking that basic blocks are aligned | |
768 *** <input> IS UNSAFE *** | |
769 @dis: | |
770 0000000000000000: 83 e0 e0 and %eax, 0xe0 | |
771 0000000000000003: 4c 01 f8 add %rax, %r15 | |
772 0000000000000006: ff e0 jmp %rax | |
773 0000000000000008: 41 8b 1c 07 mov %ebx, [%r15
+%rax*1] | |
774 @rdfa_output: | |
775 8: [0] improper memory address - bad index | |
776 return code: 1 | |
777 ---------------------------------------------------------------------- | |
778 @hex: | |
779 # mov %edi, %edi | |
780 89 ff | |
781 # lea (%r15, %rdi), %rdi | |
782 49 8d 3c 3f | |
783 # rep stos %al, %es:(%rdi) | |
784 f3 aa | |
785 # %rdi should not be regarded as zero-extended here. | |
786 # mov (%r15, %rdi), %ebx | |
787 41 8b 1c 3f | |
788 @rval: | |
789 VALIDATOR: 0000000000000008: 41 8b 1c 3f mov
%ebx, [%r15+%rdi*1] | |
790 VALIDATOR: ERROR: Invalid index register in memory offset | |
791 VALIDATOR: Checking jump targets: 0 to c | |
792 VALIDATOR: Checking that basic blocks are aligned | |
793 *** <input> IS UNSAFE *** | |
794 @dis: | |
795 0000000000000000: 89 ff mov %edi, %edi | |
796 0000000000000002: 49 8d 3c 3f lea %rdi, [%r15
+%rdi*1] | |
797 0000000000000006: f3 aa stosb [%rdi] | |
798 0000000000000008: 41 8b 1c 3f mov %ebx, [%r15
+%rdi*1] | |
799 @rdfa_output: | |
800 8: [0] improper memory address - bad index | |
801 return code: 1 | |
802 ---------------------------------------------------------------------- | |
803 @hex: | |
804 # mov %esi, %esi | |
805 89 f6 | |
806 # lea (%r15, %rsi), %rsi | |
807 49 8d 34 37 | |
808 # mov %edi, %edi | |
809 89 ff | |
810 # lea (%r15, %rdi), %rdi | |
811 49 8d 3c 3f | |
812 # rep movsb %ds:(%rsi), %es:(%rdi) | |
813 f3 a4 | |
814 # %rsi should not be regarded as zero-extended here. | |
815 # mov (%r15, %rsi), %ebx | |
816 41 8b 1c 37 | |
817 @rval: | |
818 VALIDATOR: 000000000000000e: 41 8b 1c 37 mov
%ebx, [%r15+%rsi*1] | |
819 VALIDATOR: ERROR: Invalid index register in memory offset | |
820 VALIDATOR: Checking jump targets: 0 to 12 | |
821 VALIDATOR: Checking that basic blocks are aligned | |
822 *** <input> IS UNSAFE *** | |
823 @dis: | |
824 0000000000000000: 89 f6 mov %esi, %esi | |
825 0000000000000002: 49 8d 34 37 lea %rsi, [%r15
+%rsi*1] | |
826 0000000000000006: 89 ff mov %edi, %edi | |
827 0000000000000008: 49 8d 3c 3f lea %rdi, [%r15
+%rdi*1] | |
828 000000000000000c: f3 a4 movsb [%rdi], [
%rsi] | |
829 000000000000000e: 41 8b 1c 37 mov %ebx, [%r15
+%rsi*1] | |
830 @rdfa_output: | |
831 e: [0] improper memory address - bad index | |
832 return code: 1 | |
833 ---------------------------------------------------------------------- | |
834 @hex: | |
835 # Non-%r15-based memory accesses. | |
836 # mov 0x1234(%rip), %eax | |
837 8b 05 34 12 00 00 | |
838 # mov 0x1234(%rsp), %eax | |
839 8b 84 24 34 12 00 00 | |
840 # mov 0x1234(%rbp), %eax | |
841 8b 85 34 12 00 00 | |
842 @rval: | |
843 VALIDATOR: Checking jump targets: 0 to 13 | |
844 VALIDATOR: Checking that basic blocks are aligned | |
845 *** <input> is safe *** | |
846 @dis: | |
847 0000000000000000: 8b 05 34 12 00 00 mov %eax, [%rip
+0x1234] | |
848 0000000000000006: 8b 84 24 34 12 00 00 mov %eax, [%rsp
+0x1234] | |
849 000000000000000d: 8b 85 34 12 00 00 mov %eax, [%rbp
+0x1234] | |
850 @rdfa_output: | |
851 return code: 0 | |
852 ---------------------------------------------------------------------- | |
853 @hex: | |
854 # mov 0x1234(%rsp, %rbx), %eax | |
855 8b 84 1c 34 12 00 00 | |
856 @rval: | |
857 VALIDATOR: 0000000000000000: 8b 84 1c 34 12 00 00 mov
%eax, [%rsp+%rbx*1+0x1234] | |
858 VALIDATOR: ERROR: Invalid index register in memory offset | |
859 VALIDATOR: Checking jump targets: 0 to 7 | |
860 VALIDATOR: Checking that basic blocks are aligned | |
861 *** <input> IS UNSAFE *** | |
862 @dis: | |
863 0000000000000000: 8b 84 1c 34 12 00 00 mov %eax, [%rsp
+%rbx*1+0x1234] | |
864 @rdfa_output: | |
865 0: [0] improper memory address - bad index | |
866 return code: 1 | |
867 ---------------------------------------------------------------------- | |
868 @hex: | |
869 # mov 0x1234(%rbp, %rbx), %eax | |
870 8b 84 1d 34 12 00 00 | |
871 @rval: | |
872 VALIDATOR: 0000000000000000: 8b 84 1d 34 12 00 00 mov
%eax, [%rbp+%rbx*1+0x1234] | |
873 VALIDATOR: ERROR: Invalid index register in memory offset | |
874 VALIDATOR: Checking jump targets: 0 to 7 | |
875 VALIDATOR: Checking that basic blocks are aligned | |
876 *** <input> IS UNSAFE *** | |
877 @dis: | |
878 0000000000000000: 8b 84 1d 34 12 00 00 mov %eax, [%rbp
+%rbx*1+0x1234] | |
879 @rdfa_output: | |
880 0: [0] improper memory address - bad index | |
881 return code: 1 | |
882 ---------------------------------------------------------------------- | |
883 @hex: | |
884 # mov %ebx, %ebx | |
885 89 db \\ | |
886 # mov 0x1234(%rsp, %rbx), %eax | |
887 8b 84 1c 34 12 00 00 | |
888 @rval: | |
889 VALIDATOR: Checking jump targets: 0 to 9 | |
890 VALIDATOR: Checking that basic blocks are aligned | |
891 *** <input> is safe *** | |
892 @dis: | |
893 0000000000000000: 89 db mov %ebx, %ebx | |
894 0000000000000002: 8b 84 1c 34 12 00 00 mov %eax, [%rsp
+%rbx*1+0x1234] | |
895 @rdfa_output: | |
896 return code: 0 | |
897 ---------------------------------------------------------------------- | |
898 @hex: | |
899 # mov %ebx, %ebx | |
900 89 db \\ | |
901 # mov 0x1234(%rbp, %rbx), %eax | |
902 8b 84 1d 34 12 00 00 | |
903 @rval: | |
904 VALIDATOR: Checking jump targets: 0 to 9 | |
905 VALIDATOR: Checking that basic blocks are aligned | |
906 *** <input> is safe *** | |
907 @dis: | |
908 0000000000000000: 89 db mov %ebx, %ebx | |
909 0000000000000002: 8b 84 1d 34 12 00 00 mov %eax, [%rbp
+%rbx*1+0x1234] | |
910 @rdfa_output: | |
911 return code: 0 | |
912 ---------------------------------------------------------------------- | |
913 @hex: | |
914 # 'lea' is not a memory access. | |
915 # lea (%rbx, %rcx, 4), %rax | |
916 48 8d 04 8b | |
917 @rval: | |
918 VALIDATOR: Checking jump targets: 0 to 4 | |
919 VALIDATOR: Checking that basic blocks are aligned | |
920 *** <input> is safe *** | |
921 @dis: | |
922 0000000000000000: 48 8d 04 8b lea %rax, [%rbx
+%rcx*4] | |
923 @rdfa_output: | |
924 return code: 0 | |
925 ---------------------------------------------------------------------- | |
926 @hex: | |
927 # Stack operations. | |
928 # mov %rsp, %rbp | |
929 48 89 e5 | |
930 # mov %rbp, %rsp | |
931 48 89 ec | |
932 @rval: | |
933 VALIDATOR: Checking jump targets: 0 to 6 | |
934 VALIDATOR: Checking that basic blocks are aligned | |
935 *** <input> is safe *** | |
936 @dis: | |
937 0000000000000000: 48 89 e5 mov %rbp, %rsp | |
938 0000000000000003: 48 89 ec mov %rsp, %rbp | |
939 @rdfa_output: | |
940 return code: 0 | |
941 ---------------------------------------------------------------------- | |
942 @hex: | |
943 # add $8, %ebp | |
944 83 c5 08 \\ | |
945 # add %r15, %rbp | |
946 4c 01 fd | |
947 @rval: | |
948 VALIDATOR: Checking jump targets: 0 to 6 | |
949 VALIDATOR: Checking that basic blocks are aligned | |
950 *** <input> is safe *** | |
951 @dis: | |
952 0000000000000000: 83 c5 08 add %ebp, 0x8 | |
953 0000000000000003: 4c 01 fd add %rbp, %r15 | |
954 @rdfa_output: | |
955 return code: 0 | |
956 ---------------------------------------------------------------------- | |
957 @hex: | |
958 # add $8, %ebp | |
959 83 c5 08 | |
960 # add %r15, %rbp | |
961 4c 01 fd | |
962 # jmp .-3 | |
963 eb fb | |
964 @rval: | |
965 VALIDATOR: Checking jump targets: 0 to 8 | |
966 VALIDATOR: ERROR: 3: Bad jump target | |
967 VALIDATOR: Checking that basic blocks are aligned | |
968 *** <input> IS UNSAFE *** | |
969 @dis: | |
970 0000000000000000: 83 c5 08 add %ebp, 0x8 | |
971 0000000000000003: 4c 01 fd add %rbp, %r15 | |
972 0000000000000006: eb fb jmp 0x3 | |
973 @rdfa_output: | |
974 6: [0] bad jump target | |
975 return code: 1 | |
976 @validators_disagree: | |
977 Difference in jump reporting. | |
978 ---------------------------------------------------------------------- | |
979 @hex: | |
980 # A stack fixup on its own is not allowed. | |
981 # add %r15, %rbp | |
982 4c 01 fd | |
983 @rval: | |
984 VALIDATOR: 0000000000000000: 4c 01 fd add
%rbp, %r15 | |
985 VALIDATOR: ERROR: Illegal change to register RBP | |
986 VALIDATOR: Checking jump targets: 0 to 3 | |
987 VALIDATOR: Checking that basic blocks are aligned | |
988 *** <input> IS UNSAFE *** | |
989 @dis: | |
990 0000000000000000: 4c 01 fd add %rbp, %r15 | |
991 @rdfa_output: | |
992 0: [0] improper %rbp sandboxing | |
993 return code: 1 | |
994 ---------------------------------------------------------------------- | |
995 @hex: | |
996 # add %r15, %rsp | |
997 4c 01 fc | |
998 @rval: | |
999 VALIDATOR: 0000000000000000: 4c 01 fc add
%rsp, %r15 | |
1000 VALIDATOR: ERROR: Illegal assignment to RSP | |
1001 VALIDATOR: Checking jump targets: 0 to 3 | |
1002 VALIDATOR: Checking that basic blocks are aligned | |
1003 *** <input> IS UNSAFE *** | |
1004 @dis: | |
1005 0000000000000000: 4c 01 fc add %rsp, %r15 | |
1006 @rdfa_output: | |
1007 0: [0] improper %rsp sandboxing | |
1008 return code: 1 | |
1009 ---------------------------------------------------------------------- | |
1010 @hex: | |
1011 # add %r15, %r15 | |
1012 4d 01 ff | |
1013 @rval: | |
1014 VALIDATOR: 0000000000000000: 4d 01 ff add
%r15, %r15 | |
1015 VALIDATOR: ERROR: Illegal to change the value of register RegR15 | |
1016 VALIDATOR: Checking jump targets: 0 to 3 | |
1017 VALIDATOR: Checking that basic blocks are aligned | |
1018 *** <input> IS UNSAFE *** | |
1019 @dis: | |
1020 0000000000000000: 4d 01 ff add %r15, %r15 | |
1021 @rdfa_output: | |
1022 0: [0] error - %r15 is changed | |
1023 return code: 1 | |
1024 ---------------------------------------------------------------------- | |
1025 @hex: | |
1026 # Sandboxing is not required on prefetch instructions. | |
1027 # prefetchnta (%rax) | |
1028 0f 18 00 | |
1029 @rval: | |
1030 VALIDATOR: Checking jump targets: 0 to 3 | |
1031 VALIDATOR: Checking that basic blocks are aligned | |
1032 *** <input> is safe *** | |
1033 @dis: | |
1034 0000000000000000: 0f 18 00 prefetchnta [%r
ax] | |
1035 @rdfa_output: | |
1036 return code: 0 | |
1037 ---------------------------------------------------------------------- | |
1038 @hex: | |
1039 # Segment register manipulations are forbidden | |
1040 # mov %rax, %es | |
1041 48 8e c0 | |
1042 @rval: | |
1043 VALIDATOR: 0000000000000000: 48 8e c0 mov
%es, %ax | |
1044 VALIDATOR: ERROR: This instruction has been marked illegal by Native Client | |
1045 VALIDATOR: 0000000000000000: 48 8e c0 mov
%es, %ax | |
1046 VALIDATOR: ERROR: Illegal assignment to segment register RegES | |
1047 VALIDATOR: Checking jump targets: 0 to 3 | |
1048 VALIDATOR: Checking that basic blocks are aligned | |
1049 *** <input> IS UNSAFE *** | |
1050 @dis: | |
1051 0000000000000000: 48 8e c0 mov %es, %ax | |
1052 @rdfa_output: | |
1053 0: [0] unrecognized instruction | |
1054 return code: 1 | |
1055 ---------------------------------------------------------------------- | |
1056 @hex: | |
1057 # mov %es, %rax | |
1058 48 8c c0 | |
1059 @rval: | |
1060 VALIDATOR: 0000000000000000: 48 8c c0 mov
%rax, %es | |
1061 VALIDATOR: ERROR: This instruction has been marked illegal by Native Client | |
1062 VALIDATOR: Checking jump targets: 0 to 3 | |
1063 VALIDATOR: Checking that basic blocks are aligned | |
1064 *** <input> IS UNSAFE *** | |
1065 @dis: | |
1066 0000000000000000: 48 8c c0 mov %rax, %es | |
1067 @rdfa_output: | |
1068 0: [0] unrecognized instruction | |
1069 return code: 1 | |
OLD | NEW |