Author: Edd Barrett <vex...@gmail.com>
Branch: asmmemmgr-for-code-only
Changeset: r86510:1425d9b5d850
Date: 2016-08-24 23:43 +0100
http://bitbucket.org/pypy/pypy/changeset/1425d9b5d850/

Log:    Allocate mmap pages with PROT_NONE and provide ability to use
        mprotect.

diff --git a/rpython/rlib/rmmap.py b/rpython/rlib/rmmap.py
--- a/rpython/rlib/rmmap.py
+++ b/rpython/rlib/rmmap.py
@@ -57,7 +57,7 @@
     # some constants are linux only so they will be correctly exposed outside
     # depending on the OS
     constant_names = ['MAP_SHARED', 'MAP_PRIVATE', 'MAP_FIXED',
-                      'PROT_READ', 'PROT_WRITE',
+                      'PROT_READ', 'PROT_WRITE', 'PROT_NONE',
                       'MS_SYNC']
     opt_constant_names = ['MAP_ANON', 'MAP_ANONYMOUS', 'MAP_NORESERVE',
                           'PROT_EXEC',
@@ -155,6 +155,10 @@
     c_mmap, c_mmap_safe = external('mmap', [PTR, size_t, rffi.INT, rffi.INT,
                                    rffi.INT, off_t], PTR, macro=True,
                                    save_err_on_unsafe=rffi.RFFI_SAVE_ERRNO)
+
+    _, c_mprotect_safe = external('mprotect', [PTR, size_t, rffi.INT],
+                                  rffi.INT, _nowrapper=True)
+
     # 'mmap' on linux32 is a macro that calls 'mmap64'
     _, c_munmap_safe = external('munmap', [PTR, size_t], rffi.INT)
     c_msync, _ = external('msync', [PTR, size_t, rffi.INT], rffi.INT,
@@ -172,6 +176,8 @@
     _get_allocation_granularity = _get_page_size = lambda: _pagesize
 
 elif _MS_WINDOWS:
+    # XXX mprotect equivalent
+    # XXX set_pages_executable/writable equivalent
 
     class ComplexCConfig:
         _compilation_info_ = CConfig._compilation_info_
@@ -707,12 +713,29 @@
 
     def alloc_hinted(hintp, map_size):
         flags = MAP_PRIVATE | MAP_ANONYMOUS
-        prot = PROT_EXEC | PROT_READ | PROT_WRITE
+        # Pages start with no permissions
+        prot = PROT_NONE
         if we_are_translated():
             flags = NonConstant(flags)
             prot = NonConstant(prot)
         return c_mmap_safe(hintp, map_size, prot, flags, -1, 0)
 
+    def mprotect(addr, size, prot):
+        addr = rffi.cast(PTR, addr)
+        size = rffi.cast(lltype.Unsigned, size)
+        prot = rffi.cast(rffi.INT, prot)
+        return c_mprotect_safe(addr, size, prot)
+
+    def set_pages_executable(addr, size):
+        rv = mprotect(addr, size, PROT_EXEC | PROT_READ)
+        if rv < 0:
+            debug.fatalerror_notb("set_pages_executable failed")
+
+    def set_pages_writable(addr, size):
+        rv = mprotect(addr, size, PROT_WRITE | PROT_READ)
+        if rv < 0:
+            debug.fatalerror_notb("set_pages_executable failed")
+
     def clear_large_memory_chunk_aligned(addr, map_size):
         addr = rffi.cast(PTR, addr)
         flags = MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to