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

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"
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698