x86: Fix re-entrancy problems in x87 store instructions
authorAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 30 Sep 2013 09:51:25 +0000 (11:51 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 30 Sep 2013 09:51:25 +0000 (11:51 +0200)
X87 store instructions typically loads and pops the top value of the
stack and stores it in memory. The current implementation pops the
stack at the same time as the floating point value is loaded to a
temporary register. This will corrupt the state of the x87 stack if
the store fails. This changeset introduces a pop87 micro-instruction
that pops the stack and uses this instruction in the affected
macro-instructions to pop the stack after storing the value to memory.

src/arch/x86/isa/insts/x87/data_transfer_and_conversion/load_or_store_floating_point.py
src/arch/x86/isa/microops/fpop.isa

index 4e230513c0abd09422d2330d7e2e75924364e689..5a19aabd949c0ff24e7a861bdb7603ae97f7e9f1 100644 (file)
@@ -69,13 +69,15 @@ def macroop FSTP_R {
 };
 
 def macroop FSTP_M {
-    movfp ufp1, st(0), spm=1
+    movfp ufp1, st(0)
     stfp ufp1, seg, sib, disp
+    pop87
 };
 
 def macroop FSTP_P {
-    movfp ufp1, st(0), spm=1
+    movfp ufp1, st(0)
     rdip t7
     stfp ufp1, seg, riprel, disp
+    pop87
 };
 '''
index 142138fb25af7290923e01b85a6d06087f429544..8a77914d9b1f5e8e94dbd1a906dc46d1841236f0 100644 (file)
@@ -411,4 +411,13 @@ let {{
     class chsfp(FpUnaryOp):
         code = 'FpDestReg = (-1) * (FpSrcReg1);'
         flag_code = 'FSW = FSW & (~CC1Bit);'
+
+    class Pop87(FpUnaryOp):
+        def __init__(self, spm=1, UpdateFTW=True):
+            super(Pop87, self).__init__(               \
+                    "InstRegIndex(FLOATREG_MICROFP0)", \
+                    "InstRegIndex(FLOATREG_MICROFP0)", \
+                    spm=spm, SetStatus=False, UpdateFTW=UpdateFTW)
+
+        code = ''
 }};