summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-06-14 13:50:58 +0000
committerGabe Black <gblack@eecs.umich.edu>2007-06-14 13:50:58 +0000
commitcd3fee1b81ad3c33733ed55e20d00464cdf791f5 (patch)
tree93dad6c69e5195647413fab418ffcab217badcdc
parent640ab1d2e76835ecc20596d5d218b97a2ab0cf9d (diff)
downloadgem5-cd3fee1b81ad3c33733ed55e20d00464cdf791f5.tar.xz
Put the mode in the ExtMachInst.
--HG-- extra : convert_revision : 7fc6567ab3d35c06901e6c8a0435f7cab819e17e
-rw-r--r--src/arch/x86/predecoder.cc1
-rw-r--r--src/arch/x86/predecoder.hh5
-rw-r--r--src/arch/x86/types.hh23
-rw-r--r--src/arch/x86/utility.hh2
4 files changed, 29 insertions, 2 deletions
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;
};
};
}