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

Change subject: arch-x86: Refactor legacy int code so far call can use it.
......................................................................

arch-x86: Refactor legacy int code so far call can use it.

A far call through a call gate is mechanically very similar to how an
interrupt is vectored to. Refactor the legacy interrupt vectoring code
so that far calls can also use it.

Change-Id: Ice87e831d089e29cae931d7d212cd0d69aed769e
---
M src/arch/x86/microcode/romutil.ucode
1 file changed, 84 insertions(+), 64 deletions(-)



diff --git a/src/arch/x86/microcode/romutil.ucode b/src/arch/x86/microcode/romutil.ucode
index b70cd5a..1352f03 100644
--- a/src/arch/x86/microcode/romutil.ucode
+++ b/src/arch/x86/microcode/romutil.ucode
@@ -178,62 +178,7 @@

 def rom
 {
-    ############################################
-    # Entry points for legacy mode interrupts. #
-    ############################################
-extern legacyModeInterrupt:
-    bsr "legacy_mode_int_get_gate"
-
-    # Make sure the descriptor is a legal gate.
-    chks t0, t0, t1, IntGateCheck, dataSize=8
-    bsr "legacy_mode_int_work"
-    br "legacy_mode_int_finalize"
-
-extern legacyModeSoftInterrupt:
-    bsr "legacy_mode_int_get_gate"
-
-    # Make sure the descriptor is a legal gate.
-    chks t0, t0, t1, SoftIntGateCheck, dataSize=8
-    bsr "legacy_mode_int_work"
-    br "legacy_mode_int_finalize"
-
-extern legacyModeInterruptWithError:
-    bsr "legacy_mode_int_get_gate"
-
-    # Make sure the descriptor is a legal gate.
-    chks t0, t0, t1, IntGateCheck, dataSize=8
-    bsr "legacy_mode_int_work"
-
-    # Push an appropriately sized error code onto the target stack.
-
-    br "legacy_mode_int_push_ec_dsz_is_4", flags=(CECF,)
-
-    subi t5, t5, 2, dataSize=ssz
-    st t15, hs, [1, t0, t5], 0, dataSize=2, addressSize=ssz
-    br "legacy_mode_int_finalize"
-
-legacy_mode_int_push_ec_dsz_is_4:
-    subi t5, t5, 4, dataSize=ssz
-    st t15, hs, [1, t0, t5], 0, dataSize=4, addressSize=ssz
-    br "legacy_mode_int_finalize"
-
-
-    ####################################################
-    # A small helper to read in the gate from the IDT. #
-    ####################################################
-legacy_mode_int_get_gate:
-    # Load the gate descriptor from the IDT
-    slli t1, t1, 3, dataSize=8
-    ld t1, idtr, [1, t0, t1], dataSize=8, addressSize=8, atCPL0=True
-
-    sret
-
-
-    ##########################################
-    # The majority of the work is done here. #
-    ##########################################
-legacy_mode_int_work:
-
+extern legacyModeProcessGate:
     # Starred values are already set on entry.
     # *t1 = gate descriptor
     #  t2 = target offset
@@ -297,8 +242,7 @@

     m_copy_seg_info dest="hs", source="ss", temp_reg="t8"

-    br "legacy_mode_int_dsz_is_4", flags=(CECF,)
-    br "legacy_mode_int_dsz_is_2"
+    sret

 legacy_mode_int_stack_switch:
     br "legacy_mode_int_switch_dsz_is_4", flags=(CECF,)
@@ -306,7 +250,74 @@
     m_switch_legacy_stack new_ptr="t5", new_seg="hs", new_cpl="t4", \
             temp_reg="t8", data_size=2

-legacy_mode_int_dsz_is_2:
+    sret
+
+legacy_mode_int_switch_dsz_is_4:
+    m_switch_legacy_stack new_ptr="t5", new_seg="hs", new_cpl="t4", \
+            temp_reg="t8", data_size=4
+
+    sret
+};
+
+def rom
+{
+    ############################################
+    # Entry points for legacy mode interrupts. #
+    ############################################
+extern legacyModeInterrupt:
+    bsr "legacy_mode_int_get_gate"
+
+    # Make sure the descriptor is a legal gate.
+    chks t0, t0, t1, IntGateCheck, dataSize=8
+    bsr "legacyModeProcessGate"
+    bsr "legacy_mode_int_push_frame"
+    br "legacy_mode_int_finalize"
+
+extern legacyModeSoftInterrupt:
+    bsr "legacy_mode_int_get_gate"
+
+    # Make sure the descriptor is a legal gate.
+    chks t0, t0, t1, SoftIntGateCheck, dataSize=8
+    bsr "legacyModeProcessGate"
+    bsr "legacy_mode_int_push_frame"
+    br "legacy_mode_int_finalize"
+
+extern legacyModeInterruptWithError:
+    bsr "legacy_mode_int_get_gate"
+
+    # Make sure the descriptor is a legal gate.
+    chks t0, t0, t1, IntGateCheck, dataSize=8
+    bsr "legacyModeProcessGate"
+    bsr "legacy_mode_int_push_frame"
+
+    # Push an appropriately sized error code onto the target stack.
+
+    br "legacy_mode_int_push_ec_dsz_is_4", flags=(CECF,)
+
+    subi t5, t5, 2, dataSize=ssz
+    st t15, hs, [1, t0, t5], 0, dataSize=2, addressSize=ssz
+    br "legacy_mode_int_finalize"
+
+legacy_mode_int_push_ec_dsz_is_4:
+    subi t5, t5, 4, dataSize=ssz
+    st t15, hs, [1, t0, t5], 0, dataSize=4, addressSize=ssz
+    br "legacy_mode_int_finalize"
+
+
+    ####################################################
+    # A small helper to read in the gate from the IDT. #
+    ####################################################
+legacy_mode_int_get_gate:
+    # Load the gate descriptor from the IDT
+    slli t1, t1, 3, dataSize=8
+    ld t1, idtr, [1, t0, t1], dataSize=8, addressSize=8, atCPL0=True
+
+    sret
+
+
+legacy_mode_int_push_frame:
+
+    br "legacy_mode_int_push_frame_dsz_is_4", flags=(CECF,)

     st t6, hs, [1, t0, t5], -2, dataSize=2, addressSize=ssz
     st t3, hs, [1, t0, t5], -4, dataSize=2, addressSize=ssz
@@ -315,11 +326,7 @@

     sret

-legacy_mode_int_switch_dsz_is_4:
-    m_switch_legacy_stack new_ptr="t5", new_seg="hs", new_cpl="t4", \
-            temp_reg="t8", data_size=4
-
-legacy_mode_int_dsz_is_4:
+legacy_mode_int_push_frame_dsz_is_4:

     st t6, hs, [1, t0, t5], -4, dataSize=4, addressSize=ssz
     st t3, hs, [1, t0, t5], -8, dataSize=4, addressSize=ssz

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/57196
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: Ice87e831d089e29cae931d7d212cd0d69aed769e
Gerrit-Change-Number: 57196
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