diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-06 15:23:15 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-06 15:23:15 +0100 |
| commit | d2cb088918b139ece64d3d7eab670a560e236d80 (patch) | |
| tree | 23c9ba7c14a721c2ce65fcf0410662616961cba1 | |
| parent | 6ca94b9f3fb369187af66425f33c8c6d498a3b8f (diff) | |
| download | box64-d2cb088918b139ece64d3d7eab670a560e236d80.tar.gz box64-d2cb088918b139ece64d3d7eab670a560e236d80.zip | |
Change on mmap to help some stagging version of wine
| -rw-r--r-- | src/custommem.c | 12 | ||||
| -rwxr-xr-x | src/main.c | 3 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 6 |
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 |