Author: Edd Barrett <vex...@gmail.com> Branch: asmmemmgr-for-code-only Changeset: r86511:c7822af728c9 Date: 2016-08-24 23:48 +0100 http://bitbucket.org/pypy/pypy/changeset/c7822af728c9/
Log: Fix a load of W^X violations touched in the x86 backend tests. diff --git a/rpython/jit/backend/llsupport/asmmemmgr.py b/rpython/jit/backend/llsupport/asmmemmgr.py --- a/rpython/jit/backend/llsupport/asmmemmgr.py +++ b/rpython/jit/backend/llsupport/asmmemmgr.py @@ -230,8 +230,11 @@ targetindex = self._baserelpos while targetindex >= 0: dst = rffi.cast(rffi.CCHARP, addr + targetindex) + # XXX see if we can move the page fiddling out the loop + rmmap.set_pages_writable(dst, blocksize) for j in range(blocksize): dst[j] = block.data[j] + rmmap.set_pages_executable(dst, blocksize) block = block.prev blocksize = self.SUBBLOCK_SIZE targetindex -= self.SUBBLOCK_SIZE diff --git a/rpython/jit/backend/llsupport/gcreftracer.py b/rpython/jit/backend/llsupport/gcreftracer.py --- a/rpython/jit/backend/llsupport/gcreftracer.py +++ b/rpython/jit/backend/llsupport/gcreftracer.py @@ -2,6 +2,7 @@ from rpython.rtyper.lltypesystem import lltype, llmemory, rffi from rpython.rtyper.lltypesystem.lloperation import llop from rpython.jit.backend.llsupport.symbolic import WORD +from rpython.rlib.rmmap import set_pages_executable, set_pages_writable GCREFTRACER = lltype.GcStruct( @@ -43,7 +44,10 @@ def make_boehm_tracer(array_base_addr, gcrefs): # copy the addresses, but return 'gcrefs' as the object that must be # kept alive - for i in range(len(gcrefs)): + n_gcrefs = len(gcrefs) + set_pages_writable(array_base_addr, n_gcrefs * WORD) + for i in range(n_gcrefs): p = rffi.cast(rffi.SIGNEDP, array_base_addr + i * WORD) p[0] = rffi.cast(lltype.Signed, gcrefs[i]) + set_pages_executable(array_base_addr, n_gcrefs * WORD) return gcrefs diff --git a/rpython/jit/backend/x86/codebuf.py b/rpython/jit/backend/x86/codebuf.py --- a/rpython/jit/backend/x86/codebuf.py +++ b/rpython/jit/backend/x86/codebuf.py @@ -7,6 +7,7 @@ from rpython.jit.backend.x86.regloc import LocationCodeBuilder from rpython.jit.backend.x86.arch import IS_X86_32, IS_X86_64, WORD from rpython.jit.backend.x86 import valgrind +from rpython.rlib.rmmap import set_pages_writable, set_pages_executable # XXX: Seems nasty to change the superclass of MachineCodeBlockWrapper # like this @@ -51,5 +52,6 @@ p = addr + reloc adr = rffi.cast(rffi.INTP, p - 4) adr[0] = rffi.cast(rffi.INT, intmask(adr[0]) - p) + valgrind.discard_translations(addr, self.get_relative_pos()) self._dump(addr, "jit-backend-dump", backend_name) diff --git a/rpython/jit/backend/x86/detect_feature.py b/rpython/jit/backend/x86/detect_feature.py --- a/rpython/jit/backend/x86/detect_feature.py +++ b/rpython/jit/backend/x86/detect_feature.py @@ -1,17 +1,23 @@ import sys import struct from rpython.rtyper.lltypesystem import lltype, rffi -from rpython.rlib.rmmap import alloc, free +from rpython.rlib.rmmap import (alloc, free, set_pages_writable, + set_pages_executable) + +CPUINFO_ALLOC_SZ = 4096 + def cpu_info(instr): - data = alloc(4096) + data = alloc(CPUINFO_ALLOC_SZ) pos = 0 + set_pages_writable(data, CPUINFO_ALLOC_SZ) for c in instr: data[pos] = c pos += 1 + set_pages_executable(data, CPUINFO_ALLOC_SZ) fnptr = rffi.cast(lltype.Ptr(lltype.FuncType([], lltype.Signed)), data) code = fnptr() - free(data, 4096) + free(data, CPUINFO_ALLOC_SZ) return code def detect_sse2(): diff --git a/rpython/jit/backend/x86/test/test_regloc.py b/rpython/jit/backend/x86/test/test_regloc.py --- a/rpython/jit/backend/x86/test/test_regloc.py +++ b/rpython/jit/backend/x86/test/test_regloc.py @@ -7,6 +7,7 @@ from rpython.jit.backend.x86 import codebuf from rpython.jit.backend.x86.callbuilder import follow_jump from rpython.rlib.rarithmetic import intmask +from rpython.rlib import rmmap import py.test class LocationCodeBuilder32(CodeBuilder32, LocationCodeBuilder): @@ -78,7 +79,7 @@ mc = codebuf.MachineCodeBlockWrapper() mc.CALL(ImmedLoc(target)) length = mc.get_relative_pos() - buf = lltype.malloc(rffi.CCHARP.TO, length, flavor='raw') + buf = rmmap.alloc(length) rawstart = rffi.cast(lltype.Signed, buf) if IS_X86_32: assert length == 5 @@ -103,17 +104,18 @@ "\x41\xFF\xD3") # CALL *%r11 mc.copy_to_raw_memory(rawstart) assert ''.join([buf[i] for i in range(length)]) == expected - lltype.free(buf, flavor='raw') + rmmap.free(buf, length) class Fake32CodeBlockWrapper(codebuf.MachineCodeBlockWrapper): def check_stack_size_at_ret(self): pass def test_follow_jump_instructions_32(): - buf = lltype.malloc(rffi.CCHARP.TO, 80, flavor='raw') + size = 80 + buf = rmmap.alloc(size) raw = rffi.cast(lltype.Signed, buf) if not fits_in_32bits(raw): - lltype.free(buf, flavor='raw') + rmmap.free(buf, size) py.test.skip("not testable") mc = Fake32CodeBlockWrapper(); mc.WORD = 4; mc.relocations = [] mc.RET() @@ -137,7 +139,7 @@ assert buf[43] == '\xFF' assert buf[44] == '\xFF' assert follow_jump(raw + 40) == raw - lltype.free(buf, flavor='raw') + rmmap.free(buf) class Test64Bits: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit