Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: src/trusted/validator_ragel/unreviewed/decoder-test.c

Issue 9968039: Add ragel machine generators to SCONS (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 #include <assert.h> 7 #include <assert.h>
8 #include <elf.h>
9 #include <inttypes.h>
10 #include <stdio.h> 8 #include <stdio.h>
11 #include <stdlib.h> 9 #include <stdlib.h>
12 #include <string.h> 10 #include <string.h>
13 #include "decoder.h"
14 11
15 #undef TRUE 12 #include "native_client/src/include/elf32.h"
16 #define TRUE 1 13 #include "native_client/src/include/elf64.h"
17 14 #include "native_client/src/shared/utils/types.h"
18 #undef FALSE 15 #include "native_client/src/trusted/validator_ragel/unreviewed/decoder.h"
19 #define FALSE 0
20 16
21 static void CheckBounds(unsigned char *data, size_t data_size, 17 static void CheckBounds(unsigned char *data, size_t data_size,
22 void *ptr, size_t inside_size) { 18 void *ptr, size_t inside_size) {
23 assert(data <= (unsigned char *) ptr); 19 assert(data <= (unsigned char *) ptr);
24 assert((unsigned char *) ptr + inside_size <= data + data_size); 20 assert((unsigned char *) ptr + inside_size <= data + data_size);
21
22 UNREFERENCED_PARAMETER(data);
Mark Seaborn 2012/04/05 16:58:53 It's not unreferenced: it's referenced immediately
khim 2012/04/05 17:59:16 Done.
23 UNREFERENCED_PARAMETER(data_size);
24 UNREFERENCED_PARAMETER(ptr);
25 UNREFERENCED_PARAMETER(inside_size);
25 } 26 }
26 27
27 void ReadFile(const char *filename, uint8_t **result, size_t *result_size) { 28 void ReadImage(const char *filename, uint8_t **result, size_t *result_size) {
28 FILE *fp; 29 FILE *fp;
29 uint8_t *data; 30 uint8_t *data;
30 size_t file_size; 31 size_t file_size;
31 size_t got; 32 size_t got;
32 33
33 fp = fopen(filename, "rb"); 34 fp = fopen(filename, "rb");
34 if (fp == NULL) { 35 if (fp == NULL) {
35 fprintf(stderr, "Failed to open input file: %s\n", filename); 36 fprintf(stderr, "Failed to open input file: %s\n", filename);
36 exit(1); 37 exit(1);
37 } 38 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 const char *instruction_name; 70 const char *instruction_name;
70 unsigned char operands_count; 71 unsigned char operands_count;
71 const uint8_t *p; 72 const uint8_t *p;
72 char delimeter = ' '; 73 char delimeter = ' ';
73 int print_rip = FALSE; 74 int print_rip = FALSE;
74 int rex_bits = 0; 75 int rex_bits = 0;
75 int maybe_rex_bits = 0; 76 int maybe_rex_bits = 0;
76 int show_name_suffix = FALSE; 77 int show_name_suffix = FALSE;
77 int empty_rex_prefix_ok = FALSE; 78 int empty_rex_prefix_ok = FALSE;
78 #define print_name(x) (printf((x)), shown_name += strlen((x))) 79 #define print_name(x) (printf((x)), shown_name += strlen((x)))
79 int shown_name = 0; 80 size_t shown_name = 0;
80 int i, operand_type; 81 int i, operand_type;
81 82
82 /* "fwait" is nasty: any number of them will be included in other X87 83 /* "fwait" is nasty: any number of them will be included in other X87
83 instructions ("fclex", "finit", "fstcw", "fstsw", "fsave" have two 84 instructions ("fclex", "finit", "fstcw", "fstsw", "fsave" have two
84 names, other instructions are unchanged) - but if after them we see 85 names, other instructions are unchanged) - but if after them we see
85 regular instruction then we must print all them. This convoluted 86 regular instruction then we must print all them. This convoluted
86 logic is not needed when we don't print anything so decoder does 87 logic is not needed when we don't print anything so decoder does
87 not include it. */ 88 not include it. */
88 if ((end == begin + 1) && (begin[0] == 0x9b)) { 89 if ((end == begin + 1) && (begin[0] == 0x9b)) {
89 if (!(((struct DecodeState *)userdata)->fwait)) { 90 if (!(((struct DecodeState *)userdata)->fwait)) {
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 instruction->operands[i].name -= 8; 524 instruction->operands[i].name -= 8;
524 --rex_bits; 525 --rex_bits;
525 } 526 }
526 } 527 }
527 } 528 }
528 } 529 }
529 } else if (instruction->operands[i].name == REG_RM) { 530 } else if (instruction->operands[i].name == REG_RM) {
530 if ((instruction->rm.base >= REG_R8) && 531 if ((instruction->rm.base >= REG_R8) &&
531 (instruction->rm.base <= REG_R15)) { 532 (instruction->rm.base <= REG_R15)) {
532 ++rex_bits; 533 ++rex_bits;
533 } else if ((instruction->rm.base == REG_NONE) || 534 } else if ((instruction->rm.base == NO_REG) ||
534 (instruction->rm.base == REG_RIP)) { 535 (instruction->rm.base == REG_RIP)) {
535 ++maybe_rex_bits; 536 ++maybe_rex_bits;
536 } 537 }
537 if ((instruction->rm.index >= REG_R8) && 538 if ((instruction->rm.index >= REG_R8) &&
538 (instruction->rm.index <= REG_R15)) { 539 (instruction->rm.index <= REG_R15)) {
539 ++rex_bits; 540 ++rex_bits;
540 } 541 }
541 } 542 }
542 } 543 }
543 } 544 }
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 ++shown_name; 770 ++shown_name;
770 } 771 }
771 } 772 }
772 if (!strcmp(instruction_name, "mov")) { 773 if (!strcmp(instruction_name, "mov")) {
773 if ((instruction->operands[1].name == REG_IMM) && 774 if ((instruction->operands[1].name == REG_IMM) &&
774 (instruction->operands[1].type == OperandSize64bit)) { 775 (instruction->operands[1].type == OperandSize64bit)) {
775 print_name("abs"); 776 print_name("abs");
776 } 777 }
777 } 778 }
778 { 779 {
780 size_t i;
779 /* Print branch hint suffixes for conditional jump instructions (Jcc). */ 781 /* Print branch hint suffixes for conditional jump instructions (Jcc). */
780 const char* jcc_jumps[] = { 782 const char* jcc_jumps[] = {
781 "ja", "jae", "jbe", "jb", "je", "jg", "jge", "jle", 783 "ja", "jae", "jbe", "jb", "je", "jg", "jge", "jle",
782 "jl", "jne", "jno", "jnp", "jns", "jo", "jp", "js", NULL}; 784 "jl", "jne", "jno", "jnp", "jns", "jo", "jp", "js", NULL};
783 for (int i = 0; jcc_jumps[i] != NULL; ++i) { 785 for (i = 0; jcc_jumps[i] != NULL; ++i) {
784 if (!strcmp(instruction_name, jcc_jumps[i])) { 786 if (!strcmp(instruction_name, jcc_jumps[i])) {
785 if (instruction->prefix.branch_not_taken) { 787 if (instruction->prefix.branch_not_taken) {
786 print_name(",pn"); 788 print_name(",pn");
787 } else if (instruction->prefix.branch_taken) { 789 } else if (instruction->prefix.branch_taken) {
788 print_name(",pt"); 790 print_name(",pt");
789 } 791 }
790 break; 792 break;
791 } 793 }
792 } 794 }
793 } 795 }
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 case OperandDebugRegister: printf("%%db15"); break; 1144 case OperandDebugRegister: printf("%%db15"); break;
1143 default: assert(FALSE); 1145 default: assert(FALSE);
1144 } 1146 }
1145 break; 1147 break;
1146 case REG_ST: 1148 case REG_ST:
1147 assert(operand_type == OperandST); 1149 assert(operand_type == OperandST);
1148 printf("%%st"); 1150 printf("%%st");
1149 break; 1151 break;
1150 case REG_RM: { 1152 case REG_RM: {
1151 if (instruction->rm.offset) { 1153 if (instruction->rm.offset) {
1152 printf("0x%"PRIx64, instruction->rm.offset); 1154 printf("0x%"NACL_PRIx64, instruction->rm.offset);
1153 } 1155 }
1154 if (((struct DecodeState *)userdata)->ia32_mode) { 1156 if (((struct DecodeState *)userdata)->ia32_mode) {
1155 if ((instruction->rm.base != REG_NONE) || 1157 if ((instruction->rm.base != NO_REG) ||
1156 (instruction->rm.index != REG_NONE) || 1158 (instruction->rm.index != NO_REG) ||
1157 (instruction->rm.scale != 0)) { 1159 (instruction->rm.scale != 0)) {
1158 printf("("); 1160 printf("(");
1159 } 1161 }
1160 switch (instruction->rm.base) { 1162 switch (instruction->rm.base) {
1161 case REG_RAX: printf("%%eax"); break; 1163 case REG_RAX: printf("%%eax"); break;
1162 case REG_RCX: printf("%%ecx"); break; 1164 case REG_RCX: printf("%%ecx"); break;
1163 case REG_RDX: printf("%%edx"); break; 1165 case REG_RDX: printf("%%edx"); break;
1164 case REG_RBX: printf("%%ebx"); break; 1166 case REG_RBX: printf("%%ebx"); break;
1165 case REG_RSP: printf("%%esp"); break; 1167 case REG_RSP: printf("%%esp"); break;
1166 case REG_RBP: printf("%%ebp"); break; 1168 case REG_RBP: printf("%%ebp"); break;
1167 case REG_RSI: printf("%%esi"); break; 1169 case REG_RSI: printf("%%esi"); break;
1168 case REG_RDI: printf("%%edi"); break; 1170 case REG_RDI: printf("%%edi"); break;
1169 case REG_NONE: break; 1171 case NO_REG: break;
1170 case REG_R8: 1172 case REG_R8:
1171 case REG_R9: 1173 case REG_R9:
1172 case REG_R10: 1174 case REG_R10:
1173 case REG_R11: 1175 case REG_R11:
1174 case REG_R12: 1176 case REG_R12:
1175 case REG_R13: 1177 case REG_R13:
1176 case REG_R14: 1178 case REG_R14:
1177 case REG_R15: 1179 case REG_R15:
1178 case REG_RIP: 1180 case REG_RIP:
1179 case REG_RM: 1181 case REG_RM:
(...skipping 14 matching lines...) Expand all
1194 case REG_RDX: printf(",%%edx,%d",1<<instruction->rm.scale); break; 1196 case REG_RDX: printf(",%%edx,%d",1<<instruction->rm.scale); break;
1195 case REG_RBX: printf(",%%ebx,%d",1<<instruction->rm.scale); break; 1197 case REG_RBX: printf(",%%ebx,%d",1<<instruction->rm.scale); break;
1196 case REG_RSP: printf(",%%esp,%d",1<<instruction->rm.scale); break; 1198 case REG_RSP: printf(",%%esp,%d",1<<instruction->rm.scale); break;
1197 case REG_RBP: printf(",%%ebp,%d",1<<instruction->rm.scale); break; 1199 case REG_RBP: printf(",%%ebp,%d",1<<instruction->rm.scale); break;
1198 case REG_RSI: printf(",%%esi,%d",1<<instruction->rm.scale); break; 1200 case REG_RSI: printf(",%%esi,%d",1<<instruction->rm.scale); break;
1199 case REG_RDI: printf(",%%edi,%d",1<<instruction->rm.scale); break; 1201 case REG_RDI: printf(",%%edi,%d",1<<instruction->rm.scale); break;
1200 case REG_RIZ: if ((instruction->rm.base != REG_RSP) || 1202 case REG_RIZ: if ((instruction->rm.base != REG_RSP) ||
1201 (instruction->rm.scale != 0)) 1203 (instruction->rm.scale != 0))
1202 printf(",%%eiz,%d",1<<instruction->rm.scale); 1204 printf(",%%eiz,%d",1<<instruction->rm.scale);
1203 break; 1205 break;
1204 case REG_NONE: break; 1206 case NO_REG: break;
1205 case REG_R8: 1207 case REG_R8:
1206 case REG_R9: 1208 case REG_R9:
1207 case REG_R10: 1209 case REG_R10:
1208 case REG_R11: 1210 case REG_R11:
1209 case REG_R12: 1211 case REG_R12:
1210 case REG_R13: 1212 case REG_R13:
1211 case REG_R14: 1213 case REG_R14:
1212 case REG_R15: 1214 case REG_R15:
1213 case REG_RM: 1215 case REG_RM:
1214 case REG_RIP: 1216 case REG_RIP:
1215 case REG_IMM: 1217 case REG_IMM:
1216 case REG_IMM2: 1218 case REG_IMM2:
1217 case REG_DS_RBX: 1219 case REG_DS_RBX:
1218 case REG_ES_RDI: 1220 case REG_ES_RDI:
1219 case REG_DS_RSI: 1221 case REG_DS_RSI:
1220 case REG_PORT_DX: 1222 case REG_PORT_DX:
1221 case REG_ST: 1223 case REG_ST:
1222 case JMP_TO: 1224 case JMP_TO:
1223 assert(FALSE); 1225 assert(FALSE);
1224 } 1226 }
1225 if ((instruction->rm.base != REG_NONE) || 1227 if ((instruction->rm.base != NO_REG) ||
1226 (instruction->rm.index != REG_NONE) || 1228 (instruction->rm.index != NO_REG) ||
1227 (instruction->rm.scale != 0)) { 1229 (instruction->rm.scale != 0)) {
1228 printf(")"); 1230 printf(")");
1229 } 1231 }
1230 } else { 1232 } else {
1231 if ((instruction->rm.base != REG_NONE) || 1233 if ((instruction->rm.base != NO_REG) ||
1232 (instruction->rm.index != REG_RIZ) || 1234 (instruction->rm.index != REG_RIZ) ||
1233 (instruction->rm.scale != 0)) { 1235 (instruction->rm.scale != 0)) {
1234 printf("("); 1236 printf("(");
1235 } 1237 }
1236 switch (instruction->rm.base) { 1238 switch (instruction->rm.base) {
1237 case REG_RAX: printf("%%rax"); break; 1239 case REG_RAX: printf("%%rax"); break;
1238 case REG_RCX: printf("%%rcx"); break; 1240 case REG_RCX: printf("%%rcx"); break;
1239 case REG_RDX: printf("%%rdx"); break; 1241 case REG_RDX: printf("%%rdx"); break;
1240 case REG_RBX: printf("%%rbx"); break; 1242 case REG_RBX: printf("%%rbx"); break;
1241 case REG_RSP: printf("%%rsp"); break; 1243 case REG_RSP: printf("%%rsp"); break;
1242 case REG_RBP: printf("%%rbp"); break; 1244 case REG_RBP: printf("%%rbp"); break;
1243 case REG_RSI: printf("%%rsi"); break; 1245 case REG_RSI: printf("%%rsi"); break;
1244 case REG_RDI: printf("%%rdi"); break; 1246 case REG_RDI: printf("%%rdi"); break;
1245 case REG_R8: printf("%%r8"); break; 1247 case REG_R8: printf("%%r8"); break;
1246 case REG_R9: printf("%%r9"); break; 1248 case REG_R9: printf("%%r9"); break;
1247 case REG_R10: printf("%%r10"); break; 1249 case REG_R10: printf("%%r10"); break;
1248 case REG_R11: printf("%%r11"); break; 1250 case REG_R11: printf("%%r11"); break;
1249 case REG_R12: printf("%%r12"); break; 1251 case REG_R12: printf("%%r12"); break;
1250 case REG_R13: printf("%%r13"); break; 1252 case REG_R13: printf("%%r13"); break;
1251 case REG_R14: printf("%%r14"); break; 1253 case REG_R14: printf("%%r14"); break;
1252 case REG_R15: printf("%%r15"); break; 1254 case REG_R15: printf("%%r15"); break;
1253 case REG_RIP: printf("%%rip"); print_rip = TRUE; break; 1255 case REG_RIP: printf("%%rip"); print_rip = TRUE; break;
1254 case REG_NONE: break; 1256 case NO_REG: break;
1255 case REG_RM: 1257 case REG_RM:
1256 case REG_RIZ: 1258 case REG_RIZ:
1257 case REG_IMM: 1259 case REG_IMM:
1258 case REG_IMM2: 1260 case REG_IMM2:
1259 case REG_DS_RBX: 1261 case REG_DS_RBX:
1260 case REG_ES_RDI: 1262 case REG_ES_RDI:
1261 case REG_DS_RSI: 1263 case REG_DS_RSI:
1262 case REG_PORT_DX: 1264 case REG_PORT_DX:
1263 case REG_ST: 1265 case REG_ST:
1264 case JMP_TO: 1266 case JMP_TO:
1265 assert(FALSE); 1267 assert(FALSE);
1266 } 1268 }
1267 switch (instruction->rm.index) { 1269 switch (instruction->rm.index) {
1268 case REG_RAX: printf(",%%rax,%d",1<<instruction->rm.scale); break; 1270 case REG_RAX: printf(",%%rax,%d",1<<instruction->rm.scale); break;
1269 case REG_RCX: printf(",%%rcx,%d",1<<instruction->rm.scale); break; 1271 case REG_RCX: printf(",%%rcx,%d",1<<instruction->rm.scale); break;
1270 case REG_RDX: printf(",%%rdx,%d",1<<instruction->rm.scale); break; 1272 case REG_RDX: printf(",%%rdx,%d",1<<instruction->rm.scale); break;
1271 case REG_RBX: printf(",%%rbx,%d",1<<instruction->rm.scale); break; 1273 case REG_RBX: printf(",%%rbx,%d",1<<instruction->rm.scale); break;
1272 case REG_RSP: printf(",%%rsp,%d",1<<instruction->rm.scale); break; 1274 case REG_RSP: printf(",%%rsp,%d",1<<instruction->rm.scale); break;
1273 case REG_RBP: printf(",%%rbp,%d",1<<instruction->rm.scale); break; 1275 case REG_RBP: printf(",%%rbp,%d",1<<instruction->rm.scale); break;
1274 case REG_RSI: printf(",%%rsi,%d",1<<instruction->rm.scale); break; 1276 case REG_RSI: printf(",%%rsi,%d",1<<instruction->rm.scale); break;
1275 case REG_RDI: printf(",%%rdi,%d",1<<instruction->rm.scale); break; 1277 case REG_RDI: printf(",%%rdi,%d",1<<instruction->rm.scale); break;
1276 case REG_R8: printf(",%%r8,%d",1<<instruction->rm.scale); break; 1278 case REG_R8: printf(",%%r8,%d",1<<instruction->rm.scale); break;
1277 case REG_R9: printf(",%%r9,%d",1<<instruction->rm.scale); break; 1279 case REG_R9: printf(",%%r9,%d",1<<instruction->rm.scale); break;
1278 case REG_R10: printf(",%%r10,%d",1<<instruction->rm.scale); break; 1280 case REG_R10: printf(",%%r10,%d",1<<instruction->rm.scale); break;
1279 case REG_R11: printf(",%%r11,%d",1<<instruction->rm.scale); break; 1281 case REG_R11: printf(",%%r11,%d",1<<instruction->rm.scale); break;
1280 case REG_R12: printf(",%%r12,%d",1<<instruction->rm.scale); break; 1282 case REG_R12: printf(",%%r12,%d",1<<instruction->rm.scale); break;
1281 case REG_R13: printf(",%%r13,%d",1<<instruction->rm.scale); break; 1283 case REG_R13: printf(",%%r13,%d",1<<instruction->rm.scale); break;
1282 case REG_R14: printf(",%%r14,%d",1<<instruction->rm.scale); break; 1284 case REG_R14: printf(",%%r14,%d",1<<instruction->rm.scale); break;
1283 case REG_R15: printf(",%%r15,%d",1<<instruction->rm.scale); break; 1285 case REG_R15: printf(",%%r15,%d",1<<instruction->rm.scale); break;
1284 case REG_RIZ: if (((instruction->rm.base != REG_NONE) && 1286 case REG_RIZ: if (((instruction->rm.base != NO_REG) &&
1285 (instruction->rm.base != REG_RSP) && 1287 (instruction->rm.base != REG_RSP) &&
1286 (instruction->rm.base != REG_R12)) || 1288 (instruction->rm.base != REG_R12)) ||
1287 (instruction->rm.scale != 0)) 1289 (instruction->rm.scale != 0))
1288 printf(",%%riz,%d",1<<instruction->rm.scale); 1290 printf(",%%riz,%d",1<<instruction->rm.scale);
1289 break; 1291 break;
1290 case REG_NONE: break; 1292 case NO_REG: break;
1291 case REG_RM: 1293 case REG_RM:
1292 case REG_RIP: 1294 case REG_RIP:
1293 case REG_IMM: 1295 case REG_IMM:
1294 case REG_IMM2: 1296 case REG_IMM2:
1295 case REG_DS_RBX: 1297 case REG_DS_RBX:
1296 case REG_ES_RDI: 1298 case REG_ES_RDI:
1297 case REG_DS_RSI: 1299 case REG_DS_RSI:
1298 case REG_PORT_DX: 1300 case REG_PORT_DX:
1299 case REG_ST: 1301 case REG_ST:
1300 case JMP_TO: 1302 case JMP_TO:
1301 assert(FALSE); 1303 assert(FALSE);
1302 } 1304 }
1303 if ((instruction->rm.base != REG_NONE) || 1305 if ((instruction->rm.base != NO_REG) ||
1304 (instruction->rm.index != REG_RIZ) || 1306 (instruction->rm.index != REG_RIZ) ||
1305 (instruction->rm.scale != 0)) { 1307 (instruction->rm.scale != 0)) {
1306 printf(")"); 1308 printf(")");
1307 } 1309 }
1308 } 1310 }
1309 } 1311 }
1310 break; 1312 break;
1311 case REG_IMM: { 1313 case REG_IMM: {
1312 printf("$0x%"PRIx64,instruction->imm[0]); 1314 printf("$0x%"NACL_PRIx64,instruction->imm[0]);
1313 break; 1315 break;
1314 } 1316 }
1315 case REG_IMM2: { 1317 case REG_IMM2: {
1316 printf("$0x%"PRIx64,instruction->imm[1]); 1318 printf("$0x%"NACL_PRIx64,instruction->imm[1]);
1317 break; 1319 break;
1318 } 1320 }
1319 case REG_PORT_DX: printf("(%%dx)"); break; 1321 case REG_PORT_DX: printf("(%%dx)"); break;
1320 case REG_DS_RBX: if (((struct DecodeState *)userdata)->ia32_mode) { 1322 case REG_DS_RBX: if (((struct DecodeState *)userdata)->ia32_mode) {
1321 printf("%%ds:(%%ebx)"); 1323 printf("%%ds:(%%ebx)");
1322 } else { 1324 } else {
1323 printf("%%ds:(%%rbx)"); 1325 printf("%%ds:(%%rbx)");
1324 } 1326 }
1325 break; 1327 break;
1326 case REG_ES_RDI: if (((struct DecodeState *)userdata)->ia32_mode) { 1328 case REG_ES_RDI: if (((struct DecodeState *)userdata)->ia32_mode) {
1327 printf("%%es:(%%edi)"); 1329 printf("%%es:(%%edi)");
1328 } else { 1330 } else {
1329 printf("%%es:(%%rdi)"); 1331 printf("%%es:(%%rdi)");
1330 } 1332 }
1331 break; 1333 break;
1332 case REG_DS_RSI: if (((struct DecodeState *)userdata)->ia32_mode) { 1334 case REG_DS_RSI: if (((struct DecodeState *)userdata)->ia32_mode) {
1333 printf("%%ds:(%%esi)"); 1335 printf("%%ds:(%%esi)");
1334 } else { 1336 } else {
1335 printf("%%ds:(%%rsi)"); 1337 printf("%%ds:(%%rsi)");
1336 } 1338 }
1337 break; 1339 break;
1338 case JMP_TO: if (instruction->operands[0].type == OperandSize16bit) 1340 case JMP_TO: if (instruction->operands[0].type == OperandSize16bit)
1339 printf("0x%zx", ((end + instruction->rm.offset - 1341 printf("0x%"NACL_PRIxS, ((end + instruction->rm.offset -
1340 (((struct DecodeState *)userdata)->offset)) & 0xffff)); 1342 (((struct DecodeState *)userdata)->offset)) & 0xffff));
1341 else 1343 else
1342 printf("0x%zx", (end + instruction->rm.offset - 1344 printf("0x%"NACL_PRIxS, (end + instruction->rm.offset -
1343 (((struct DecodeState *)userdata)->offset))); 1345 (((struct DecodeState *)userdata)->offset)));
1344 break; 1346 break;
1345 case REG_RIP: 1347 case REG_RIP:
1346 case REG_RIZ: 1348 case REG_RIZ:
1347 case REG_NONE: 1349 case NO_REG:
1348 assert(FALSE); 1350 assert(FALSE);
1349 } 1351 }
1350 delimeter = ','; 1352 delimeter = ',';
1351 } 1353 }
1352 if (print_rip) { 1354 if (print_rip) {
1353 printf(" # 0x%8"PRIx64, 1355 printf(" # 0x%8"NACL_PRIx64,
1354 (uint64_t) (end + instruction->rm.offset - 1356 (uint64_t) (end + instruction->rm.offset -
1355 (((struct DecodeState *)userdata)->offset))); 1357 (((struct DecodeState *)userdata)->offset)));
1356 } 1358 }
1357 printf("\n"); 1359 printf("\n");
1358 begin += 7; 1360 begin += 7;
1359 while (begin < end) { 1361 while (begin < end) {
1360 printf("%*"PRIx64":\t", ((struct DecodeState *)userdata)->width, 1362 printf("%*"NACL_PRIx64":\t", ((struct DecodeState *)userdata)->width,
1361 (uint64_t) (begin - (((struct DecodeState *)userdata)->offset))); 1363 (uint64_t) (begin - (((struct DecodeState *)userdata)->offset)));
1362 for (p = begin; p < begin + 7; ++p) { 1364 for (p = begin; p < begin + 7; ++p) {
1363 if (p >= end) { 1365 if (p >= end) {
1364 printf("\n"); 1366 printf("\n");
1365 return; 1367 return;
1366 } else { 1368 } else {
1367 printf("%02x ", *p); 1369 printf("%02x ", *p);
1368 } 1370 }
1369 } 1371 }
1370 if (p >= end) { 1372 if (p >= end) {
1371 printf("\n"); 1373 printf("\n");
1372 return; 1374 return;
1373 } 1375 }
1374 begin += 7; 1376 begin += 7;
1375 } 1377 }
1376 } 1378 }
1377 1379
1378 void ProcessError (const uint8_t *ptr, void *userdata) { 1380 void ProcessError (const uint8_t *ptr, void *userdata) {
1379 printf("rejected at %"PRIx64" (byte 0x%02"PRIx32")\n", 1381 printf("rejected at %"NACL_PRIx64" (byte 0x%02"NACL_PRIx32")\n",
1380 (uint64_t) (ptr - (((struct DecodeState *)userdata)->offset)), 1382 (uint64_t) (ptr - (((struct DecodeState *)userdata)->offset)),
1381 *ptr); 1383 *ptr);
1382 } 1384 }
1383 1385
1384 int DecodeFile(const char *filename, int repeat_count) { 1386 int DecodeFile(const char *filename, int repeat_count) {
1385 size_t data_size; 1387 size_t data_size;
1386 uint8_t *data; 1388 uint8_t *data;
1387 int count; 1389 int count;
1388 1390
1389 ReadFile(filename, &data, &data_size); 1391 ReadImage(filename, &data, &data_size);
1390 if (data[4] == 1) { 1392 if (data[4] == 1) {
1391 for (count = 0; count < repeat_count; ++count) { 1393 for (count = 0; count < repeat_count; ++count) {
1392 Elf32_Ehdr *header; 1394 Elf32_Ehdr *header;
1393 int index; 1395 int index;
1394 1396
1395 header = (Elf32_Ehdr *) data; 1397 header = (Elf32_Ehdr *) data;
1396 CheckBounds(data, data_size, header, sizeof(*header)); 1398 CheckBounds(data, data_size, header, sizeof(*header));
1397 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0); 1399 assert(memcmp(header->e_ident, ELFMAG, strlen(ELFMAG)) == 0);
1398 1400
1399 for (index = 0; index < header->e_shnum; ++index) { 1401 for (index = 0; index < header->e_shnum; ++index) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 for (index = initial_index; index < argc; ++index) { 1496 for (index = initial_index; index < argc; ++index) {
1495 const char *filename = argv[index]; 1497 const char *filename = argv[index];
1496 int rc = DecodeFile(filename, repeat_count); 1498 int rc = DecodeFile(filename, repeat_count);
1497 if (rc != 0) { 1499 if (rc != 0) {
1498 printf("file '%s' can not be fully decoded\n", filename); 1500 printf("file '%s' can not be fully decoded\n", filename);
1499 return 1; 1501 return 1;
1500 } 1502 }
1501 } 1503 }
1502 return 0; 1504 return 0;
1503 } 1505 }
OLDNEW
« no previous file with comments | « src/trusted/validator_ragel/unreviewed/decoder.h ('k') | src/trusted/validator_ragel/unreviewed/decoder-x86_32.rl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698