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

Unified Diff: src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h

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.h
diff --git a/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h b/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h
deleted file mode 100644
index 5ba837e931721ca92976e59a37a2c63a14f27609..0000000000000000000000000000000000000000
--- a/src/trusted/validator/x86/ncval_seg_sfi/ncdecode.h
+++ /dev/null
@@ -1,433 +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.h - table driven decoder for Native Client.
- *
- * This header file contains type declarations and constants
- * used by the decoder input table
- */
-#ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_SEG_SFI_NCDECODE_H_
-#define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_SEG_SFI_NCDECODE_H_
-
-#include "native_client/src/shared/utils/types.h"
-#include "native_client/src/trusted/validator/ncvalidate.h"
-#include "native_client/src/trusted/validator/x86/error_reporter.h"
-#include "native_client/src/trusted/validator/x86/ncinstbuffer.h"
-#include "native_client/src/trusted/validator/x86/x86_insts.h"
-
-EXTERN_C_BEGIN
-
-struct NCDecoderInst;
-struct NCDecoderState;
-
-/* Function type for a decoder action. Returns TRUE if action
- * was applied successfully.
- */
-typedef Bool (*NCDecoderStateAction)(const struct NCDecoderInst* dinst);
-
-/* Function type for other decoder state methods. */
-typedef void (*NCDecoderStateMethod)(struct NCDecoderState* vstate);
-
-typedef enum {
- NOGROUP = 0,
- GROUP1,
- GROUP2,
- GROUP3,
- GROUP4,
- /* these comments facilitate counting */
- GROUP5,
- GROUP6,
- GROUP7,
- GROUP8,
- GROUP9,
- /* these comments facilitate counting */
- GROUP10,
- GROUP11,
- GROUP12,
- GROUP13,
- GROUP14,
- /* these comments facilitate counting */
- GROUP15,
- GROUP16,
- GROUP17,
- GROUP1A,
- GROUPP
-} NaClMRMGroups;
-/* kModRMOpcodeGroups doesn't work as a const int since it is used */
-/* as an array dimension */
-#define kNaClMRMGroupsRange 20
-
-/* Define the maximum value that can be encoded in the modrm mod field. */
-#define kModRMOpcodeGroupSize 8
-
-/* Define the maximum register value that can be encoded into the opcode
- * byte.
- */
-#define kMaxRegisterIndexInOpcode 7
-
-/* information derived from the opcode, wherever it happens to be */
-typedef enum {
- IMM_UNKNOWN = 0,
- IMM_NONE = 1,
- IMM_FIXED1 = 2,
- IMM_FIXED2 = 3,
- IMM_FIXED3 = 4,
- IMM_FIXED4 = 5,
- IMM_DATAV = 6,
- IMM_ADDRV = 7,
- IMM_GROUP3_F6 = 8,
- IMM_GROUP3_F7 = 9,
- IMM_FARPTR = 10,
- IMM_MOV_DATAV, /* Special case for 64-bits MOVs (b8 through bf). */
- /* Don't add to this enum without update kNCDecodeImmediateTypeRange */
- /* and updating the tables below which are sized using this constant */
-} NCDecodeImmediateType;
-#define kNCDecodeImmediateTypeRange 12
-
-/* 255 will force an error */
-static const uint8_t kImmTypeToSize66[kNCDecodeImmediateTypeRange] =
- { 0, 0, 1, 2, 3, 4, 2, (NACL_TARGET_SUBARCH == 64 ? 8 : 4), 0, 0, 6, 2};
-static const uint8_t kImmTypeToSize67[kNCDecodeImmediateTypeRange] =
- { 0, 0, 1, 2, 3, 4, 4, 2, 0, 0, 4, 4};
-static const uint8_t kImmTypeToSize[kNCDecodeImmediateTypeRange] =
- { 0, 0, 1, 2, 3, 4, 4, (NACL_TARGET_SUBARCH == 64 ? 8 : 4), 0, 0, 6, 4 };
-
-/* Defines how to decode operands for byte codes. */
-typedef enum {
- /* Assume the default size of the operands is 64-bits (if
- * not specified in prefix bits).
- */
- DECODE_OPS_DEFAULT_64,
- /* Assume the default size of the operands is 32-bits (if
- * not specified in prefix bits).
- */
- DECODE_OPS_DEFAULT_32,
- /* Force the size of the operands to 64 bits (prefix bits are
- * ignored).
- */
- DECODE_OPS_FORCE_64
-} DecodeOpsKind;
-
-/* Models information on an x86-32 bit instruction. */
-struct OpInfo {
- NaClInstType insttype;
- uint8_t hasmrmbyte; /* 1 if this inst has an mrm byte, else 0 */
- uint8_t immtype; /* IMM_NONE, IMM_FIXED1, etc. */
- uint8_t opinmrm; /* set to 1..8 if you must find opcode in MRM byte */
-};
-
-/* Models a node in a trie of NOP instructions. */
-typedef struct NCNopTrieNode {
- /* The matching byte for the trie node. */
- uint8_t matching_byte;
- /* The matching modeled nop, if byte matched. */
- struct OpInfo *matching_opinfo;
- /* Node to match remaining bytes. */
- struct NCNopTrieNode* success;
- /* Node to match remaining bytes. */
- struct NCNopTrieNode* fail;
-} NCNopTrieNode;
-
-/* Predefined value to communicate that the lock prefix was not
- * found in an instruction.
- */
-static const uint8_t kNoLockPrefixIndex = 0xFF;
-
-/* Models a parsed x86-32 bit instruction. */
-struct InstInfo {
- /* The bytes used to parse the x86-32 instruction (may have added
- * zero filler if the instruction straddles the memory segment).
- */
- NCInstBytes bytes;
- /* The number of prefix bytes in the instruction. */
- uint8_t prefixbytes; /* 0..4 */
- /* Number of opcode bytes in the instruction. */
- uint8_t num_opbytes;
- /* non-zero if the instruction contains an SIB byte. */
- uint8_t hassibbyte;
- /* The ModRm byte. */
- uint8_t mrm;
- /* A NCDecodeImmediateType describing the type of immediate value(s)
- * the instruction has.
- */
- uint8_t immtype;
- /* The number of bytes that define the immediate value(s). */
- uint8_t immbytes;
- /* The number of displacement bytes defined by the instruction. */
- uint8_t dispbytes;
- /* The set of prefix masks defined by the prefix bytes. */
- uint32_t prefixmask;
- /* The prefix form used to select multibyte instructions, or 0 if
- * not used. That is, if 66, f2, or f3 is used to select the instruction,
- * then this value is non-zero. For example SSE3 instructions.
- */
- uint32_t opcode_prefixmask;
- /* True if it has a rex prefix. */
- uint8_t rexprefix;
- /* Index of lock prefix (F0), or kNoLockPrefixIndex if the lock prefix
- * isn't specified.
- */
- uint8_t lock_prefix_index;
-};
-
-/* Models data collected about the parsed instruction. */
-typedef struct NCDecoderInst {
- /* The address of the instruction, relative to the begining of the code
- * segment.
- */
- NaClPcAddress inst_addr;
- /* The instruction rule used to decode the instruction. */
- const struct OpInfo* opinfo;
- /* The low level details of the instructionm, extracted during parsing. */
- struct InstInfo inst;
- /* Pointer to bytes of the parsed instruction (int inst) for easier access. */
- const NCInstBytesPtr inst_bytes;
- /* The decoder state the instruction appears in. */
- struct NCDecoderState* dstate;
- /* Corresopnding index of this instruction wrt to inst_buffer in
- * in the corresponding decoder state NCDecoderState.
- */
- size_t inst_index;
- /* The number of instructions parsed so far (including this instrruction).
- * Used to detect when one tries to get a previous instruction that doesn't
- * exist.
- */
- size_t inst_count;
- /* True if the instruction is unchanged while dynamically replacing code.
- * False if the instruction has changed or if code replacement is not being
- * performed (i.e. normal validation.)
- */
- Bool unchanged;
-} NCDecoderInst;
-
-/* Given a (decoded) instruction, return the instruction that appeared
- * n elements before it, or NULL if no such instruction exists.
- *
- * Parameters:
- * dinst - The instruction to look up relative to.
- * n - number of elements back to look.
- */
-extern NCDecoderInst *PreviousInst(const NCDecoderInst* dinst, int n);
-
-/* Models decoding instructions in a memory region.
- *
- * Note: This struct is modeling a notion of a (virtual) base class to parse
- * a window of k instructions. In this model, we consider NCDecoderState a
- * class that can be (singly) inherited by derived classes. This code
- * assumes that the "this" pointer can be cast to a derived class
- * using a C cast. This implies that derived classes should have the
- * field NCDecoderState as its first field.
- *
- * Typical use is:
- *
- * NCDecoderState dstate;
- * NCDecoder inst_buffer[BUF_SIZE]; // window of BUF_SIZE instructions.
- * NCDecoderStateConstruct(&dstate, mbase, vbase, size,
- * inst_buffer, BUF_SIZE);
- * NCDecoderStateDecode(&dstate);
- * NCDecoderStateDestruct(&dstate);
- *
- * Note: The old API for this class is further down in this file,
- * and should be considered deprecated.
- */
-typedef struct NCDecoderState {
- /* PROTECTED: */
-
- /* The instruction buffer is an array of instructions, used
- * by the decoder to define a window of decoded instructions.
- * This window automatically moves as instructions are decoded
- * so that one can always see the current decoded instruction,
- * and some (fixed) number of previously decoded instructions.
- */
- NCDecoderInst* inst_buffer;
-
- /* The number of elements in inst_buffer. Must be greater than zero. */
- size_t inst_buffer_size;
-
- /* Remaining memory to decode. It is allocated on
- * the stack to make it thread-local, and included here
- * so that all decoder states have access to it.
- */
- NCRemainingMemory memory;
-
- /* The begining of the memory segment to decode. */
- uint8_t* mbase;
-
- /* The (virtual) base address of the memory segment. */
- NaClPcAddress vbase;
-
- /* The number of bytes in the memory segment. */
- NaClMemorySize size;
-
- /* The index of the current instruction within inst_buffer. */
- size_t cur_inst_index;
-
- /* Holds the error reporting object to use. */
- NaClErrorReporter* error_reporter;
-
- /* Member function to apply actions to a decoded instruction. */
- NCDecoderStateAction action_fn;
-
- /* Member function to process new segment. */
- NCDecoderStateMethod new_segment_fn;
-
- /* Member function called to report an error with the validity of the
- * memory segment.
- */
- NCDecoderStateMethod segmentation_error_fn;
-
- /* Member function called to report other errors while processing the
- * memory segment.
- */
- NCDecoderStateMethod internal_error_fn;
-} NCDecoderState;
-
-/*
- * Construct a decoder state.
- *
- * Parameters are:
- * this - The instance to be constructed.
- * mbase - The begining of the memory segment to decode.
- * vbase - The (virtual) base address of the memory segment.
- * sz - The number of bytes in the memory segment.
- *
- * Note: Constructors of subclasses of NCDecoderState should
- * call this constructor first, to initialize the decoder state.
- */
-extern void NCDecoderStateConstruct(NCDecoderState* tthis,
- uint8_t* mbase, NaClPcAddress vbase,
- NaClMemorySize sz,
- NCDecoderInst* inst_buffer,
- size_t inst_buffer_size);
-
-/* Define an error reporter to use to report error messages.
- * Note: By default, a decoder state uses the null error reporter,
- * which doesn't report error messages.
- *
- * WARNING: Be sure the error reporter is expecting a NCDecoderInst* for
- * the print_inst method.
- */
-void NCDecoderStateSetErrorReporter(NCDecoderState* tthis,
- NaClErrorReporter* reporter);
-
-
-/* A default, null error reporter for a NCDecoderInst* instruction. */
-extern NaClErrorReporter kNCNullErrorReporter;
-
-/*
- * Decodes the memory segment associated with the decoder state.
- * Returns TRUE if able to apply action to all decoded instructions.
- *
- * Parameters are:
- * this - The decoder state.
- */
-extern Bool NCDecoderStateDecode(NCDecoderState* tthis);
-
-/*
- * Destruct a decoder state.
- *
- * Parameters are:
- * this - The decoder state.
- *
- * Note: Destructors of subclasses of NCDecoderState should
- * call this destructor last, after the subinstance has been destructed.
- */
-extern void NCDecoderStateDestruct(NCDecoderState* tthis);
-
-/* "Printable" means the value returned by this function can be used for
- * printing user-readable output, but it should not be used to influence if the
- * validation algorithm passes or fails. The validation algorithm should not
- * depend on vbase - in other words, it should not depend on where the code is
- * being mapped in memory.
- */
-static INLINE NaClPcAddress NCPrintableInstructionAddress(
- const NCDecoderInst *dinst) {
- return dinst->dstate->vbase + dinst->inst_addr;
-}
-
-struct NCDecoderStatePair;
-
-/* Models a method that does a compare/update on a pair of instructions from
- * the pairwise instruction decoder. Returns true if the action succeeded.
- */
-typedef Bool (*NCDecoderStatePairAction)(struct NCDecoderStatePair* tthis,
- struct NCDecoderInst* dinst_old,
- struct NCDecoderInst* dinst_new);
-
-/* Models decoding a pair of instruction segments, compariing/updating
- * them as appropriate. Assumes that two instruction segments are the same,
- * except for some (constant-sized) changes. At the instruction level,
- * the instruction lengths are assumed to be the same. Typically, this is
- * because the one instruction segment was an updated version of a
- * previous instruction segment.
- *
- * Typical use is:
- *
- * NCDecoderState dstate_old;
- * NCDecoderState dstate_new;
- * NCDecoderStatePair dstate_pair;
- * ... Code that constructs dstate_old and dstate_new.
- * NCDecoderStatePair Construct(&dstate_pair, &dstate_old, &dstate_new);
- * NCDecoderStatePairDecode(&dstate_pair);
- * NCDecoderStatePairDestruct(&dstate_pair);
- */
-typedef struct NCDecoderStatePair {
- /* PROTECTED: */
-
- /* The old decoder state. */
- NCDecoderState* old_dstate;
-
- /* The new decoder state. */
- NCDecoderState* new_dstate;
-
- /* The (virtual method) action to apply to each instruction. */
- NCDecoderStatePairAction action_fn;
-
- /* Utility function that copies a single instruction in memory, can be used in
- * actions.
- */
- NaClCopyInstructionFunc copy_func;
-} NCDecoderStatePair;
-
-/*
- * Construct a decoder state pair.
- *
- * Parameters are:
- * tthis - The decoder state pair to construct.
- * old_dstate - A constructed old decoder state to use.
- * new_dstate - A constructed new decoder state to use.
- *
- * Note: Constructors of subclasses of NCDecoderStatePair should
- * call this constructor first, to initialize the decoder pair fields.
- */
-extern void NCDecoderStatePairConstruct(
- NCDecoderStatePair* tthis,
- NCDecoderState* old_dstate,
- NCDecoderState* new_dstate,
- NaClCopyInstructionFunc copy_func);
-
-/*
- * Decode the memory segments in each instruction state, applying
- * the appropriate action on each instruction till either:
- * (1) The instruction lengths differ.
- * (2) The action returns false.
- * Returns true if no instruction lengths differ, and the action
- * returns true for all found instructions.
- */
-extern Bool NCDecoderStatePairDecode(NCDecoderStatePair* tthis);
-
-/*
- * Destruct a decoder state pair.
- *
- * Note: Destructors of subclasses of NCDecoderStatePair should
- * call this distructor last, after the subinstance has been destructed.
- */
-extern void NCDecoderStatePairDestruct(NCDecoderStatePair* tthis);
-
-EXTERN_C_END
-
-#endif /* NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_X86_NCVAL_SEG_SFI_NCDECODE_H_ */
« no previous file with comments | « src/trusted/validator/x86/ncval_seg_sfi/generator/ncdecode_table.c ('k') | src/trusted/validator/x86/ncval_seg_sfi/ncdecode.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698