From d6d2b2e7563eebea88620dbc67f361523b47cc68 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Mon, 28 Nov 2022 18:57:52 +0100 Subject: Changed how mmap with MAP_32BITS flag is handled (help deadcells, maybe some others) --- src/custommem.c | 39 +++++++++++++++++++++++---------------- src/include/custommem.h | 2 +- src/wrapped/wrappedlibc.c | 4 ++-- 3 files changed, 26 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index d8d2d768..3b31b326 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1324,23 +1324,14 @@ uint32_t getProtection(uintptr_t addr) } #define LOWEST (void*)0x10000 -void* find32bitBlock(size_t size) -{ - return findBlockNearHint(LOWEST, size); -} -void* find47bitBlock(size_t size) -{ - void* ret = find47bitBlockNearHint((void*)0x100000000LL, size); - if(!ret) - ret = find32bitBlock(size); - return ret; -} -void* find47bitBlockNearHint(void* hint, size_t size) +#define MEDIUM (void*)0x20000000 + +void* find31bitBlockNearHint(void* hint, size_t size) { mapmem_t* m = mapmem; uintptr_t h = (uintptr_t)hint; if(hintend<0x800000000000LL) { + while(m && m->end<0x80000000LL) { // granularity 0x10000 uintptr_t addr = (m->end+1+0xffff)&~0xffff; uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL; @@ -1353,12 +1344,28 @@ void* find47bitBlockNearHint(void* hint, size_t size) } return NULL; } -void* findBlockNearHint(void* hint, size_t size) + +void* find32bitBlock(size_t size) +{ + void* ret = find31bitBlockNearHint(MEDIUM, size); + if(ret) + return ret; + ret = find31bitBlockNearHint(LOWEST, size); + return ret?ret:find47bitBlock(size); +} +void* find47bitBlock(size_t size) +{ + void* ret = find47bitBlockNearHint((void*)0x100000000LL, size); + if(!ret) + ret = find32bitBlock(size); + return ret; +} +void* find47bitBlockNearHint(void* hint, size_t size) { mapmem_t* m = mapmem; uintptr_t h = (uintptr_t)hint; if(hintend<0x100000000LL) { + while(m && m->end<0x800000000000LL) { // granularity 0x10000 uintptr_t addr = (m->end+1+0xffff)&~0xffff; uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL; @@ -1369,7 +1376,7 @@ void* findBlockNearHint(void* hint, size_t size) return (void*)addr; m = m->next; } - return hint; + return NULL; } int unlockCustommemMutex() diff --git a/src/include/custommem.h b/src/include/custommem.h index a33e1377..42f75a89 100644 --- a/src/include/custommem.h +++ b/src/include/custommem.h @@ -55,7 +55,7 @@ int AreaInHotPage(uintptr_t start, uintptr_t end); void AddHotPage(uintptr_t addr); #endif void* find32bitBlock(size_t size); -void* findBlockNearHint(void* hint, size_t size); +void* find31bitBlockNearHint(void* hint, size_t size); void* find47bitBlock(size_t size); void* find47bitBlockNearHint(void* hint, size_t size); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 6d7169bb..cc0a5de8 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2360,7 +2360,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot if(flags&0x40) { // 0x40 is MAP_32BIT, wich only exist on x86_64! //flags &= ~0x40; // let the flags in? - addr = findBlockNearHint(addr, length); + addr = find31bitBlockNearHint(addr, length); } else if (box64_wine || 1) { // other mmap should be restricted to 47bits if(!addr) addr = find47bitBlock(length); @@ -2373,7 +2373,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot 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(old_addr, length); // is this the best way? + addr = find31bitBlockNearHint(old_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) && (box64_wine) && (old_addr) && (addr!=ret) && -- cgit 1.4.1