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

Reply via email to