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