| Index: src/trusted/validator/x86/decoder/generator/zero_extends.c
|
| diff --git a/src/trusted/validator/x86/decoder/generator/zero_extends.c b/src/trusted/validator/x86/decoder/generator/zero_extends.c
|
| deleted file mode 100644
|
| index de28edf042959602ee53876eaf7f886031dc6282..0000000000000000000000000000000000000000
|
| --- a/src/trusted/validator/x86/decoder/generator/zero_extends.c
|
| +++ /dev/null
|
| @@ -1,149 +0,0 @@
|
| -/*
|
| - * Copyright (c) 2011 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.
|
| - */
|
| -
|
| -/*
|
| - * Captures instructions that zero extend 32 bit values.
|
| - *
|
| - * Extracted from table B-1 in AMD document 25494 - AMD64 Architecture
|
| - * Programmer's Manual, Volume 3: General-Purpose and System Instructions.
|
| - *
|
| - * Note: This is used by the x86-64 validator to decide what operations can
|
| - * be used to mask control/memory accesses. Therefore, not all instructions
|
| - * listed in table B-1 (above) are defined to zero-extend. In particular,
|
| - * this is a NaCl-specific flag that is used to whitelist instructions
|
| - * that can be used to zero-extend (mask) 32-bit addresses. As such, although
|
| - * some instruction can zero-extend, we don't necessarily allow them here.
|
| - */
|
| -
|
| -#ifndef NACL_TRUSTED_BUT_NOT_TCB
|
| -#error("This file is not meant for use in the TCB")
|
| -#endif
|
| -
|
| -#include "native_client/src/trusted/validator/x86/decoder/generator/zero_extends.h"
|
| -
|
| -#include "native_client/src/include/nacl_macros.h"
|
| -#include "native_client/src/trusted/validator/x86/decoder/generator/ncdecode_forms.h"
|
| -#include "native_client/src/trusted/validator/x86/decoder/generator/ncdecode_tablegen.h"
|
| -
|
| -/* List of instruction mnemonics that zero extend 32 bit results. */
|
| -static const NaClMnemonic kZeroExtend32Op[] = {
|
| - /* Note: The following instructions are listed in table B-1 (above), but are
|
| - * not included for the following reasons:
|
| - *
|
| - * Bsf and Bsr instructions are not included because they conditionally
|
| - * write the destination. See
|
| - * http://code.google.com/p/nativeclient/issues/detail?id=2010
|
| - *
|
| - * Cmovcc instructions (0f40 through 0f4f) are not included out of caution.
|
| - * Table B-1 (above) states that these instrucitons always zero extends 32 bit
|
| - * register results to 64 bits, and that this occurs even if the condition
|
| - * is false. However, we decided to be safe and omit these instructions
|
| - * anyway.
|
| - *
|
| - * Cmpxchg is not included because it conditionally writes to
|
| - * different destinations.
|
| - *
|
| - * Bswap is not included because we don't really think that
|
| - * swapping the bottom bytes is a good thing to do to mask a memory
|
| - * reference.
|
| - *
|
| - * Bt, Btc, Btr, Bts, Rcl, Rcr, Rol, Rol, Sar, Shl, Shld, Shr, and
|
| - * Shrd instructions are not included out of caution. We assume that
|
| - * these instructions are used for bit manipulation rather than
|
| - * computing viable addresses.
|
| - *
|
| - * Adc and Sbb are not included since borrows/carries should not be
|
| - * need when calculating an address.
|
| - *
|
| - * Cpuid, In, and Lar instructions are not included just because they
|
| - * shouldn't be.
|
| - *
|
| - * Div, Idiv, and Mul instructions are not included because we never
|
| - * allowed them.
|
| - *
|
| - * Lfs, Lgs, Lss, and Lsl instructions are not included because segment
|
| - * addresses shouldn't be used.
|
| - *
|
| - * Lzcnt is not included because it is unlikely to be useful for
|
| - * computing an address based on the number of leading zeros of a value.
|
| - *
|
| - * Pextrb is not included because you shouldn't use MMX registers
|
| - * to hold addresses.
|
| - *
|
| - * Popcnt is not included because it is unlikely to be useful for computing
|
| - * an address based on the number of ones in a value.
|
| - *
|
| - * Rdmsr is not included, because you shouldn't be reading model specific
|
| - * registers.
|
| - *
|
| - * Rdpmc is not included because you shouldn't be basing addresses on
|
| - * the performance-monitor counter.
|
| - *
|
| - * Rdtsc and Rdtscp are not included because you shouldn't be basing
|
| - * addresses on the time-stamp counter or the processor id.
|
| - *
|
| - * Smsw is not included since you shouldn't be basing addresses on the
|
| - * machine status word.
|
| - */
|
| - InstAdd, /* 01, 03, 05, 81/0, 83/0 */
|
| - InstAnd, /* 21, 23, 25, 81/4, 83/4 */
|
| - InstImul, /* f7/5 , 0f af , 69 , 6b */
|
| - InstLea, /* 8D */
|
| - InstMov, /* 89, 8b, c7, b8 through bf, a1 (moffset),
|
| - a3 (moffset)
|
| - */
|
| - InstMovd, /* 0f 6e, 0f 7e */
|
| - InstMovsx, /* 0f be, 0f bf */
|
| - InstMovsxd, /* 63 */
|
| - InstMovzx, /* 0f b6, 0f b7 */
|
| - InstNeg, /* f7/3 */
|
| - InstNot, /* f7/2 */
|
| - InstOr, /* 09, 0b, 0d, 81/1, 83/1 */
|
| - InstSub, /* 29, 2b, 2d, 81/5, 83/5 */
|
| - InstXadd, /* 0f c1 */
|
| - InstXchg, /* 87, 90 through 97 */
|
| - InstXor, /* 31, 33, 35, 81/6, 83/6 */
|
| -};
|
| -
|
| -/* List of instruction nmemonics, for specific opcode sequences, that zero
|
| - * extend 32 bit results.
|
| - */
|
| -static const NaClNameOpcodeSeq kZeroExtend32Opseq[] = {
|
| - { InstDec , { 0xFF , SL(1) , END_OPCODE_SEQ } },
|
| - { InstInc , { 0xFF , SL(0) , END_OPCODE_SEQ } },
|
| -};
|
| -
|
| -/* Add OperandZeroExtends_v to instruction, if it can hold
|
| - * a 32 bit operand.
|
| - */
|
| -static void AddZeroExtendToOpDestArgs(NaClModeledInst* inst) {
|
| - if (inst->flags & NACL_IFLAG(OperandSize_v)) {
|
| - int i;
|
| - for (i = 0; i < inst->num_operands; ++i) {
|
| - /* Note: we currently don't allow zero extends for
|
| - * implicit arguments. This is done just to be extra
|
| - * cautious on what we allow to be masks in the
|
| - * NaCl x64-64 validator.
|
| - */
|
| - if ((inst->operands[i].flags & NACL_OPFLAG(OpSet)) &&
|
| - (NACL_EMPTY_OPFLAGS ==
|
| - (inst->operands[i].flags & NACL_OPFLAG(OpImplicit)))) {
|
| - NaClAddOpFlags(i, NACL_OPFLAG(OperandZeroExtends_v));
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -/* Add OperandZeroExtends_v instruction flag if applicable. */
|
| -void NaClAddZeroExtend32FlagIfApplicable(void) {
|
| - if ((X86_64 == NACL_FLAGS_run_mode) &&
|
| - NaClInInstructionSet(kZeroExtend32Op,
|
| - NACL_ARRAY_SIZE(kZeroExtend32Op),
|
| - kZeroExtend32Opseq,
|
| - NACL_ARRAY_SIZE(kZeroExtend32Opseq))) {
|
| - AddZeroExtendToOpDestArgs(NaClGetDefInst());
|
| - }
|
| -}
|
|
|