Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/56904 )

Change subject: arch-x86: Add the null selector check to m_read_descriptor.
......................................................................

arch-x86: Add the null selector check to m_read_descriptor.

Change-Id: Ifce7757e812265eec338b695551c19686254f65c
---
M src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
M src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
M src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
M src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
M src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
M src/arch/x86/microcode/macros/segmentation.ucode
M src/arch/x86/microcode/romutil.ucode
7 files changed, 13 insertions(+), 38 deletions(-)



diff --git a/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode b/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
index f2b5a99..9640fcd 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode +++ b/src/arch/x86/microcode/general_purpose/control_transfer/interrupts_and_exceptions.ucode
@@ -127,10 +127,7 @@
 ###

     #CS = READ_DESCRIPTOR (temp_CS, iret_chk)
-    andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
-    br "processCSDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t8", selector="t2"
-processCSDescriptor:
     chks t0, t2, t8, NoCheck, dataSize=8


@@ -178,10 +175,7 @@
     #    POP.v temp_SS
     ld t9, ss, [1, t0, rsp], "4 * env.dataSize", addressSize=ssz
     #    SS = READ_DESCRIPTOR (temp_SS, ss_chk)
-    andi t0, t9, 0xFC, flags=(EZF,), dataSize=2
-    br "processSSDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t7", selector="t9"
-processSSDescriptor:
     chks t0, t9, t7, NoCheck, dataSize=8

# This actually updates state which is wrong. It should wait until we know diff --git a/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode b/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
index 5c291f8..0542728 100644
--- a/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
+++ b/src/arch/x86/microcode/general_purpose/control_transfer/xreturn.ucode
@@ -139,10 +139,7 @@
     # that doesn't happen yet.

     # Do stuff if they're equal
-    andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="t2"
-processDescriptor:
     chks t0, t2, t3, IretCheck, dataSize=8
     # There should be validity checks on the RIP checks here, but I'll do
     # that later.
diff --git a/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode b/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
index de4f060..0b35f08 100644
--- a/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
+++ b/src/arch/x86/microcode/general_purpose/data_transfer/move.ucode
@@ -265,10 +265,7 @@

 def macroop MOV {
     .args 'S', 'R'
-    andi t0, regm, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="regm"
-processDescriptor:
     chks t0, regm, t3, NoCheck, dataSize=8
     wrdl sr, t3, regm
     wrsel sr, regm
@@ -277,10 +274,7 @@
 def macroop MOV {
     .args 'S', 'M'
     ld t1, seg, sib, disp, dataSize=2
-    andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="t1"
-processDescriptor:
     chks t0, t1, t3, NoCheck, dataSize=8
     wrdl sr, t3, t1
     wrsel sr, t1
@@ -290,10 +284,7 @@
     .args 'S', 'P'
     rdip t7
     ld t1, seg, riprel, disp, dataSize=2
-    andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="t1"
-processDescriptor:
     chks t0, t1, t3, NoCheck, dataSize=8
     wrdl sr, t3, t1
     wrsel sr, t1
@@ -301,10 +292,7 @@

 def macroop MOVSS {
     .args 'S', 'R'
-    andi t0, regm, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="regm"
-processDescriptor:
     chks t0, regm, t3, SSCheck, dataSize=8
     wrdl sr, t3, regm
     wrsel sr, regm
@@ -313,10 +301,7 @@
 def macroop MOVSS {
     .args 'S', 'M'
     ld t1, seg, sib, disp, dataSize=2
-    andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="t1"
-processDescriptor:
     chks t0, t1, t3, SSCheck, dataSize=8
     wrdl sr, t3, t1
     wrsel sr, t1
@@ -326,10 +311,7 @@
     .args 'S', 'P'
     rdip t7
     ld t1, seg, riprel, disp, dataSize=2
-    andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
     m_read_descriptor desc="t3", selector="t1"
-processDescriptor:
     chks t0, t1, t3, SSCheck, dataSize=8
     wrdl sr, t3, t1
     wrsel sr, t1
diff --git a/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode b/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
index 643fb11..f010878 100644
--- a/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode +++ b/src/arch/x86/microcode/general_purpose/data_transfer/stack_operations.ucode
@@ -85,12 +85,8 @@

     ld t1, ss, [1, t0, rsp], addressSize=ssz, dataSize=2

-    andi t0, t1, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
-
     m_read_descriptor desc="t3", selector="t1"

-processDescriptor:
     chks t0, t1, t3, NoCheck, dataSize=8
     wrdl sr, t3, t1
     wrsel sr, t1
diff --git a/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode b/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
index f0231b2..88c10b6 100644
--- a/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
+++ b/src/arch/x86/microcode/general_purpose/load_segment_registers.ucode
@@ -44,14 +44,9 @@
     # Load the offset.
     ld t1, seg, [1, t0, t1], 0

-    # Figure out if this is a null selector.
-    andi t0, t2, 0xFC, flags=(EZF,), dataSize=2
-    br "processDescriptor", flags=(CEZF,)
-
     m_read_descriptor desc="t4", selector="t2"

     # Install the descriptor.
-processDescriptor:
     chks t0, t2, t4, {"SSCheck" if seg == "ss" else "NoCheck"}, dataSize=8
     wrdl {seg}, t4, t2
     wrsel {seg}, t2
diff --git a/src/arch/x86/microcode/macros/segmentation.ucode b/src/arch/x86/microcode/macros/segmentation.ucode
index d8c1b81..b956428 100644
--- a/src/arch/x86/microcode/macros/segmentation.ucode
+++ b/src/arch/x86/microcode/macros/segmentation.ucode
@@ -25,6 +25,10 @@

 def macro m_read_descriptor desc, selector, label_prefix=rnd_str()
 {
+    # Check for a null descriptor.
+    andi t0, {selector}, 0xFC, flags=(EZF,), dataSize=2
+    br "{label_prefix}_process_desc", flags=(CEZF,)
+
     # Extract the index.
     andi {desc}, {selector}, 0xF8, dataSize=8

diff --git a/src/arch/x86/microcode/romutil.ucode b/src/arch/x86/microcode/romutil.ucode
index 27b1d36..13a9d2b 100644
--- a/src/arch/x86/microcode/romutil.ucode
+++ b/src/arch/x86/microcode/romutil.ucode
@@ -253,8 +253,6 @@

     # Go get the stack segment descriptor
     # Check for a null selector.
-    andi t0, t8, 0xFC, flags=(EZF,), dataSize=8
-    fault "std::make_shared<GeneralProtection>(0)", flags=(CEZF,)
     m_read_descriptor desc="t12", selector="t8"
     chks t0, t8, t12, SSCheck, dataSize=8
     wrdl hs, t12, t8, dataSize=8

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/56904
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: Ifce7757e812265eec338b695551c19686254f65c
Gerrit-Change-Number: 56904
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to