about summary refs log tree commit diff stats
path: root/src
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
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')
-rw-r--r--src/custommem.c8
-rwxr-xr-xsrc/wrapped/wrappedlibc.c15
2 files changed, 18 insertions, 5 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 8d7925ab..6cb7cedb 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1100,7 +1100,13 @@ void setProtection(uintptr_t addr, size_t size, uint32_t prot)
 
 void setProtection_mmap(uintptr_t addr, size_t size, uint32_t prot)
 {
-    setProtection(addr, size, prot|PROT_MMAP);
+    if(prot)
+        setProtection(addr, size, prot|PROT_MMAP);
+    else {
+        mutex_lock(&mutex_prot);
+        addMapMem(addr, addr+size-1);
+        mutex_unlock(&mutex_prot);
+    }
 }
 
 void refreshProtection(uintptr_t addr)
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;
 }