Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/57195 )
Change subject: arch-x86: Segment selectors are two bytes long, not one.
......................................................................
arch-x86: Segment selectors are two bytes long, not one.
Mask segment selectors with a two byte mask, not a one byte mask. This
new mask is large enough that it doesn't fit in the immediate field of
register microops, and needs to be set up with a limm (load immediate)
microop.
Change-Id: I25259733f20ceafec90bd1585c036d6bcd26ed80
---
M src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
M src/arch/x86/microcode/macros/segmentation.ucode
M src/arch/x86/microcode/system/segmentation.ucode
3 files changed, 36 insertions(+), 11 deletions(-)
diff --git
a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
index 4c0fb80..7fe052a 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/jump.ucode
@@ -129,9 +129,11 @@
extern jmpFarWork:
# t1 has the offset and t2 has the new selector.
# This is intended to run in protected mode.
- andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
+ limm t8, 0xfffc, dataSize=8
+ and t0, t2, t8, flags=(EZF,), dataSize=2
fault "std::make_shared<GeneralProtection>(0)", flags=(CEZF,)
- andi t3, t2, 0xF8, dataSize=8
+ limm t8, 0xfff8, dataSize=8
+ and t3, t2, t8, dataSize=8
andi t0, t2, 0x4, flags=(EZF,), dataSize=2
br "farJmpGlobalDescriptor", flags=(CEZF,)
ld t4, tsl, [1, t0, t3], dataSize=8, addressSize=8, atCPL0=True
diff --git a/src/arch/x86/microcode/macros/segmentation.ucode
b/src/arch/x86/microcode/macros/segmentation.ucode
index f278b47..0ef74d2 100644
--- a/src/arch/x86/microcode/macros/segmentation.ucode
+++ b/src/arch/x86/microcode/macros/segmentation.ucode
@@ -25,13 +25,17 @@
def macro m_read_descriptor desc, selector, label_prefix=rnd_str()
{
- # Extract the index. Ensure that desc is set even for null selectors.
- andi {desc}, {selector}, 0xF8, dataSize=8
+ # Check for a null descriptor. Ensure that desc is set even for null
+ # selectors.
+ limm {desc}, 0xfffc, dataSize=8
+ and t0, {selector}, {desc}, flags=(EZF,), dataSize=2
- # Check for a null descriptor.
- andi t0, {selector}, 0xFC, flags=(EZF,), dataSize=2
br "{label_prefix}_process_desc", flags=(CEZF,)
+ # Extract the index.
+ limm {desc}, 0xfff8, dataSize=8
+ and {desc}, {selector}, {desc}, dataSize=8
+
# Determine if this descriptor is in the GDT or LDT.
andi t0, {selector}, 0x4, flags=(EZF,), dataSize=2
diff --git a/src/arch/x86/microcode/system/segmentation.ucode
b/src/arch/x86/microcode/system/segmentation.ucode
index d23d553..5eff99d 100644
--- a/src/arch/x86/microcode/system/segmentation.ucode
+++ b/src/arch/x86/microcode/system/segmentation.ucode
@@ -263,7 +263,8 @@
.args 'R'
.serialize_after
chks t0, reg, t0, InGDTCheck
- andi t0, reg, 0xf8, flags=(EZF,)
+ limm t1, 0xfff8, dataSize=8
+ and t0, reg, t1, flags=(EZF,)
br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, reg, 3, dataSize=2
@@ -283,7 +284,8 @@
.serialize_after
ld t5, seg, sib, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
- andi t0, t5, 0xf8, flags=(EZF,)
+ limm t1, 0xfff8, dataSize=8
+ and t0, t5, t1, flags=(EZF,)
br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
@@ -304,7 +306,8 @@
rdip t7
ld t5, seg, riprel, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
- andi t0, t5, 0xf8, flags=(EZF,)
+ limm t1, 0xfff8, dataSize=8
+ and t0, t5, t1, flags=(EZF,)
br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
@@ -323,7 +326,8 @@
.args 'R'
.serialize_after
chks t0, reg, t0, InGDTCheck
- andi t0, reg, 0xf8, flags=(EZF,)
+ limm t1, 0xfff8, dataSize=8
+ and t0, reg, t1, flags=(EZF,)
br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, reg, 3, dataSize=2
@@ -340,7 +344,8 @@
.serialize_after
ld t5, seg, sib, disp, dataSize=2
chks t0, t5, t0, InGDTCheck
- andi t0, t5, 0xf8, flags=(EZF,)
+ limm t1, 0xfff8, dataSize=8
+ and t0, t5, t1, flags=(EZF,)
br "end", flags=(CEZF,)
limm t4, 0, dataSize=8
srli t4, t5, 3, dataSize=2
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/57195
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I25259733f20ceafec90bd1585c036d6bcd26ed80
Gerrit-Change-Number: 57195
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s