[pypy-commit] pypy s390x-backend: an edge case in call release gil that could overwrite values for registers r8-r13, because the stack is not decremented accordingly

plan_rich pypy.commits at gmail.com
Thu Feb 4 04:05:01 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r82069:f5ccdddddea0
Date: 2016-02-04 10:04 +0100
http://bitbucket.org/pypy/pypy/changeset/f5ccdddddea0/

Log:	an edge case in call release gil that could overwrite values for
	registers r8-r13, because the stack is not decremented accordingly

diff --git a/rpython/jit/backend/zarch/callbuilder.py b/rpython/jit/backend/zarch/callbuilder.py
--- a/rpython/jit/backend/zarch/callbuilder.py
+++ b/rpython/jit/backend/zarch/callbuilder.py
@@ -263,8 +263,13 @@
                 self.mc.LGR(RSAVEDRES, reg)
             elif reg.is_fp_reg():
                 self.mc.STD(reg, l.addr(16*WORD, r.SP))
+        # r8-r13 live on the stack and must NOT be overwritten,
+        # restore_stack_pointer already moved SP + subtracted_to_sp,
+        self.mc.LAY(r.SP, l.addr(-self.subtracted_to_sp, r.SP))
         self.mc.load_imm(self.mc.RAW_CALL_REG, self.asm.reacqgil_addr)
         self.mc.raw_call()
+        self.mc.LAY(r.SP, l.addr(self.subtracted_to_sp, r.SP))
+
         if reg is not None:
             if reg.is_core_reg():
                 self.mc.LGR(reg, RSAVEDRES)


More information about the pypy-commit mailing list