OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can be | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 /* | |
8 * ncdecode_tests.c - simple unit tests for NaCl decoder | |
9 */ | |
10 | |
11 #ifndef NACL_TRUSTED_BUT_NOT_TCB | |
12 #error("This file is not meant for use in the TCB") | |
13 #endif | |
14 | |
15 #include <stdio.h> | |
16 #include "native_client/src/shared/gio/gio.h" | |
17 #include "native_client/src/shared/platform/nacl_log.h" | |
18 #include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h" | |
19 #include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose
.h" | |
20 | |
21 struct NCDecodeTestCase { | |
22 char *description; | |
23 size_t testsize; | |
24 uint8_t *testbytes; | |
25 }; | |
26 | |
27 struct NCDecodeTestCase NCDecoderTests[] = { | |
28 { | |
29 "test 1", | |
30 25, | |
31 (uint8_t *)"\x55" | |
32 "\x89\xe5" | |
33 "\x83\xec\x08" | |
34 "\xe8\x81\x00\x00\x00" | |
35 "\xe8\xd3\x00\x00\x00" | |
36 "\xe8\xf3\x04\x00\x00" | |
37 "\xc9" | |
38 "\xc3" | |
39 "\x00\x00", | |
40 }, | |
41 { | |
42 "test2", | |
43 341, | |
44 (uint8_t *)"\x8d\x4c\x24\x04" | |
45 "\x83\xe4\xf0" | |
46 "\xff\x71\xfc" | |
47 "\x55" | |
48 "\x89\xe5" | |
49 "\x51" | |
50 "\x66\x90" | |
51 "\x83\xec\x24" | |
52 "\x89\x4d\xe8" | |
53 "\xc7\x45\xf4\x0a\x00\x00\x00" | |
54 "\x8b\x45\xe8" | |
55 "\x83\x38\x01" | |
56 "\x7f\x2b" | |
57 "\x8b\x55\xe8" | |
58 "\x8b\x42\x04" | |
59 "\x8b\x00" | |
60 "\x8d\x76\x00" | |
61 "\x89\x44\x24\x04" | |
62 "\xc7\x04\x24\x54\x14\x00\x08" | |
63 "\xe8\xc0\x02\x00\x00" | |
64 "\xc7\x04\x24\x01\x00\x00\x00" | |
65 "\x8d\x74\x26\x00" | |
66 "\xe8\xc0\x01\x00\x00" | |
67 "\x8b\x55\xe8" | |
68 "\x8b\x42\x04" | |
69 "\x83\xc0\x04" | |
70 "\x8b\x00" | |
71 "\x89\x04\x24" | |
72 "\x66\x90" | |
73 "\x8d\x74\x26\x00" | |
74 "\x8d\xbc\x27\x00\x00\x00\x00" | |
75 "\xe8\x90\x09\x00\x00" | |
76 "\x89\x45\xf8" | |
77 "\x8b\x45\xe8" | |
78 "\x83\x38\x02" | |
79 "\x7e\x25" | |
80 "\x8b\x55\xe8" | |
81 "\x66\x90" | |
82 "\x8b\x42\x04" | |
83 "\x83\xc0\x08" | |
84 "\x8b\x00" | |
85 "\x89\x04\x24" | |
86 "\xe8\x70\x09\x00\x00" | |
87 "\x89\x45\xf4" | |
88 "\x8d\xb6\x00\x00\x00\x00" | |
89 "\x8d\xbc\x27\x00\x00\x00\x00" | |
90 "\x8b\x45\xf4" | |
91 "\xa3\x28\x2f\x00\x08" | |
92 "\xeb\x26" | |
93 "\x8d\xb6\x00\x00\x00\x00" | |
94 "\xc7\x44\x24\x08\x03\x00\x00\x00, " | |
95 "\xc7\x44\x24\x04\x01\x00\x00\x00, " | |
96 "\x8b\x45\xf4" | |
97 "\x89\x04\x24" | |
98 "\x90" | |
99 "\x8d\x74\x26\x00" | |
100 "\xe8\x20\x00\x00\x00" | |
101 "\x83\x7d\xf8\x00" | |
102 "\x0f\x9f\xc0" | |
103 "\x83\x6d\xf8\x01" | |
104 "\x84\xc0" | |
105 "\x8d\x76\x00" | |
106 "\x75\xce" | |
107 "\xc7\x04\x24\x00\x00\x00\x00" | |
108 "\x66\x90" | |
109 "\xe8\x20\x01\x00\x00" | |
110 "\x55" | |
111 "\x89\xe5" | |
112 "\x83\xec\x1c" | |
113 "\x83\x7d\x08\x01" | |
114 "\x75\x44" | |
115 "\x8b\x55\x0c" | |
116 "\x90" | |
117 "\x8b\x04\x95\x24\x2f\x00\x08" | |
118 "\x83\xe8\x01" | |
119 "\x8d\xb6\x00\x00\x00\x00" | |
120 "\x89\x04\x95\x24\x2f\x00\x08" | |
121 "\x8b\x55\x10" | |
122 "\x8d\xb6\x00\x00\x00\x00" | |
123 "\x8b\x04\x95\x24\x2f\x00\x08" | |
124 "\x83\xc0\x01" | |
125 "\x8d\xb6\x00\x00\x00\x00" | |
126 "\x89\x04\x95\x24\x2f\x00\x08" | |
127 "\xeb\x77" | |
128 "\x8d\xb4\x26\x00\x00\x00\x00" | |
129 "\x8b\x45\x10" | |
130 "\x8b\x55\x0c" | |
131 "\x01\xc2" | |
132 "\xb8\x06\x00\x00\x00" | |
133 "\x29\xd0" | |
134 "\x90" | |
135 }, | |
136 { | |
137 "test 3", | |
138 9, | |
139 (uint8_t *)"\x3c\x25" | |
140 "\x90\x90\x90\x90\x90\x90\x90" | |
141 }, | |
142 { "test4", | |
143 13, | |
144 (uint8_t *)"\xc1\xf9\x1f\x89\x4d\xe4" | |
145 "\x90\x90\x90\x90\x90\x90\x90" | |
146 }, | |
147 { | |
148 "test5", | |
149 12, | |
150 (uint8_t *)"\xc6\x44\x05\xd6\x00" | |
151 "\x90\x90\x90\x90\x90\x90\x90" | |
152 }, | |
153 { | |
154 "test6", | |
155 14, | |
156 (uint8_t *)"\xff\x24\x95\xc8\x6e\x05\x08" | |
157 "\x90\x90\x90\x90\x90\x90\x90" | |
158 }, | |
159 { | |
160 "test7", | |
161 15, | |
162 (uint8_t *)"\x0f\xab\x14\x85\x40\xfb\x27\x08" | |
163 "\x90\x90\x90\x90\x90\x90\x90" | |
164 }, | |
165 { | |
166 "test8", | |
167 11, | |
168 (uint8_t *)"\x66\xbf\x08\x00" | |
169 "\x90\x90\x90\x90\x90\x90\x90" | |
170 }, | |
171 { | |
172 "test9", | |
173 12, | |
174 (uint8_t *)"\x66\x0f\xbe\x04\x10" | |
175 "\x90\x90\x90\x90\x90\x90\x90" | |
176 }, | |
177 /* ldmxcsr, stmxcsr */ | |
178 { | |
179 "test10", | |
180 15, | |
181 (uint8_t *)"\x90\x0f\xae\x10\x90\x0f\xae\x18" | |
182 "\x90\x90\x90\x90\x90\x90\x90" | |
183 }, | |
184 /* invalid */ | |
185 { | |
186 "test11", | |
187 11, | |
188 (uint8_t *)"\x90\x0f\xae\x21" | |
189 "\x90\x90\x90\x90\x90\x90\x90" | |
190 }, | |
191 /* lfence */ | |
192 { | |
193 "test12", | |
194 11, | |
195 (uint8_t *)"\x90\x0f\xae\x28" | |
196 "\x90\x90\x90\x90\x90\x90\x90" | |
197 }, | |
198 { | |
199 "test13", | |
200 9, | |
201 (uint8_t *)"\xf0\x0f\xb1\x8f\xa8\x01\x00\x00" | |
202 "\x90" | |
203 }, | |
204 { | |
205 "test14", | |
206 17, | |
207 (uint8_t *)"\x84\xd4\x04\x53\xa0\x04\x6a\x5a\x20\xcc\xb8\x48\x03" | |
208 "\x2b\x96\x11\xf4" | |
209 }, | |
210 { | |
211 "test15", | |
212 17, | |
213 (uint8_t *)"\xb0\xb9\xd8\x3d\x60\xe4\x2c\x15\x43\x61\x4e\x03\x39" | |
214 "\xfc\x79\x4b\xf4" | |
215 }, | |
216 { | |
217 "test16", | |
218 17, | |
219 (uint8_t *)"\x66\x66\x66\x66\x0f\x1f\x0d\x1a\xed\x25\x37\x27\x0a" | |
220 "\xff\xc6\x1a\xf4" | |
221 }, | |
222 { | |
223 "test17", | |
224 18, | |
225 (uint8_t *)"\x66\xeb\x1b\x31\x51\x3d\xef\xcc\x2f\x36\x48\x6e\x44" | |
226 "\x2e\xcc\x14\x00\xf4" | |
227 }, | |
228 { | |
229 "test18", | |
230 17, | |
231 (uint8_t *)"\x67\x8d\x1d\x22\xa0\x05\xe3\x7b\x9c\xdb\x08\x04\xb1" | |
232 "\x90\xed\x12\xf4" | |
233 }, | |
234 { | |
235 "test 19", | |
236 20, | |
237 (uint8_t *)"\x45\x7f\x89\x58\x94\x04\x24\x1b\xc3\xe2\x6f\x1a\x94\x87\x8f\x0b
\x00\x00\x90\xf4", | |
238 }, | |
239 { | |
240 "test 20", | |
241 8, | |
242 (uint8_t *)"\x66\x0f\x3a\x0e\xd0\xc0\x90\xf4" | |
243 }, | |
244 { | |
245 "test 21: palignr (SSSE3)", | |
246 8, | |
247 (uint8_t *)"\x66\x0f\x3a\x0f\xd0\xc0\x90\xf4" | |
248 }, | |
249 { | |
250 "test 22: SSSE3", | |
251 8, | |
252 (uint8_t *)"\x66\x0f\x38\x00\x00\x00\x90\xf4" | |
253 }, | |
254 { | |
255 "test 23: 3DNow", | |
256 7, | |
257 (uint8_t *)"\x0f\x0f\x46\x01\xbf\x90\xf4" | |
258 }, | |
259 { | |
260 "test 24: SSSE3 error", | |
261 8, | |
262 (uint8_t *)"\x66\x0f\x3a\x0e\xd0\xc0\x90\xf4" | |
263 }, | |
264 { | |
265 "test 25: lzcnt", | |
266 6, | |
267 (uint8_t *)"\xf3\x0f\xbd\x00\x90\xf4", | |
268 }, | |
269 { | |
270 "test 26: 3dnow", | |
271 6, | |
272 (uint8_t *)"\x0f\x0f\x01\x0c\x90\xf4", | |
273 }, | |
274 { | |
275 "test 27: addr16 variants", | |
276 17, | |
277 (uint8_t *)"\x67\x01\x00" | |
278 "\x67\x01\x40\x00" | |
279 "\x67\x01\x80\x00\x90" | |
280 "\x67\x01\xc0" | |
281 "\x90\xf4", | |
282 }, | |
283 { | |
284 "test 28: lock cmpxchg8b", | |
285 6, | |
286 (uint8_t *)"\xf0\x0f\xc7\010\x90\xf4" | |
287 }, | |
288 { | |
289 "test 29: SSE3", | |
290 8, | |
291 (uint8_t *)"\x66\x0f\x7d\x00\x90\x90\x90\xf4" | |
292 }, | |
293 { | |
294 "test 30: MMXSSE2", | |
295 10, | |
296 (uint8_t *)"\x66\x0f\x71\xf6\x00\x90\x90\x90\x90\xf4", | |
297 }, | |
298 { | |
299 "test 31: call %esp", | |
300 7, | |
301 /* 11 100 000 */ | |
302 (uint8_t *)"\x83\xe4\xf0\xff\xd4\x90\xf4", | |
303 }, | |
304 { | |
305 "test 32: roundss", | |
306 9, | |
307 (uint8_t *)"\x66\x0f\x3a\x0a\xc0\x00" | |
308 "\x90\x90" | |
309 "\xf4", | |
310 }, | |
311 { | |
312 "test 33: crc32", | |
313 8, | |
314 (uint8_t *)"\xf2\x0f\x38\xf1\xc3" | |
315 "\x90\x90" | |
316 "\xf4", | |
317 }, | |
318 { | |
319 "test 34: SSE4", | |
320 8, | |
321 (uint8_t *)"\x66\x0f\x38\x0a\xd0\x90\x90\xf4" | |
322 } | |
323 }; | |
324 | |
325 #define sizeofA(array) (sizeof(array)/sizeof(array[0])) | |
326 void ncdecode_unittests(void) { | |
327 size_t i; | |
328 | |
329 for (i = 0; i < sizeofA(NCDecoderTests); i++) { | |
330 printf("==========================================================\n"); | |
331 printf("%s\n", NCDecoderTests[i].description); | |
332 NCDecodeSegment(NCDecoderTests[i].testbytes, | |
333 (uint32_t)(NCDecoderTests[i].testbytes), | |
334 NCDecoderTests[i].testsize); | |
335 } | |
336 } | |
337 | |
338 int main(void) { | |
339 struct GioFile gio_out_stream; | |
340 struct Gio *gout = (struct Gio*) &gio_out_stream; | |
341 if (!GioFileRefCtor(&gio_out_stream, stdout)) { | |
342 fprintf(stderr, "Unable to create gio file for stdout!\n"); | |
343 return 1; | |
344 } | |
345 NaClLogModuleInitExtended(LOG_INFO, gout); | |
346 ncdecode_unittests(); | |
347 printf("PASSED\n"); | |
348 GioFileDtor(gout); | |
349 return 0; | |
350 } | |
OLD | NEW |