about summary refs log tree commit diff stats
path: root/src/tools
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/tools
parentf1abd95ed06e42bf67dd267ddbf506b8b59c399b (diff)
downloadbox64-33381857ff133918a56e3afdded4ac5eefff9f9d.tar.gz
box64-33381857ff133918a56e3afdded4ac5eefff9f9d.zip
Change (again) how Wine prereserved memory is allocated and freed
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/wine_tools.c21
1 files changed, 19 insertions, 2 deletions
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()
 {