summaryrefslogtreecommitdiff
path: root/src/arch/x86/insts
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-02-25 10:18:22 -0800
committerGabe Black <gblack@eecs.umich.edu>2009-02-25 10:18:22 -0800
commitdc53ca89f685155ff00103ed013b1ed6a6ad91a6 (patch)
tree828f6e8583bc62e3182ff48e90e299138acd4307 /src/arch/x86/insts
parent897c3748925e83301027d85dbc4c0479d972fda4 (diff)
downloadgem5-dc53ca89f685155ff00103ed013b1ed6a6ad91a6.tar.xz
X86: Add a flag to force memory accesses to happen at CPL 0.
Diffstat (limited to 'src/arch/x86/insts')
-rw-r--r--src/arch/x86/insts/microldstop.hh12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/arch/x86/insts/microldstop.hh b/src/arch/x86/insts/microldstop.hh
index eccd37dc2..f0051e2cf 100644
--- a/src/arch/x86/insts/microldstop.hh
+++ b/src/arch/x86/insts/microldstop.hh
@@ -60,9 +60,16 @@
#include "arch/x86/insts/microop.hh"
#include "mem/packet.hh"
+#include "mem/request.hh"
namespace X86ISA
{
+ static const Request::FlagsType SegmentFlagMask = mask(4);
+ static const int FlagShift = 4;
+ enum FlagBit {
+ CPL0FlagBit = 1
+ };
+
/**
* Base class for load and store ops
*/
@@ -77,6 +84,7 @@ namespace X86ISA
const RegIndex data;
const uint8_t dataSize;
const uint8_t addressSize;
+ const Request::FlagsType memFlags;
RegIndex foldOBit, foldABit;
//Constructor
@@ -87,13 +95,15 @@ namespace X86ISA
uint64_t _disp, uint8_t _segment,
RegIndex _data,
uint8_t _dataSize, uint8_t _addressSize,
+ Request::FlagsType _memFlags,
OpClass __opClass) :
X86MicroopBase(machInst, mnem, _instMnem,
isMicro, isDelayed, isFirst, isLast, __opClass),
scale(_scale), index(_index), base(_base),
disp(_disp), segment(_segment),
data(_data),
- dataSize(_dataSize), addressSize(_addressSize)
+ dataSize(_dataSize), addressSize(_addressSize),
+ memFlags(_memFlags | _segment)
{
foldOBit = (dataSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
foldABit =