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_ */ |