about summary refs log tree commit diff stats
path: root/src/wrapped
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-05-28 09:39:26 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-05-28 09:39:26 +0200
commit0b67bba12111bad3bdc7abc83d82e7016efb97ec (patch)
treeafae06a6dd18028d3f523c8c8a0acc41e2f38992 /src/wrapped
parenta791677534315fb4c7708db907605ed61cb8b239 (diff)
downloadbox64-0b67bba12111bad3bdc7abc83d82e7016efb97ec.tar.gz
box64-0b67bba12111bad3bdc7abc83d82e7016efb97ec.zip
[DYNAREC] Do not track memory that is not accessible (should save some memory)
Diffstat (limited to 'src/wrapped')
-rwxr-xr-xsrc/wrapped/wrappedlibc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 6052d964..d0792d3c 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2595,7 +2595,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne
     uint32_t prot = getProtection((uintptr_t)old_addr)&~PROT_CUSTOM;
     if(ret==old_addr) {
         if(old_size && old_size<new_size) {
-            setProtection((uintptr_t)ret+old_size, new_size-old_size, prot);
+            setProtection_mmap((uintptr_t)ret+old_size, new_size-old_size, prot);
             #ifdef DYNAREC
             if(box64_dynarec)
                 addDBFromAddressRange((uintptr_t)ret+old_size, new_size-old_size);
@@ -2607,7 +2607,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne
                 cleanDBFromAddressRange((uintptr_t)ret+new_size, old_size-new_size, 1);
             #endif
         } else if(!old_size) {
-            setProtection((uintptr_t)ret, new_size, prot);
+            setProtection_mmap((uintptr_t)ret, new_size, prot);
             #ifdef DYNAREC
             if(box64_dynarec)
                 addDBFromAddressRange((uintptr_t)ret, new_size);
@@ -2665,8 +2665,15 @@ EXPORT int my_mprotect(x64emu_t* emu, void *addr, unsigned long len, int prot)
             cleanDBFromAddressRange((uintptr_t)addr, len, 1);
     }
     #endif
-    if(!ret && len)
-        updateProtection((uintptr_t)addr, len, prot);
+    if(!ret && len) {
+        if(prot)
+            updateProtection((uintptr_t)addr, len, prot);
+        else {
+            // avoid allocating detailled protection for a no prot 0
+            freeProtection((uintptr_t)addr, len);
+            setProtection_mmap((uintptr_t)addr, len, prot);
+        }
+    }
     return ret;
 }