Chromium Code Reviews| 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" | 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |