summaryrefslogtreecommitdiff
path: root/src/arch/x86/miscregfile.cc
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2007-12-01 23:00:15 -0800
committerGabe Black <gblack@eecs.umich.edu>2007-12-01 23:00:15 -0800
commitbfc62d1a7035dfdbad405c0ddbd897ea1174360d (patch)
tree1fa01d23200823c1e162d28303254b81bccea6f3 /src/arch/x86/miscregfile.cc
parent7433032b39828ccff9ad5ed0e3ed95f752fc269a (diff)
downloadgem5-bfc62d1a7035dfdbad405c0ddbd897ea1174360d.tar.xz
X86: Separate the effective seg base and the "hidden" seg base.
--HG-- extra : convert_revision : 5fcb8d94dbab7a7d6fe797277a5856903c885ad4
Diffstat (limited to 'src/arch/x86/miscregfile.cc')
-rw-r--r--src/arch/x86/miscregfile.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/arch/x86/miscregfile.cc b/src/arch/x86/miscregfile.cc
index 71908098e..a01902478 100644
--- a/src/arch/x86/miscregfile.cc
+++ b/src/arch/x86/miscregfile.cc
@@ -186,6 +186,25 @@ void MiscRegFile::setReg(int miscReg,
break;
case MISCREG_CR8:
break;
+ case MISCREG_CS_ATTR:
+ {
+ SegAttr toggled = regVal[miscReg] ^ val;
+ SegAttr newCSAttr = val;
+ if (toggled.longMode) {
+ SegAttr newCSAttr = val;
+ if (newCSAttr.longMode) {
+ regVal[MISCREG_ES_EFF_BASE] = 0;
+ regVal[MISCREG_CS_EFF_BASE] = 0;
+ regVal[MISCREG_SS_EFF_BASE] = 0;
+ regVal[MISCREG_DS_EFF_BASE] = 0;
+ } else {
+ regVal[MISCREG_ES_EFF_BASE] = regVal[MISCREG_ES_BASE];
+ regVal[MISCREG_CS_EFF_BASE] = regVal[MISCREG_CS_BASE];
+ regVal[MISCREG_SS_EFF_BASE] = regVal[MISCREG_SS_BASE];
+ regVal[MISCREG_DS_EFF_BASE] = regVal[MISCREG_DS_BASE];
+ }
+ }
+ }
}
setRegNoEffect(miscReg, newVal);
}