Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r81411:fd4fa9b6a5d1 Date: 2015-12-21 12:56 +0100 http://bitbucket.org/pypy/pypy/changeset/fd4fa9b6a5d1/
Log: first call to c (with release gil) passed, wrote 3 registers below the stack pointer. ppc has many registers, but zarch does not. thus I have chosen a middle ground between x86 and ppc. on the s390x 3 registers (that are very convenient for the call_release_gil instr) are saved before the instruction below the stack pointer. the following allocated stack is thus 3 words bigger diff --git a/rpython/jit/backend/zarch/arch.py b/rpython/jit/backend/zarch/arch.py --- a/rpython/jit/backend/zarch/arch.py +++ b/rpython/jit/backend/zarch/arch.py @@ -10,6 +10,7 @@ # +------------------------------+ | # | .... | | # | spill and local variables | | +# | used by call release gil | | # | .... | | # +------------------------------+ | # | .... | | 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 @@ -3,6 +3,7 @@ STD_FRAME_SIZE_IN_BYTES) import rpython.jit.backend.zarch.locations as l import rpython.jit.backend.zarch.registers as r +import rpython.jit.backend.zarch.conditions as c from rpython.jit.metainterp.history import INT, FLOAT from rpython.jit.backend.llsupport.callbuilder import AbstractCallBuilder from rpython.jit.backend.llsupport.jump import remap_frame_layout @@ -14,9 +15,9 @@ GPR_ARGS = [r.r2, r.r3, r.r4, r.r5, r.r6] FPR_ARGS = [r.f0, r.f2, r.f4, r.f6] - RSHADOWOLD = r.r9 - RSHADOWPTR = r.r10 - RFASTGILPTR = r.r12 + RSHADOWOLD = r.r8 + RSHADOWPTR = r.r9 + RFASTGILPTR = r.r10 def __init__(self, assembler, fnloc, arglocs, resloc): AbstractCallBuilder.__init__(self, assembler, fnloc, arglocs, @@ -122,7 +123,6 @@ if gcrootmap.is_shadow_stack and self.is_call_release_gil: # in this mode, RSHADOWOLD happens to contain the shadowstack # top at this point, so reuse it instead of loading it again - xxx ssreg = self.RSHADOWOLD self.asm._reload_frame_if_necessary(self.mc, shadowstack_reg=ssreg) @@ -153,8 +153,8 @@ RSHADOWPTR = self.RSHADOWPTR RFASTGILPTR = self.RFASTGILPTR # - # assumes RSHADOWOLD to be r9, stores all up to r15 - self.mc.STMG(RSHADOWOLD, r.r15, l.addr(9 * WORD, r.SP)) + self.mc.STMG(RSHADOWOLD, self.RFASTGILPTR, l.addr(-3*WORD, r.SP)) + self.subtracted_to_sp += 4*WORD # # Save this thread's shadowstack pointer into r29, for later comparison gcrootmap = self.asm.cpu.gc_ll_descr.gcrootmap @@ -169,13 +169,10 @@ self.mc.LGHI(r.SCRATCH, l.imm(0)) self.mc.STG(r.SCRATCH, l.addr(0, RFASTGILPTR)) self.mc.sync() # renders the store visible to other cpus - # - if not we_are_translated(): # for testing: we should not access - self.mc.AGHI(r.SPP, l.imm(1)) # r31 any more def move_real_result_and_call_reacqgil_addr(self, fastgil): - from rpython.jit.backend.zarch.codebuilder import InstrBuilder + from rpython.jit.backend.zarch.codebuilder import OverwritingBuilder # try to reacquire the lock. The following registers are still # valid from before the call: @@ -184,19 +181,19 @@ RSHADOWOLD = self.RSHADOWOLD # r12: previous val of root_stack_top # Equivalent of 'r14 = __sync_lock_test_and_set(&rpy_fastgil, 1);' - self.mc.LGHI(r.r11, l.imm(1)) - self.mc.LGHI(r.r14, l.imm(0)) + self.mc.LGHI(r.SCRATCH, l.imm(1)) retry_label = self.mc.currpos() # compare and swap, only succeeds if the the contents of the # lock is equal to r14 (= 0) - self.mc.CSG(r.r14, r.r11, l.addr(RFASTGILPTR)) # try to claim lock - self.mc.BRC(c.EQ, l.imm(retry_label - self.mc.currpos())) # retry if failed - #self.mc.sync() + self.mc.LG(r.r14, l.addr(0, RFASTGILPTR)) + self.mc.CSG(r.r14, r.SCRATCH, l.addr(0, RFASTGILPTR)) # try to claim lock + self.mc.BRC(c.NE, l.imm(retry_label - self.mc.currpos())) # retry if failed + self.mc.sync() - self.mc.cmpdi(0, r.r10.value, 0) + self.mc.CGHI(r.r14, l.imm0) b1_location = self.mc.currpos() - self.mc.trap() # boehm: patched with a BEQ: jump if r10 is zero - # shadowstack: patched with BNE instead + self.mc.trap() # boehm: patched with a BEQ: jump if r14 is zero + self.mc.write('\x00'*4) # shadowstack: patched with BNE instead if self.asm.cpu.gc_ll_descr.gcrootmap: # When doing a call_release_gil with shadowstack, there @@ -205,50 +202,50 @@ # thread. So here we check if the shadowstack pointer # is still the same as before we released the GIL (saved # in RSHADOWOLD), and if not, we fall back to 'reacqgil_addr'. - self.mc.load(r.r9.value, RSHADOWPTR.value, 0) - self.mc.cmpdi(0, r.r9.value, RSHADOWOLD.value) + self.mc.CGR(RSHADOWPTR, RSHADOWOLD) bne_location = b1_location b1_location = self.mc.currpos() self.mc.trap() + self.mc.write('\x00'*4) # revert the rpy_fastgil acquired above, so that the # general 'reacqgil_addr' below can acquire it again... - # (here, r10 is conveniently zero) - self.mc.std(r.r10.value, RFASTGILPTR.value, 0) + # (here, r14 is conveniently zero) + self.mc.STG(r.r14, l.addr(0,RFASTGILPTR)) - pmc = InstrBuilder(self.mc, bne_location, 1) - xxx - pmc.BCR(l.imm(0xf), self.mc.currpos() - bne_location) + pmc = OverwritingBuilder(self.mc, bne_location, 1) + pmc.BCRL(c.NE, self.mc.currpos() - bne_location) pmc.overwrite() # # Yes, we need to call the reacqgil() function. # save the result we just got RSAVEDRES = RFASTGILPTR # can reuse this reg here reg = self.resloc - xxx PARAM_SAVE_AREA_OFFSET = 0 if reg is not None: if reg.is_core_reg(): - self.mc.mr(RSAVEDRES.value, reg.value) + self.mc.LGR(RSAVEDRES, reg) elif reg.is_fp_reg(): + xxx self.mc.stfd(reg.value, r.SP.value, PARAM_SAVE_AREA_OFFSET + 7 * WORD) self.mc.load_imm(self.mc.RAW_CALL_REG, self.asm.reacqgil_addr) self.mc.raw_call() if reg is not None: if reg.is_core_reg(): - self.mc.mr(reg.value, RSAVEDRES.value) + self.mc.LGR(reg, RSAVEDRES) elif reg.is_fp_reg(): + xxx self.mc.lfd(reg.value, r.SP.value, PARAM_SAVE_AREA_OFFSET + 7 * WORD) # replace b1_location with BEQ(here) pmc = OverwritingBuilder(self.mc, b1_location, 1) - pmc.beq(self.mc.currpos() - b1_location) + pmc.BRCL(c.EQ, l.imm(self.mc.currpos() - b1_location)) pmc.overwrite() - if not we_are_translated(): # for testing: now we can access - self.mc.addi(r.SPP.value, r.SPP.value, -1) # r31 again + # restore the values that might have been overwritten + self.mc.LMG(RSHADOWOLD, RFASTGILPTR, l.addr(-3*WORD, r.SP)) def write_real_errno(self, save_err): @@ -261,16 +258,14 @@ else: rpy_errno = llerrno.get_rpy_errno_offset(self.asm.cpu) p_errno = llerrno.get_p_errno_offset(self.asm.cpu) - self.mc.LG(r.r11, - l.addr(THREADLOCAL_ADDR_OFFSET + self.subtracted_to_sp, r.SP)) + self.mc.LG(r.r11, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP)) self.mc.LGH(r.SCRATCH2, l.addr(rpy_errno, r.r11)) self.mc.LG(r.r11, l.addr(p_errno, r.r11)) self.mc.STHY(r.SCRATCH2, l.addr(0,r.r11)) elif save_err & rffi.RFFI_ZERO_ERRNO_BEFORE: # Same, but write zero. p_errno = llerrno.get_p_errno_offset(self.asm.cpu) - self.mc.LG(r.r11, - l.addr(THREADLOCAL_ADDR_OFFSET + self.subtracted_to_sp, r.SP)) + self.mc.LG(r.r11, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP)) self.mc.LG(r.r11, l.addr(p_errno, r.r11)) self.mc.LGHI(r.SCRATCH, 0) self.mc.STHY(r.SCRATCH, l.addr(0,r.r11)) diff --git a/rpython/jit/backend/zarch/instructions.py b/rpython/jit/backend/zarch/instructions.py --- a/rpython/jit/backend/zarch/instructions.py +++ b/rpython/jit/backend/zarch/instructions.py @@ -42,7 +42,9 @@ # rotating # rotate, then insert selected bits # on the VM the miscellaneous-instruction-extensions - # does not seem to be installed, sad but true... + # does not seem to be installed + # cpu fails at this instruction, and gnu assembler + # does not recognize mnemonic # 'RISBGN': ('rie_f', ['\xEC','\x59']), # invert & negative & absolute @@ -72,6 +74,9 @@ 'CGIB': ('ris', ['\xEC','\xFC']), 'CGRJ': ('rie_b', ['\xEC','\x64']), 'CLGRJ': ('rie_b', ['\xEC','\x65']), + # compare and swap + 'CSG': ('rsy_a', ['\xEB','\x30']), + } logic_mnemonic_codes = { @@ -232,7 +237,7 @@ 'DIEBR': ('rrf_b', ['\xB3','\x53'], 'r,r,r,m'), 'DIDBR': ('rrf_b', ['\xB3','\x5B'], 'r,r,r,m'), - # COMPARISON + # compare 'CEBR': ('rre', ['\xB3','\x09']), 'CDBR': ('rre', ['\xB3','\x19']), 'CEB': ('rxe', ['\xED','\x09'], 'r,bidl,-'), _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit