Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60761:95cbf1e7e19e
Date: 2013-01-31 12:36 +0200
http://bitbucket.org/pypy/pypy/changeset/95cbf1e7e19e/
Log: (arigo, fijal) Fight a bit with realloc_frame. We should put stuff
back on top of shadowstack if we choose to reallocate frame
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
@@ -215,11 +215,19 @@
mc.CALL(imm(self.cpu.realloc_frame))
mc.ADD_ri(esp.value, WORD)
mc.LEA_rm(ebp.value, (eax.value, base_ofs))
+
+ gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+ if gcrootmap and gcrootmap.is_shadow_stack:
+ self._load_shadowstack_top_in_ebx(mc, gcrootmap)
+ mc.MOV_mr((ebx.value, -WORD), eax.value)
+
mc.MOV_bi(gcmap_ofs, 0)
self._pop_all_regs_from_frame(mc, [], self.cpu.supports_floats)
mc.RET()
self._stack_check_failure = mc.materialize(self.cpu.asmmemmgr, [])
+ # XXX an almost identical copy for debugging, remove
+
mc = codebuf.MachineCodeBlockWrapper()
self._push_all_regs_to_frame(mc, [], self.cpu.supports_floats)
assert not IS_X86_32
@@ -236,6 +244,11 @@
mc.CALL(imm(self.cpu.realloc_frame_check))
mc.ADD_ri(esp.value, WORD)
mc.LEA_rm(ebp.value, (eax.value, base_ofs))
+
+ gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+ if gcrootmap and gcrootmap.is_shadow_stack:
+ self._load_shadowstack_top_in_ebx(mc, gcrootmap)
+ mc.MOV_mr((ebx.value, -WORD), eax.value)
mc.MOV_bi(gcmap_ofs, 0)
self._pop_all_regs_from_frame(mc, [], self.cpu.supports_floats)
mc.RET()
@@ -877,27 +890,33 @@
self.mc.ADD_ri(esp.value, FRAME_FIXED_SIZE * WORD)
self.mc.RET()
+ def _load_shadowstack_top_in_ebx(self, mc, gcrootmap):
+ rst = gcrootmap.get_root_stack_top_addr()
+ if rx86.fits_in_32bits(rst):
+ mc.MOV_rj(ebx.value, rst) # MOV ebx, [rootstacktop]
+ else:
+ 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]
+ #
+ return rst
+
def _call_header_shadowstack(self, gcrootmap):
# we don't *really* have to do it, since we have the frame
# being referenced by the caller. However, we still do it
# to provide a place where we can read the frame from, in case
# we need to reload it after a collection
- 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(r13.value, rst) # MOV r13, rootstacktop
- self.mc.MOV_rm(eax.value, (r13.value, 0)) # MOV eax, [r13]
- #
+ rst = self._load_shadowstack_top_in_ebx(self.mc, gcrootmap)
if IS_X86_64:
- self.mc.MOV_mr((eax.value, 0), edi.value) # MOV [eax], edi
+ self.mc.MOV_mr((ebx.value, 0), edi.value) # MOV [ebx], edi
else:
xxx
- self.mc.ADD_ri(eax.value, WORD)
+ self.mc.ADD_ri(ebx.value, WORD)
if rx86.fits_in_32bits(rst):
- self.mc.MOV_jr(rst, eax.value) # MOV [rootstacktop], eax
+ self.mc.MOV_jr(rst, ebx.value) # MOV [rootstacktop], edx
else:
- self.mc.MOV_mr((r13.value, 0), eax.value) # MOV [r13], eax
+ self.mc.MOV_mr((X86_64_SCRATCH_REG.value, 0),
+ ebx.value) # MOV [r11], edx
def _call_footer_shadowstack(self, gcrootmap):
rst = gcrootmap.get_root_stack_top_addr()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit