[pypy-commit] pypy ppc-jit-backend: (edelsohn, bivab): Add shadowstack header and footer for marker management.

edelsohn noreply at buildbot.pypy.org
Mon Mar 5 19:09:05 CET 2012


Author: edelsohn
Branch: ppc-jit-backend
Changeset: r53238:f43b8c4b6565
Date: 2012-03-05 13:08 -0500
http://bitbucket.org/pypy/pypy/changeset/f43b8c4b6565/

Log:	(edelsohn, bivab): Add shadowstack header and footer for marker
	management.

diff --git a/pypy/jit/backend/ppc/ppc_assembler.py b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -146,6 +146,31 @@
                       WORD * (len(NONVOLATILES)-1))
         self.mc.load(r.r30.value, r.SP.value, WORD)
         self.mc.store(r.r30.value, r.SPP.value, ofs_to_r31)
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            self.gen_shadowstack_header(gcrootmap)
+
+    def gen_shadowstack_header(self, gcrootmap):
+        # we need to put two words into the shadowstack: the MARKER_FRAME
+        # and the address of the frame (fp, actually)
+        rst = gcrootmap.get_root_stack_top_addr()
+        self.mc.load_imm(r.r14, rst)
+        self.mc.load(r.r15.value, r.r14.value, 0) # LD r15 [rootstacktop]
+        #
+        MARKER = gcrootmap.MARKER_FRAME
+        self.mc.addi(r.r16.value, r.r15.value, 2 * WORD) # ADD r16, r15, 2*WORD
+        self.mc.load_imm(r.r17, MARKER)
+        self.mc.store(r.r17.value, r.r15.value, WORD)  # STR MARKER, r15+WORD
+        self.mc.store(r.r31.value, r.r15.value, 0)  # STR fp, r15
+        #
+        self.mc.store(r.r16.value, r.r14.value, 0)  # STR r16, [rootstacktop]
+
+    def gen_footer_shadowstack(self, gcrootmap, mc):
+        rst = gcrootmap.get_root_stack_top_addr()
+        mc.load_imm(r.r14, rst)
+        mc.load(r.r15.value, r.r14.value, 0)  # LD r15, [rootstacktop]
+        mc.addi(r.r15.value, r.r15.value, -2 * WORD)  # SUB r15, r15, 2*WORD
+        mc.store(r.r15.value, r.r14.value, 0) # STR r15, [rootstacktop]
 
     def setup_failure_recovery(self):
 
@@ -409,6 +434,9 @@
                                    self.cpu.gc_ll_descr.gcrootmap)
 
     def _gen_epilogue(self, mc):
+        gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+        if gcrootmap and gcrootmap.is_shadow_stack:
+            self.gen_footer_shadowstack(gcrootmap, mc)
         # save SPP in r5
         # (assume that r5 has been written to failboxes)
         mc.mr(r.r5.value, r.SPP.value)


More information about the pypy-commit mailing list