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

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

Powered by Google App Engine
This is Rietveld 408576698