From cd3fee1b81ad3c33733ed55e20d00464cdf791f5 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 14 Jun 2007 13:50:58 +0000 Subject: Put the mode in the ExtMachInst. --HG-- extra : convert_revision : 7fc6567ab3d35c06901e6c8a0435f7cab819e17e --- src/arch/x86/predecoder.cc | 1 + src/arch/x86/predecoder.hh | 5 ++++- src/arch/x86/types.hh | 23 +++++++++++++++++++++++ src/arch/x86/utility.hh | 2 +- 4 files changed, 29 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/arch/x86/predecoder.cc b/src/arch/x86/predecoder.cc index 5c98a1831..72b60385b 100644 --- a/src/arch/x86/predecoder.cc +++ b/src/arch/x86/predecoder.cc @@ -77,6 +77,7 @@ namespace X86ISA emi.modRM = 0; emi.sib = 0; + emi.mode = 0; } void Predecoder::process() diff --git a/src/arch/x86/predecoder.hh b/src/arch/x86/predecoder.hh index 0708875c1..3c858f061 100644 --- a/src/arch/x86/predecoder.hh +++ b/src/arch/x86/predecoder.hh @@ -176,7 +176,10 @@ namespace X86ISA tc(_tc), basePC(0), origPC(0), offset(0), outOfBytes(true), emiIsReady(false), state(ResetState) - {} + { + emi.mode.mode = LongMode; + emi.mode.submode = SixtyFourBitMode; + } ThreadContext * getTC() { diff --git a/src/arch/x86/types.hh b/src/arch/x86/types.hh index 225258358..fc9f1d82b 100644 --- a/src/arch/x86/types.hh +++ b/src/arch/x86/types.hh @@ -120,6 +120,24 @@ namespace X86ISA Bitfield<2,0> bottom3; EndBitUnion(Opcode) + BitUnion8(OperatingMode) + Bitfield<3> mode; + Bitfield<2,0> submode; + EndBitUnion(OperatingMode) + + enum X86Mode { + LongMode, + LegacyMode + }; + + enum X86SubMode { + SixtyFourBitMode, + CompatabilityMode, + ProtectedMode, + Virtual8086Mode, + RealMode + }; + //The intermediate structure the x86 predecoder returns. struct ExtMachInst { @@ -151,6 +169,9 @@ namespace X86ISA uint8_t opSize; //The effective address size. uint8_t addrSize; + + //Mode information + OperatingMode mode; }; inline static std::ostream & @@ -172,6 +193,8 @@ namespace X86ISA inline static bool operator == (const ExtMachInst &emi1, const ExtMachInst &emi2) { + if(emi1.mode != emi2.mode) + return false; if(emi1.legacy != emi2.legacy) return false; if(emi1.rex != emi2.rex) diff --git a/src/arch/x86/utility.hh b/src/arch/x86/utility.hh index 1c98e7fbc..ed401a519 100644 --- a/src/arch/x86/utility.hh +++ b/src/arch/x86/utility.hh @@ -79,7 +79,7 @@ namespace __hash_namespace { ((uint64_t)emi.opcode.prefixB << 8) | ((uint64_t)emi.opcode.op)) ^ emi.immediate ^ emi.displacement ^ - emi.opSize; + emi.mode ^ emi.opSize; }; }; } -- cgit v1.2.3