| Index: src/trusted/validator_mips/model.h
|
| diff --git a/src/trusted/validator_mips/model.h b/src/trusted/validator_mips/model.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2d0ab249b37d32155e2ea7b638d6fff31e98f324
|
| --- /dev/null
|
| +++ b/src/trusted/validator_mips/model.h
|
| @@ -0,0 +1,161 @@
|
| +/*
|
| + * Copyright 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.
|
| + * Copyright 2012, Google Inc.
|
| + */
|
| +
|
| +#ifndef NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
|
| +#define NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
|
| +
|
| +/*
|
| + * Models instructions and decode results.
|
| + *
|
| + * TODO(petarj): This file and the classes have been based on the same named
|
| + * module within validator_arm folder. The code has been reduced and changed
|
| + * slightly to accommodate some style issues. There still may be room for
|
| + * improvement as we have not investigated performance impact of this classes.
|
| + * Thus, this should be done later and the code should be revisited.
|
| + */
|
| +
|
| +#include <stdint.h>
|
| +
|
| +namespace nacl_mips_dec {
|
| +
|
| +/*
|
| + * A value class that names a single register. We could use a typedef for this,
|
| + * but it introduces some ambiguity problems because of the implicit conversion
|
| + * to/from int.
|
| + *
|
| + * May be implicitly converted to a single-entry RegisterList (see below).
|
| + */
|
| +class Register {
|
| + public:
|
| + explicit inline Register(uint32_t);
|
| +
|
| + /*
|
| + * Produces the bitmask used to represent this register.
|
| + */
|
| + inline uint32_t Bitmask() const;
|
| +
|
| + inline bool Equals(const Register &) const;
|
| +
|
| + private:
|
| + uint32_t _number;
|
| +};
|
| +
|
| +const Register kRegisterNone(0);
|
| +
|
| +// Registers with special meaning in our model:
|
| +const Register kRegisterStack(29);
|
| +const Register kRegisterJumpMask(14); // $t6 = holds mask for jr.
|
| +const Register kRegisterLoadStoreMask(15); // $t7 = holds mask for load/store.
|
| +const Register kRegisterTls(24); // $t8 = holds tls index.
|
| +
|
| +const Register kRegisterZero(0);
|
| +
|
| +/*
|
| + * A collection of Registers. Used to describe the side effects of operations.
|
| + *
|
| + * Note that this is technically a set, not a list -- but RegisterSet is a
|
| + * well-known term that means something else.
|
| + */
|
| +class RegisterList {
|
| + public:
|
| + /*
|
| + * Produces a RegisterList that contains the registers specified in the
|
| + * given bitmask. To indicate rN, the bitmask must include (1 << N).
|
| + */
|
| + explicit inline RegisterList(uint32_t bitmask);
|
| +
|
| + /*
|
| + * Produces a RegisterList containing a single register.
|
| + *
|
| + * Note that this is an implicit constructor. This is okay in this case
|
| + * because
|
| + * - It converts between two types that we control,
|
| + * - It converts at most one step (no implicit conversions to Register),
|
| + * - It inlines to a single machine instruction,
|
| + * - The readability gain in inst_classes.cc is large.
|
| + */
|
| + inline RegisterList(const Register r);
|
| +
|
| + /*
|
| + * Checks whether this list contains the given register.
|
| + */
|
| + inline bool operator[](const Register) const;
|
| +
|
| + // Checks whether this list contains all the registers in the operand.
|
| + inline bool ContainsAll(RegisterList) const;
|
| +
|
| + // Checks whether this list contains any of the registers in the operand.
|
| + inline bool ContainsAny(RegisterList) const;
|
| +
|
| + inline const RegisterList operator&(const RegisterList) const;
|
| +
|
| + private:
|
| + uint32_t _bits;
|
| +};
|
| +
|
| +/*
|
| + * A list containing every possible register, even some we don't define.
|
| + * Used exclusively as a bogus scary return value for forbidden instructions.
|
| + */
|
| +static const RegisterList kRegisterListEverything = RegisterList(-1);
|
| +
|
| +static uint32_t const kReservedRegsBitmask = kRegisterTls.Bitmask()
|
| + + kRegisterJumpMask.Bitmask()
|
| + + kRegisterLoadStoreMask.Bitmask();
|
| +static RegisterList const kRegListReserved = RegisterList(kReservedRegsBitmask);
|
| +
|
| +/*
|
| + * A 32-bit Mips instruction of unspecified type.
|
| + *
|
| + * This class is designed for efficiency:
|
| + * - Its public methods for bitfield extraction are short and inline.
|
| + * - It has no vtable, so on 32-bit platforms it's exactly the size of the
|
| + * instruction it models.
|
| + */
|
| +class Instruction {
|
| + public:
|
| + explicit inline Instruction(uint32_t bits);
|
| +
|
| + /*
|
| + * Extracts a range of contiguous bits, right-justifies it, and returns it.
|
| + * Note that the range follows hardware convention, with the high bit first.
|
| + */
|
| + inline uint32_t Bits(int hi, int lo) const;
|
| +
|
| + /*
|
| + * A convenience method that's exactly equivalent to
|
| + * Register(instruction.bits(hi, lo))
|
| + *
|
| + * This sequence is quite common in inst_classes.cc.
|
| + */
|
| + inline const Register Reg(int hi, int lo) const;
|
| +
|
| + /*
|
| + * Extracts a single bit (0 - 31).
|
| + */
|
| + inline bool Bit(int index) const;
|
| +
|
| + /*
|
| + * Returns an integer equivalent of this instruction, masked by the given
|
| + * mask. Used during decoding to test bitfields.
|
| + */
|
| + inline uint32_t operator&(uint32_t) const;
|
| +
|
| + private:
|
| + uint32_t _bits;
|
| +};
|
| +
|
| +uint32_t const kInstrSize = 4;
|
| +uint32_t const kInstrAlign = 0xFFFFFFFC;
|
| +uint32_t const kBundleAlign = 0xFFFFFFF0;
|
| +
|
| +} // namespace
|
| +
|
| +// Definitions for our inlined functions.
|
| +#include "native_client/src/trusted/validator_mips/model-inl.h"
|
| +
|
| +#endif // NATIVE_CLIENT_SRC_TRUSTED_VALIDATOR_MIPS_MODEL_H
|
|
|