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

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

Powered by Google App Engine
This is Rietveld 408576698