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

Unified Diff: src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.c

Issue 625923004: Delete old x86 validator. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client
Patch Set: rebase master Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.c
diff --git a/src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.c b/src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.c
deleted file mode 100644
index 0aa8c1b51dd138a2480943dcce9d50390b985a36..0000000000000000000000000000000000000000
--- a/src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.c
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright (c) 2012 The Native Client Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
- * ncdecode_verbose.c - Print routines for validator that are
- * not to be loaded into sel_ldr.
- */
-
-#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "native_client/src/shared/gio/gio.h"
-#include "native_client/src/shared/platform/nacl_log.h"
-#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h"
-
-#include "native_client/src/trusted/validator/x86/x86_insts_inl.c"
-
-#if NACL_TARGET_SUBARCH == 64
-#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/gen/ncdisasmtab_64.h"
-#else
-#include "native_client/src/trusted/validator/x86/ncval_seg_sfi/gen/ncdisasmtab_32.h"
-#endif
-
-/* To turn on debugging of instruction decoding, change value of
- * DEBUGGING to 1.
- */
-#define DEBUGGING 0
-
-#include "native_client/src/shared/utils/debugging.h"
-
-/* The following are conditionally added since they only have meaning
- * if we are processing 64-bit instructions.
- */
-#if NACL_TARGET_SUBARCH == 64
-
-/* Returns true if REX.W is defined in the REX prefix byte. */
-static INLINE uint8_t GetRexPrefixW(const NCDecoderInst* dinst) {
- /* Note: the field rexprefix is non-zero only if a rexprefix was found. */
- return 0 != NaClRexW(dinst->inst.rexprefix);
-}
-
-/* Returns true if REX.R is defined in the REX prefix byte. */
-static INLINE uint8_t GetRexPrefixR(const NCDecoderInst* dinst) {
- /* Note: the field rexprefix is non-zero only if a rexprefix was found. */
- return 0 != NaClRexR(dinst->inst.rexprefix);
-}
-
-#endif
-
-/* Returns the index into the general purpose registers based on the
- * value in the modrm.rm field of the instruction (taking into account
- * the REX prefix if it appears).
- */
-static INLINE uint32_t state_modrm_reg(const NCDecoderInst* dinst) {
- /* TODO(karl) This is no where near close to being correct. Currently,
- * It only models r/m64 entry for instructions in the Intel documentation,
- * which requires the W bit to be set (r/m32 entries do not use REX.w,
- * and a different set of registers).
- */
- uint32_t index = modrm_regInline(dinst->inst.mrm);
-#if NACL_TARGET_SUBARCH == 64
- if (GetRexPrefixW(dinst) && GetRexPrefixR(dinst)) {
- index += 8;
- }
-#endif
- return index;
-}
-
-/* Returns the index for the first instruction opcode byte. */
-static INLINE int NCOpcodeOffset(const NCDecoderInst* dinst) {
- return dinst->inst.prefixbytes;
-}
-
-/* Returns the index for the modrm byte. */
-static INLINE int NCMrmOffset(const NCDecoderInst* dinst) {
- return NCOpcodeOffset(dinst) + dinst->inst.num_opbytes;
-}
-
-/* Returns the index of the sib byte (if it has one). */
-static INLINE int NCSibOffset(const NCDecoderInst* dinst) {
- /* Note: The sib byte follows the mrm byte. */
- return NCMrmOffset(dinst) + 1;
-}
-
-/* Returns the beginning index for the displacement (if it has one). */
-static int NCDispOffset(const NCDecoderInst* dinst) {
- if (dinst->opinfo->hasmrmbyte) {
- if (dinst->inst.hassibbyte) {
- return NCSibOffset(dinst) + 1;
- } else {
- return NCMrmOffset(dinst) + 1;
- }
- } else {
- return NCOpcodeOffset(dinst) + dinst->inst.num_opbytes;
- }
-}
-
-/* Returns the beginning index for the immediate value. */
-static INLINE int NCImmedOffset(const NCDecoderInst* dinst) {
- return NCDispOffset(dinst) + dinst->inst.dispbytes;
-}
-
-/* later this will make decoding x87 instructions a bit more concise. */
-static const char** kDisasmX87Op[8] = {kDisasm87D8,
- kDisasm87D9,
- kDisasm87DA,
- kDisasm87DB,
- kDisasm87DC,
- kDisasm87DD,
- kDisasm87DE,
- kDisasm87DF};
-
-const char** kDummyUsesToAvoidCompilerWarning[] = {kDisasm660F38Op,
- kDisasmF20F38Op,
- kDisasm660F3AOp};
-
-/* disassembler stuff */
-static const char* DisFmt(const NCDecoderInst *dinst) {
- NCInstBytesPtr opbyte;
- uint8_t opbyte0;
- uint8_t opbyte1;
- uint8_t pm = dinst->inst.opcode_prefixmask;
- NCInstBytesPtrInitInc(&opbyte, &dinst->inst_bytes, NCOpcodeOffset(dinst));
- opbyte0 = NCInstBytesByte(&opbyte, 0);
-
- if (dinst->opinfo->insttype == NACLi_X87 ||
- dinst->opinfo->insttype == NACLi_X87_FSINCOS) {
- if (opbyte0 != kWAITOp) {
- return kDisasmX87Op[opbyte0 - kFirstX87Opcode][dinst->inst.mrm];
- }
- }
- if (dinst->opinfo->insttype == NACLi_FCMOV) {
- return kDisasmX87Op[opbyte0 - kFirstX87Opcode][dinst->inst.mrm];
- }
- if (dinst->opinfo->insttype == NACLi_NOP) return "nop";
- if (opbyte0 != kTwoByteOpcodeByte1) return kDisasm1ByteOp[opbyte0];
- opbyte1 = NCInstBytesByte(&opbyte, 1);
- if (opbyte1 == 0x0f) {
- return kDisasm0F0FOp[
- NCInstBytesByte(&opbyte, dinst->inst.bytes.length - 1)];
- }
- if (opbyte1 == 0x38) {
- return kDisasm0F38Op[NCInstBytesByte(&opbyte, 2)];
- }
- if (opbyte1 == 0x3A) {
- return kDisasm0F3AOp[NCInstBytesByte(&opbyte, 2)];
- }
- if (! (pm & (kPrefixDATA16 | kPrefixREPNE | kPrefixREP))) {
- return kDisasm0FXXOp[opbyte1];
- }
- if (pm & kPrefixDATA16) return kDisasm660FXXOp[opbyte1];
- if (pm & kPrefixREPNE) return kDisasmF20FXXOp[opbyte1];
- if (pm & kPrefixREP) return kDisasmF30FXXOp[opbyte1];
-
- /* no update; should be invalid */
- return "internal error";
-}
-
-/* Returns the (sign extended) 32-bit integer immediate value. */
-static int32_t ImmedValue32(const NCDecoderInst* dinst) {
- NCInstBytesPtr addr;
- NCInstBytesPtrInitInc(&addr, &dinst->inst_bytes,
- NCImmedOffset(dinst));
- return NCInstBytesInt32(&addr, dinst->inst.immbytes);
-}
-
-/* Returns the (sign extended) 64-bit integer immediate value. */
-static int64_t ImmedValue64(const NCDecoderInst* dinst) {
- NCInstBytesPtr addr;
- NCInstBytesPtrInitInc(&addr, &dinst->inst_bytes,
- NCImmedOffset(dinst));
- return NCInstBytesInt64(&addr, dinst->inst.immbytes);
-}
-
-/* Returns the (sign extended) 32-bit integer displacement value. */
-static int32_t DispValue32(const NCDecoderInst* dinst) {
- NCInstBytesPtr addr;
- NCInstBytesPtrInitInc(&addr, &dinst->inst_bytes,
- NCDispOffset(dinst));
- return NCInstBytesInt32(&addr, dinst->inst.dispbytes);
-}
-
-/* Defines the set of available general purpose registers. */
-static const char* gp_regs[] = {
-#if NACL_TARGET_SUBARCH == 64
- /* TODO(karl) - Depending on whether the instruction uses r/m32
- * of r/m64 forms (according to the Intel document), the list of
- * (16) registers is different. Currently, we are only handling
- * the r/m64 case.
- */
- "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
- "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
-#else
- "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi"
-#endif
-};
-
-
-static const char* mmx_regs[] = {
- "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7"
-};
-
-static const char* xmm_regs[] = {
- "%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4", "%xmm5", "%xmm6", "%xmm7"
-};
-
-static const char* seg_regs[] = {
- "%es", "%cs", "%ss", "%ds", "%fs", "%gs"
-};
-
-/* Print out the sib byte of the parsed instruction in the given decoder state
- * to the given file.
- */
-static void SibPrint(const NCDecoderInst* dinst, struct Gio* fp) {
- uint8_t sib = NCInstBytesByte(&dinst->inst_bytes, NCSibOffset(dinst));
-
- if (!dinst->inst.hassibbyte) {
- /* This should not happen. */
- gprintf(fp, "?");
- } else if (sib_ss(sib) == 0) {
- if (sib_base(sib) == 5) {
- /* This code is JUST WRONG!. However, I am not fixing since
- * the decoder printer is broken in so many other ways!. See tables
- * 2-1 and 2-2 of "Intel 64 and IA-32 Architectures Software Developer's
- * Manual" for details of what should be done (there are
- * 3 cases, depending on the value of the mod field of the modrm
- * byte).
- * Note: While the changes here are not correct, they at least make
- * sure that we process bytes that are actually in the instruction.
- * That is, the code doesn't accidentally walk off the end of the
- * parsed instruction.
- */
- gprintf(fp, "[0x%x]", DispValue32(dinst));
- } else {
- /* Has a base register */
- if (sib_index(sib) == 4) {
- /* No index */
- gprintf(fp, "[%s]", gp_regs[sib_base(sib)]);
- } else {
- gprintf(fp, "[%s + %s]",
- gp_regs[sib_base(sib)],
- gp_regs[sib_index(sib)]);
- }
- }
- } else {
- if (sib_index(sib) == 4) {
- /* No index */
- gprintf(fp, "[%s]", gp_regs[sib_base(sib)]);
- } else {
- gprintf(fp, "[%s + %d * %s]",
- gp_regs[sib_base(sib)],
- 1 << sib_ss(sib),
- gp_regs[sib_index(sib)]);
- }
- }
-}
-
-static void SegPrefixPrint(const NCDecoderInst *dinst, struct Gio* fp) {
- uint8_t pm = dinst->inst.prefixmask;
- if (pm & kPrefixSEGCS) {
- gprintf(fp, "cs:");
- } else if (pm & kPrefixSEGSS) {
- gprintf(fp, "ss:");
- } else if (pm & kPrefixSEGFS) {
- gprintf(fp, "fs:");
- } else if (pm & kPrefixSEGGS) {
- gprintf(fp, "gs:");
- }
-}
-
-/* Append that we don't bother to translate the instruction argument,
- * since it is NaCl illegal. Used to handle cases where we don't implement
- * 16-bit modrm effective addresses.
- */
-static INLINE void NaClIllegalOp(struct Gio* fp) {
- gprintf(fp, "*NaClIllegal*");
-}
-
-/* Print out the register (from the list of register names),
- * that is referenced by the decoded instruction in the
- * decoder state. If is_gp_regs is true, the register names
- * correspond to general purpose register names. Otherwise,
- * they are some other set, such as MMX or XMM.
- */
-static void RegMemPrint(const NCDecoderInst *dinst,
- const char* reg_names[],
- const uint8_t is_gp_regs,
- struct Gio* fp) {
- DEBUG( printf(
- "reg mem print: sib_offset = %d, "
- "disp_offset = %d, mrm.mod = %02x\n",
- NCSibOffset(dinst), (int) NCDispOffset(dinst),
- modrm_modInline(dinst->inst.mrm)) );
- switch (modrm_modInline(dinst->inst.mrm)) {
- case 0:
- SegPrefixPrint(dinst, fp);
- if (NaClHasBit(dinst->inst.prefixmask, kPrefixADDR16)) {
- NaClIllegalOp(fp);
- } else {
- if (4 == modrm_rmInline(dinst->inst.mrm)) {
- SibPrint(dinst, fp);
- } else if (5 == modrm_rmInline(dinst->inst.mrm)) {
- gprintf(fp, "[0x%x]", DispValue32(dinst));
- } else {
- gprintf(fp, "[%s]", gp_regs[modrm_rmInline(dinst->inst.mrm)]);
- }
- }
- break;
- case 1:
- SegPrefixPrint(dinst, fp);
- if (NaClHasBit(dinst->inst.prefixmask, kPrefixADDR16)) {
- NaClIllegalOp(fp);
- } else {
- gprintf(fp, "0x%x", DispValue32(dinst));
- if (4 == modrm_rmInline(dinst->inst.mrm)) {
- SibPrint(dinst, fp);
- } else {
- gprintf(fp, "[%s]", gp_regs[modrm_rmInline(dinst->inst.mrm)]);
- }
- }
- break;
- case 2:
- SegPrefixPrint(dinst, fp);
- if (NaClHasBit(dinst->inst.prefixmask, kPrefixADDR16)) {
- NaClIllegalOp(fp);
- } else {
- gprintf(fp, "0x%x", DispValue32(dinst));
- if (4 == modrm_rmInline(dinst->inst.mrm)) {
- SibPrint(dinst, fp);
- } else {
- gprintf(fp, "[%s]", gp_regs[modrm_rmInline(dinst->inst.mrm)]);
- }
- }
- break;
- case 3:
- if (is_gp_regs) {
- gprintf(fp, "%s", reg_names[state_modrm_reg(dinst)]);
- } else {
- gprintf(fp, "%s", reg_names[modrm_rmInline(dinst->inst.mrm)]);
- }
- break;
- }
-}
-
-/* Parses the group name in token. Returns NOGROUP(0) if unable to parse. */
-static NaClMRMGroups ParseGroupName(const char* token) {
- if (!strncmp(token, "group", 5)) {
- /* Matched group name prefix, recognize last two characters explicitly.*/
- const char* suffix = token + 5;
- switch (strlen(suffix)) {
- case 1:
- switch (suffix[0]) {
- case '1':
- return GROUP1;
- case '2':
- return GROUP2;
- case '3':
- return GROUP3;
- case '4':
- return GROUP4;
- case '5':
- return GROUP5;
- case '6':
- return GROUP6;
- case '7':
- return GROUP7;
- case '8':
- return GROUP8;
- case '9':
- return GROUP9;
- case 'p':
- return GROUPP;
- default:
- break;
- }
- break;
- case 2:
- if (suffix[0] == '1') {
- switch(suffix[1]) {
- case '0':
- return GROUP10;
- case '1':
- return GROUP11;
- case '2':
- return GROUP12;
- case '3':
- return GROUP13;
- case '4':
- return GROUP14;
- case '5':
- return GROUP15;
- case '6':
- return GROUP16;
- case '7':
- return GROUP17;
- case 'a':
- return GROUP1A;
- default:
- break;
- }
- }
- break;
- default:
- break;
- }
- }
- return 0;
-}
-
-static void InstFormat(const char* format,
- const NCDecoderInst *dinst,
- struct Gio* fp) {
- char token_buf[128];
- char* fmt = token_buf;
- int pos = 0;
-
- strncpy(token_buf, format, sizeof(token_buf));
-
- while (1) {
- char* token = strtok(fmt, " ,\n");
- DEBUG( printf("\ntoken = '%s'\n", token) );
- if (NULL == token) {
- break;
- }
- if (pos > 1) {
- gprintf(fp, ", ");
- } else if (pos > 0) {
- gprintf(fp, " ");
- }
- if ('$' == token[0]) {
- NaClMRMGroups group = ParseGroupName(token+1);
- if (NOGROUP != group) {
- int mrm = modrm_regInline(dinst->inst.mrm);
- const char* opname = kDisasmModRMOp[group][mrm];
- DEBUG( printf("case: group %d, opname = %s\n", group, opname) );
- gprintf(fp, "%s", opname);
- } else {
- /* Tokens starting with a $ but not $group need formatting */
- DEBUG( printf("case: $ and not group\n") );
- switch (token[1]) {
- case 'A':
- gprintf(fp, "$A");
- break;
- case 'C':
- gprintf(fp, "%%cr%d", modrm_regInline(dinst->inst.mrm));
- break;
- case 'D':
- gprintf(fp, "%%dr%d", modrm_regInline(dinst->inst.mrm));
- break;
- case 'E':
- case 'M': /* mod should never be 3 for 'M' */
- /* TODO(sehr): byte and word accesses */
- RegMemPrint(dinst, gp_regs, 1, fp);
- break;
- case 'F':
- gprintf(fp, "eflags");
- break;
- case 'G':
- gprintf(fp, "%s", gp_regs[modrm_regInline(dinst->inst.mrm)]);
- break;
- case 'I':
- gprintf(fp, "0x%"NACL_PRIx64, ImmedValue64(dinst));
- break;
- case 'J':
- gprintf(fp, "0x%"NACL_PRIxNaClPcAddress,
- NCPrintableInstructionAddress(dinst)
- + dinst->inst.bytes.length
- + ImmedValue32(dinst));
- break;
- case 'O':
- gprintf(fp, "[0x%"NACL_PRIx64"]", ImmedValue64(dinst));
- break;
- case 'P':
- if ('R' == token[2]) {
- gprintf(fp, "%%mm%d", modrm_rmInline(dinst->inst.mrm));
- } else {
- gprintf(fp, "%%mm%d", modrm_regInline(dinst->inst.mrm));
- }
- break;
- case 'Q':
- RegMemPrint(dinst, mmx_regs, 0, fp);
- break;
- case 'R':
- gprintf(fp, "%s", gp_regs[modrm_rmInline(dinst->inst.mrm)]);
- break;
- case 'S':
- gprintf(fp, "%s", seg_regs[modrm_regInline(dinst->inst.mrm)]);
- break;
- case 'V':
- if ('R' == token[2]) {
- gprintf(fp, "%%xmm%d", modrm_rmInline(dinst->inst.mrm));
- } else {
- gprintf(fp, "%%xmm%d", modrm_regInline(dinst->inst.mrm));
- }
- break;
- case 'W':
- RegMemPrint(dinst, xmm_regs, 0, fp);
- break;
- case 'X':
- gprintf(fp, "ds:[esi]");
- break;
- case 'Y':
- gprintf(fp, "es:[edi]");
- break;
- default:
- gprintf(fp, "token('%s')", token);
- break;
- }
- }
- } else {
- /* Print the token as is */
- gprintf(fp, "%s", token);
- }
- fmt = NULL;
- ++pos;
- }
-}
-
-static void NCPrintInstTextUsingFormat(const char* format,
- const NCDecoderInst *dinst,
- struct Gio* fp) {
- InstFormat(format, dinst, fp);
- gprintf(fp, "\n");
-}
-
-void NCPrintInstWithoutHex(const NCDecoderInst *dinst, struct Gio* fp) {
- DEBUG( printf("use format: %s\n", DisFmt(dinst)) );
- NCPrintInstTextUsingFormat(DisFmt(dinst), dinst, fp);
-}
-
-void NCPrintInstWithHex(const NCDecoderInst *dinst, struct Gio *fp) {
- int i;
- DEBUG( printf("use format: %s\n", DisFmt(dinst)) );
- gprintf(fp, " %"NACL_PRIxNaClPcAddress":\t%02x",
- NCPrintableInstructionAddress(dinst),
- NCInstBytesByte(&dinst->inst_bytes, 0));
- for (i = 1; i < dinst->inst.bytes.length; i++) {
- gprintf(fp, " %02x", NCInstBytesByte(&dinst->inst_bytes, i));
- }
- for (i = dinst->inst.bytes.length; i < 7; i++) gprintf(fp, " ");
- gprintf(fp, "\t");
- NCPrintInstWithoutHex(dinst, fp);
-}
-
-static Bool PrintInstLogGio(const NCDecoderInst *dinst) {
- NCPrintInstWithHex(dinst, NaClLogGetGio());
- return TRUE;
-}
-
-/* Defines a buffer size big enough to hold an instruction. */
-#define MAX_INST_TEXT_SIZE 256
-
-/* Defines an instruction print function. */
-typedef void (*inst_print_fn)(const struct NCDecoderInst* inst,
- struct Gio *file);
-
-/* Print out the given instruction, using the given instruction print function,
- * and return the printed text as a (malloc allocated) string.
- */
-static char* InstToStringConvert(const NCDecoderInst* dinst,
- inst_print_fn print_fn) {
- /* Print to a memory buffer, and then duplicate. */
- struct GioMemoryFile filemem;
- struct Gio *file = (struct Gio*) &filemem;
- char buffer[MAX_INST_TEXT_SIZE];
- char* result;
-
- /* Note: Be sure to leave an extra byte to add the null character to
- * the end of the string.
- */
- GioMemoryFileCtor(&filemem, buffer, MAX_INST_TEXT_SIZE - 1);
- print_fn(dinst, file);
- buffer[filemem.curpos < MAX_INST_TEXT_SIZE
- ? filemem.curpos : MAX_INST_TEXT_SIZE] ='\0';
- result = strdup(buffer);
- GioMemoryFileDtor(file);
- return result;
-}
-
-char* NCInstWithHexToString(const NCDecoderInst* dinst) {
- return InstToStringConvert(dinst, NCPrintInstWithHex);
-}
-
-char* NCInstWithoutHexToString(const NCDecoderInst* dinst) {
- return InstToStringConvert(dinst, NCPrintInstWithoutHex);
-}
-
-void NCDecodeSegment(uint8_t* mbase, NaClPcAddress vbase,
- NaClMemorySize size) {
- NCDecoderInst inst;
- NCDecoderState dstate;
- NCDecoderStateConstruct(&dstate, mbase, vbase, size, &inst, 1);
- NCDecoderStateSetErrorReporter(&dstate, &kNCVerboseErrorReporter);
- /* TODO(karl): Fix this so that we don't need to override the
- * action function.
- */
- dstate.action_fn = PrintInstLogGio;
- NCDecoderStateDecode(&dstate);
- NCDecoderStateDestruct(&dstate);
-}
-
-static void NCVerboseErrorPrintInst(NaClErrorReporter* self,
- NCDecoderInst* dinst) {
- PrintInstLogGio(dinst);
-}
-
-NaClErrorReporter kNCVerboseErrorReporter = {
- NCDecoderInstErrorReporter,
- NaClVerboseErrorPrintf,
- NaClVerboseErrorPrintfV,
- (NaClPrintInst) NCVerboseErrorPrintInst
-};
« no previous file with comments | « src/trusted/validator/x86/ncval_seg_sfi/ncdecode_verbose.h ('k') | src/trusted/validator/x86/ncval_seg_sfi/ncvalidate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698