about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-06 15:23:15 +0100
committerptitSeb <sebastien.chev@gmail.com>2022-03-06 15:23:15 +0100
commitd2cb088918b139ece64d3d7eab670a560e236d80 (patch)
tree23c9ba7c14a721c2ce65fcf0410662616961cba1
parent6ca94b9f3fb369187af66425f33c8c6d498a3b8f (diff)
downloadbox64-d2cb088918b139ece64d3d7eab670a560e236d80.tar.gz
box64-d2cb088918b139ece64d3d7eab670a560e236d80.zip
Change on mmap to help some stagging version of wine
-rw-r--r--src/custommem.c12
-rwxr-xr-xsrc/main.c3
-rwxr-xr-xsrc/wrapped/wrappedlibc.c6
3 files changed, 13 insertions, 8 deletions
diff --git a/src/custommem.c b/src/custommem.c
index 5b399344..359725ea 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -1016,7 +1016,7 @@ uint32_t getProtection(uintptr_t addr)
 }
 
 #define LOWEST (void*)0x20000
-static uintptr_t nextFree(uintptr_t addr)
+static uintptr_t nextFree(uintptr_t addr, uintptr_t increment)
 {
     if(addr>=(1LL<<48))
         return 0;
@@ -1029,7 +1029,7 @@ static uintptr_t nextFree(uintptr_t addr)
             if(!memprot[idx>>16][i]) {
                 return ((idx>>16)<<(16+12))+(i<<MEMPROT_SHIFT);
             }
-        addr += (1LL<<(16+12));
+        addr += increment?increment:(1LL<<(16+12));
         addr &= ~((1LL<<(16+12)-1LL));
     } while(1);
 }
@@ -1065,7 +1065,7 @@ void* find47bitBlock(size_t size)
     // slow iterative search... Would need something better one day
     uintptr_t addr = 0x100000000LL;
     do {
-        addr = nextFree(addr);
+        addr = nextFree(addr, 0x10000);
         uintptr_t sz = maxFree(addr, size);
         if(sz>=size) {
             return (void*)addr;
@@ -1075,7 +1075,7 @@ void* find47bitBlock(size_t size)
     // search in 32bits as a backup
     addr = (uintptr_t)LOWEST;
     do {
-        addr = nextFree(addr);
+        addr = nextFree(addr, 0x10000);
         uintptr_t sz = maxFree(addr, size);
         if(sz>=size) {
             return (void*)addr;
@@ -1090,7 +1090,7 @@ void* find47bitBlockNearHint(void* hint, size_t size)
     // slow iterative search... Would need something better one day
     uintptr_t addr = (uintptr_t)hint;
     do {
-        addr = nextFree(addr);
+        addr = nextFree(addr, 0x10000);
         uintptr_t sz = maxFree(addr, size);
         if(sz>=size) {
             return (void*)addr;
@@ -1105,7 +1105,7 @@ void* findBlockNearHint(void* hint, size_t size)
     // slow iterative search... Would need something better one day
     uintptr_t addr = (uintptr_t)hint;
     do {
-        addr = nextFree(addr);
+        addr = nextFree(addr, 0x10000);
         uintptr_t sz = maxFree(addr, size);
         if(sz>=size) {
             return (void*)addr;
diff --git a/src/main.c b/src/main.c
index d344a1c9..da2abdf9 100755
--- a/src/main.c
+++ b/src/main.c
@@ -1054,6 +1054,9 @@ int main(int argc, const char **argv, const char **env) {
         prgname = prog;
     else
         ++prgname;
+    if(box64_wine) {
+        AddPath("libdl.so.2", &ld_preload, 0);
+    }
     // special case for dontstarve that use an old SDL2
     if(strstr(prgname, "dontstarve")) {
         printf_log(LOG_INFO, "Dontstarve* detected, forcing emulated SDL2\n");
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index e73e32cf..d53b1ced 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2198,14 +2198,16 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot
     #endif
     void* ret = mmap64(addr, length, prot, flags, fd, offset);
     #ifndef NOALIGN
-    if((ret!=(void*)-1) && (flags&0x40) && ((uintptr_t)ret>0xffffffff)) {
+    if((ret!=(void*)-1) && (flags&0x40) && 
+      (((uintptr_t)ret>0xffffffff) || (box64_wine && ((uintptr_t)ret&~0xffff!=(uintptr_t)ret)))) {
         printf_log(LOG_DEBUG, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret);
         munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously
         addr = findBlockNearHint(addr, length); // is this the best way?
         ret = mmap64(addr, length, prot, flags, fd, offset);
         printf_log(LOG_DEBUG, " tried again with %p, got %p\n", addr, ret);
-    } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && ((uintptr_t)ret>0x7fffffffffffLL)) {
+    } else if((ret!=(void*)-1) && ((flags&MAP_FIXED)==0) && (box64_wine) && 
+             (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff!=(uintptr_t)ret))) {
         printf_log(LOG_DEBUG, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret);
         munmap(ret, length);
         loadProtectionFromMap();    // reload map, because something went wrong previously