diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-07-16 22:53:36 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-07-16 22:53:47 +0200 |
| commit | 33381857ff133918a56e3afdded4ac5eefff9f9d (patch) | |
| tree | 2b7f0f13b89451735815ebbdbf0b26f25be7f536 /src | |
| parent | f1abd95ed06e42bf67dd267ddbf506b8b59c399b (diff) | |
| download | box64-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.c | 7 | ||||
| -rw-r--r-- | src/tools/wine_tools.c | 21 |
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() { |