Author: Armin Rigo <[email protected]>
Branch: continulet-jit-2
Changeset: r53126:7c389cf9b418
Date: 2012-03-02 20:44 +0100
http://bitbucket.org/pypy/pypy/changeset/7c389cf9b418/

Log:    Found and fix an issue with shadowstack. Hard to test :-(

diff --git a/pypy/jit/backend/x86/assembler.py 
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -758,6 +758,10 @@
         #
         self.mc.LEA_rm(ebp.value, (eax.value, WORD * (FRAME_FIXED_SIZE-1)))
         #
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap is not None and gcrootmap.is_shadow_stack:
+            self._fixup_shadowstack_location(gcrootmap)
+        #
         if IS_X86_32:
             self.mc.ADD_ri(esp.value, 2*WORD)
             self.mc.POP_r(save_regs[2].value)
@@ -898,6 +902,15 @@
         else:
             self.mc.MOV_mr((r13.value, 0), ebx.value) # MOV [r13], ebx
 
+    def _fixup_shadowstack_location(self, gcrootmap):
+        rst = gcrootmap.get_root_stack_top_addr()
+        if rx86.fits_in_32bits(rst):
+            self.mc.MOV_rj(eax.value, rst)            # MOV eax, [rootstacktop]
+        else:
+            self.mc.MOV_ri(eax.value, rst)            # MOV eax, rootstacktop
+            self.mc.MOV_rm(eax.value, (eax.value, 0)) # MOV eax, [eax]
+        self.mc.MOV_mr((eax.value, -2*WORD), ebp.value)# MOV [eax-2*WORD], ebp
+
     def _call_footer_shadowstack(self, gcrootmap):
         rst = gcrootmap.get_root_stack_top_addr()
         if rx86.fits_in_32bits(rst):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to