Author: Remi Meier <remi.me...@gmail.com>
Branch: stmgc-c4
Changeset: r65604:709074b08a49
Date: 2013-07-24 16:03 +0200
http://bitbucket.org/pypy/pypy/changeset/709074b08a49/

Log:    attempt to use stmtlocal.py for stm_shadowstack

diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -34,6 +34,7 @@
 from rpython.jit.codewriter import longlong
 from rpython.rlib.rarithmetic import intmask, r_uint
 from rpython.rlib.objectmodel import compute_unique_id
+from rpython.jit.backend.x86 import stmtlocal
 
 
 class Assembler386(BaseAssembler):
@@ -837,13 +838,13 @@
         that gives the address of the stack top.  If this integer doesn't
         fit in 32 bits, it will be loaded in r11.
         """
-        rst = gcrootmap.get_root_stack_top_addr()
+        rst = self._get_root_stack_top_addr()
+        
         if rx86.fits_in_32bits(rst):
+            if gcrootmap.is_stm:
+                stmtlocal.tl_segment_prefix(mc)
             mc.MOV_rj(ebx.value, rst)            # MOV ebx, [rootstacktop]
         else:
-            # The integer 'rst' doesn't fit in 32 bits, so we know that
-            # _load_shadowstack_top_in_ebx() above loaded it in r11.
-            # Reuse it.  Be careful not to overwrite r11 in the middle!
             mc.MOV_ri(X86_64_SCRATCH_REG.value, rst) # MOV r11, rootstacktop
             mc.MOV_rm(ebx.value, (X86_64_SCRATCH_REG.value, 0))
             # MOV ebx, [r11]
@@ -854,15 +855,24 @@
         rst = self._load_shadowstack_top_in_ebx(self.mc, gcrootmap)
         self.mc.MOV_mr((ebx.value, 0), ebp.value)      # MOV [ebx], ebp
         self.mc.ADD_ri(ebx.value, WORD)
+        
         if rx86.fits_in_32bits(rst):
+            if gcrootmap.is_stm:
+                stmtlocal.tl_segment_prefix(self.mc)
             self.mc.MOV_jr(rst, ebx.value)            # MOV [rootstacktop], ebx
         else:
+            # The integer 'rst' doesn't fit in 32 bits, so we know that
+            # _load_shadowstack_top_in_ebx() above loaded it in r11.
+            # Reuse it.  Be careful not to overwrite r11 in the middle!
             self.mc.MOV_mr((X86_64_SCRATCH_REG.value, 0),
                            ebx.value) # MOV [r11], ebx
 
     def _call_footer_shadowstack(self, gcrootmap):
-        rst = gcrootmap.get_root_stack_top_addr()
+        rst = self._get_root_stack_top_addr()
+        
         if rx86.fits_in_32bits(rst):
+            if gcrootmap.is_stm:
+                stmtlocal.tl_segment_prefix(self.mc)
             self.mc.SUB_ji8(rst, WORD)       # SUB [rootstacktop], WORD
         else:
             self.mc.MOV_ri(ebx.value, rst)           # MOV ebx, rootstacktop
@@ -1172,15 +1182,30 @@
         cb = callbuilder.CallBuilder(self, fnloc, arglocs)
         cb.emit_no_collect()
 
+    def _get_root_stack_top_addr(self):
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        
+        rst = gcrootmap.get_root_stack_top_addr()
+        if gcrootmap.is_stm:
+            rst = rst - stmtlocal.threadlocal_base()
+            assert rst > 0
+            assert rx86.fits_in_32bits(rst)
+        return rst
+            
     def _reload_frame_if_necessary(self, mc, align_stack=False):
         gc_ll_descr = self.cpu.gc_ll_descr
         gcrootmap = gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
-            rst = gcrootmap.get_root_stack_top_addr()
+            rst = self._get_root_stack_top_addr()
+
+            if gcrootmap.is_stm:
+                stmtlocal.tl_segment_prefix(mc)
             mc.MOV(ecx, heap(rst))
             mc.MOV(ebp, mem(ecx, -WORD))
-
+        #
         if gcrootmap and gcrootmap.is_stm:
+            
+            
             if not hasattr(gc_ll_descr, 'P2Wdescr'):
                 raise Exception("unreachable code")
             wbdescr = gc_ll_descr.P2Wdescr
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to