about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-07-16 22:53:36 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-07-16 22:53:47 +0200
commit33381857ff133918a56e3afdded4ac5eefff9f9d (patch)
tree2b7f0f13b89451735815ebbdbf0b26f25be7f536 /src
parentf1abd95ed06e42bf67dd267ddbf506b8b59c399b (diff)
downloadbox64-33381857ff133918a56e3afdded4ac5eefff9f9d.tar.gz
box64-33381857ff133918a56e3afdded4ac5eefff9f9d.zip
Change (again) how Wine prereserved memory is allocated and freed
Diffstat (limited to 'src')
-rw-r--r--src/custommem.c7
-rw-r--r--src/tools/wine_tools.c21
2 files changed, 24 insertions, 4 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 3f650485..84265816 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1338,14 +1338,17 @@ void loadProtectionFromMap()
     box64_mapclean = 1;
 }
 
+int isAddrInPrereserve(uintptr_t addr);
 void freeProtection(uintptr_t addr, size_t size)
 {
     size = ALIGN(size);
     addr &= ~(box64_pagesize-1);
     dynarec_log(LOG_DEBUG, "freeProtection %p:%p\n", (void*)addr, (void*)(addr+size-1));
     LOCK_PROT();
-    rb_unset(mapallmem, addr, addr+size);
-    rb_unset(mmapmem, addr, addr+size);
+    if(!isAddrInPrereserve(addr)) {
+        rb_unset(mapallmem, addr, addr+size);
+        rb_unset(mmapmem, addr, addr+size);
+    }
     rb_unset(memprot, addr, addr+size);
     UNLOCK_PROT();
 }
diff --git a/src/tools/wine_tools.c b/src/tools/wine_tools.c
index 0933325f..1716823b 100644
--- a/src/tools/wine_tools.c
+++ b/src/tools/wine_tools.c
@@ -69,13 +69,16 @@ void wine_prereserve(const char* reserve)
 
     int idx = 0;
     while(my_wine_reserve[idx].addr && my_wine_reserve[idx].size) {
-        if(!isBlockFree(my_wine_reserve[idx].addr, my_wine_reserve[idx].size)) {
+        void* ret = NULL;
+        if(!isBlockFree(my_wine_reserve[idx].addr, my_wine_reserve[idx].size) && ((ret=mmap(my_wine_reserve[idx].addr, my_wine_reserve[idx].size, 0, MAP_ANONYMOUS|MAP_NORESERVE, -1, 0))==my_wine_reserve[idx].addr)) {
             printf_log(LOG_NONE, "Warning, prereserve of %p:0x%lx is not free\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size);
+            if(ret)
+                munmap(ret, my_wine_reserve[idx].size);
             my_wine_reserve[idx].addr = NULL;
             my_wine_reserve[idx].size = 0;
         } else {
             setProtection_mmap((uintptr_t)my_wine_reserve[idx].addr, my_wine_reserve[idx].size, 0);
-            printf_log(LOG_DEBUG, "WINE prereserve of %p:0x%lx done\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size);
+            printf_log(/*LOG_DEBUG*/LOG_INFO, "WINE prereserve of %p:0x%lx done\n", my_wine_reserve[idx].addr, my_wine_reserve[idx].size);
             ++idx;
         }
     }
@@ -90,6 +93,20 @@ void* get_wine_prereserve()
     return (void*)my_wine_reserve;
 }
 
+extern int box64_quit;
+int isAddrInPrereserve(uintptr_t addr)
+{
+    if(!wine_preloaded || box64_quit)
+        return 0;
+    int idx = 0;
+    while(my_wine_reserve[idx].addr && my_wine_reserve[idx].size) {
+        if(addr>=(uintptr_t)my_wine_reserve[idx].addr && addr<((uintptr_t)my_wine_reserve[idx].addr+my_wine_reserve[idx].size))
+            return 1;
+        ++idx;
+    }
+    return 0;
+}
+
 #ifdef DYNAREC
 void dynarec_wine_prereserve()
 {