[pypy-commit] pypy asmmemmgr-for-code-only: Fix more W^X.

vext01 pypy.commits at gmail.com
Wed Aug 31 11:15:36 EDT 2016


Author: Edd Barrett <vext01 at gmail.com>
Branch: asmmemmgr-for-code-only
Changeset: r86783:0b20f17103f9
Date: 2016-08-31 16:15 +0100
http://bitbucket.org/pypy/pypy/changeset/0b20f17103f9/

Log:	Fix more W^X.

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
@@ -15,11 +15,15 @@
     obj = llmemory.cast_adr_to_ptr(obj_addr, lltype.Ptr(GCREFTRACER))
     i = 0
     length = obj.array_length
+    length_bytes = length * WORD
     addr = obj.array_base_addr
+    addr_p = rffi.cast(rffi.CCHARP, addr)
+    set_pages_writable(addr_p, length_bytes)
     while i < length:
         p = rffi.cast(llmemory.Address, addr + i * WORD)
         gc._trace_callback(callback, arg, p)
         i += 1
+    set_pages_executable(addr_p, length_bytes)
 lambda_gcrefs_trace = lambda: gcrefs_trace
 
 def make_framework_tracer(array_base_addr, gcrefs):
@@ -34,12 +38,13 @@
     tr.array_length = length
     i = 0
     array_base_addr_p = rffi.cast(rffi.CCHARP, array_base_addr)
-    rmmap.set_pages_writable(array_base_addr_p, length)
+    length_bytes = length * WORD
+    rmmap.set_pages_writable(array_base_addr_p, length_bytes)
     while i < length:
         p = rffi.cast(rffi.SIGNEDP, array_base_addr + i * WORD)
         p[0] = rffi.cast(lltype.Signed, gcrefs[i])
         i += 1
-    rmmap.set_pages_executable(array_base_addr_p, length)
+    rmmap.set_pages_executable(array_base_addr_p, length_bytes)
     llop.gc_writebarrier(lltype.Void, tr)
     # --no GC until here--
     return tr
diff --git a/rpython/rlib/rmmap.py b/rpython/rlib/rmmap.py
--- a/rpython/rlib/rmmap.py
+++ b/rpython/rlib/rmmap.py
@@ -746,6 +746,7 @@
     def set_pages_executable(addr, size):
         assert lltype.typeOf(addr) == rffi.CCHARP
         assert isinstance(size, int)
+        #assert size >= 0
         rv = mprotect(addr, size, PROT_EXEC | PROT_READ)
         if int(rv) < 0:
             from rpython.rlib import debug
@@ -754,6 +755,7 @@
     def set_pages_writable(addr, size):
         assert lltype.typeOf(addr) == rffi.CCHARP
         assert isinstance(size, int)
+        #assert size >= 0
         rv = mprotect(addr, size, PROT_WRITE | PROT_READ)
         if int(rv) < 0:
             from rpython.rlib import debug


More information about the pypy-commit mailing list