| Index: src/trusted/validator_mips/model.h
|
| diff --git a/src/trusted/validator_mips/model.h b/src/trusted/validator_mips/model.h
|
| index fc709cb936b523b59bd080a9e8d0a1f7a64afd5d..12a268ccefe9ae49b0d23151d2d43549181ed12e 100644
|
| --- a/src/trusted/validator_mips/model.h
|
| +++ b/src/trusted/validator_mips/model.h
|
| @@ -30,6 +30,7 @@ namespace nacl_mips_dec {
|
| */
|
| class Register {
|
| public:
|
| + typedef uint8_t Number;
|
| explicit inline Register(uint32_t);
|
|
|
| /*
|
| @@ -39,19 +40,29 @@ class Register {
|
|
|
| inline bool Equals(const Register &) const;
|
|
|
| - private:
|
| - uint32_t _number;
|
| -};
|
| + static const Number kJumpMask = 14; // $t6 = holds mask for jr.
|
| + static const Number kLoadStoreMask = 15; // $t7 = holds mask for load/store.
|
| + static const Number kTls = 24; // $t8 = holds tls index.
|
| + static const Number kSp = 29; // Stack pointer.
|
|
|
| -const Register kRegisterNone(0);
|
| + static const Number kNone = 32;
|
|
|
| -// 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.
|
| + /*
|
| + * A special value used to indicate that a register field is not used.
|
| + * This is specially chosen to ensure that bitmask() == 0, so it can be added
|
| + * to any RegisterList with no effect.
|
| + */
|
| + static Register None() { return Register(kNone); }
|
|
|
| -const Register kRegisterZero(0);
|
| + /* Registers with special meaning in our model: */
|
| + static Register JumpMask() { return Register(kJumpMask); }
|
| + static Register LoadStoreMask() { return Register(kLoadStoreMask); }
|
| + static Register Tls() { return Register(kTls); }
|
| + static Register Sp() { return Register(kSp); }
|
| +
|
| + private:
|
| + uint32_t _number;
|
| +};
|
|
|
| /*
|
| * A collection of Registers. Used to describe the side effects of operations.
|
| @@ -92,22 +103,30 @@ class RegisterList {
|
|
|
| inline const RegisterList operator&(const RegisterList) const;
|
|
|
| + /*
|
| + * A list containing every possible register, even some we do not define.
|
| + * Used exclusively as a bogus scary return value for forbidden instructions.
|
| + */
|
| + static RegisterList Everything() { return RegisterList(-1); }
|
| +
|
| + /* A list of registers that can not be modified by untrusted code. */
|
| + static RegisterList ReservedRegs() {
|
| + return RegisterList(((1 << Register::kJumpMask) |
|
| + (1 << Register::kLoadStoreMask) |
|
| + (1 << Register::kTls)));
|
| + }
|
| +
|
| + /* A list of registers that can be used for addressing memory locations. */
|
| + static RegisterList DataAddrRegs() {
|
| + return RegisterList(((1 << Register::kSp) |
|
| + (1 << Register::kTls)));
|
| + }
|
| +
|
| 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:
|
|
|