diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2007-12-01 23:00:15 -0800 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2007-12-01 23:00:15 -0800 |
commit | bfc62d1a7035dfdbad405c0ddbd897ea1174360d (patch) | |
tree | 1fa01d23200823c1e162d28303254b81bccea6f3 /src/arch/x86/miscregfile.cc | |
parent | 7433032b39828ccff9ad5ed0e3ed95f752fc269a (diff) | |
download | gem5-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.cc | 19 |
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); } |