[pypy-commit] pypy arm64: Write gen_shadowstack_header() from arm at revision ed056c08b76f
arigo
pypy.commits at gmail.com
Fri Jun 28 14:49:53 EDT 2019
Author: Armin Rigo <arigo at tunes.org>
Branch: arm64
Changeset: r96880:99b712dabafd
Date: 2019-06-28 20:48 +0200
http://bitbucket.org/pypy/pypy/changeset/99b712dabafd/
Log: Write gen_shadowstack_header() from arm at revision ed056c08b76f
diff --git a/rpython/jit/backend/aarch64/assembler.py b/rpython/jit/backend/aarch64/assembler.py
--- a/rpython/jit/backend/aarch64/assembler.py
+++ b/rpython/jit/backend/aarch64/assembler.py
@@ -1021,11 +1021,27 @@
mc.RET_r(r.lr.value)
+ def gen_shadowstack_header(self, gcrootmap):
+ # we push two words, like the x86 backend does:
+ # the '1' is to benefit from the shadowstack 'is_minor' optimization
+ rst = gcrootmap.get_root_stack_top_addr()
+ self.mc.gen_load_int(r.ip1.value, rst)
+ # x8 = *ip1
+ self.load_reg(self.mc, r.x8, r.ip1)
+ # x8[0] = 1
+ self.mc.gen_load_int(r.ip0.value, 1)
+ self.store_reg(self.mc, r.ip0, r.x8)
+ # x8[1] = r.fp
+ self.store_reg(self.mc, r.fp, r.x8, WORD)
+ # *ip1 = x8 + 2 * WORD
+ self.mc.ADD_ri(r.x8.value, r.x8.value, 2 * WORD)
+ self.store_reg(self.mc, r.x8, r.ip1)
+
def gen_footer_shadowstack(self, gcrootmap, mc):
rst = gcrootmap.get_root_stack_top_addr()
mc.gen_load_int(r.ip0.value, rst)
self.load_reg(mc, r.ip1, r.ip0)
- mc.SUB_ri(r.ip1.value, r.ip1.value, WORD)
+ mc.SUB_ri(r.ip1.value, r.ip1.value, 2 * WORD) # two words, see above
self.store_reg(mc, r.ip1, r.ip0)
def store_reg(self, mc, source, base, ofs=0, helper=None):
More information about the pypy-commit
mailing list