about summary refs log tree commit diff stats
path: root/src/wrapped
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-07 09:25:04 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-07 09:25:04 +0200
commitf81677278f6bbe387e20f7b9f642f8dcbef12387 (patch)
tree36b13e609477329ba3736f27931c408eb1f0f486 /src/wrapped
parent2ef6011c7aebe44870795e1faaae9dde462cb7af (diff)
downloadbox64-f81677278f6bbe387e20f7b9f642f8dcbef12387.tar.gz
box64-f81677278f6bbe387e20f7b9f642f8dcbef12387.zip
Reworked mmap allocator and wine prereserve handling ([BOX32] fix handling of wine prereserve)
Diffstat (limited to 'src/wrapped')
-rw-r--r--src/wrapped/wrappedlibc.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 1482d9d9..db57e446 100644
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2928,9 +2928,10 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, size_t length, int prot, int f
     new_flags&=~MAP_32BIT;   // remove MAP_32BIT
     if((flags&MAP_32BIT) && !(flags&MAP_FIXED)) {
         // MAP_32BIT only exist on x86_64!
-        addr = find31bitBlockNearHint(old_addr, length, 0);
+        if(!(flags&MAP_FIXED) && (!old_addr || !isBlockFree(old_addr, length)))
+            addr = find31bitBlockNearHint(old_addr, length, 0);
     } else if (box64_wine || 1) {   // other mmap should be restricted to 47bits
-        if(!addr)
+        if(!(flags&MAP_FIXED) && (!addr || !isBlockFree(addr, length)))
             addr = find47bitBlock(length);
     }
     #endif
@@ -2972,7 +2973,8 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, size_t length, int prot, int f
         errno = EEXIST;
         return MAP_FAILED;
     }
-    if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
+    if((ret==MAP_FAILED && (emu || box64_is32bits)) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%s (%d)\n", strerror(errno), errno);}
+    if(((ret!=MAP_FAILED) && (emu || box64_is32bits)) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);}
     #ifdef DYNAREC
     if(box64_dynarec && ret!=MAP_FAILED) {
         /*if(flags&0x100000 && addr!=ret)