From 128724d147a0079952275e1bbce48a7e2a0522ab Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Fri, 2 Apr 2021 13:38:23 +0200 Subject: Implemented a workaround for mmap64 with MAP_32BIT flag --- src/custommem.c | 35 +++++++++++++++++++++++++++++++++++ src/include/custommem.h | 3 +++ src/wrapped/wrappedlibc.c | 7 +++++++ 3 files changed, 45 insertions(+) (limited to 'src') diff --git a/src/custommem.c b/src/custommem.c index 956e67fd..d1921b83 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -803,6 +803,41 @@ uint32_t getProtection(uintptr_t addr) return ret; } +#ifndef NOALIGN +#define LOWEST (void*)0x20000 +int availableBlock(uint8_t* p, size_t n) +{ + for (int i=0; i>MEMPROT_SHIFT; + do { + const uintptr_t idx = ((((uintptr_t)p)&0xffffffff)>>MEMPROT_SHIFT); + if(availableBlock(prot+idx, pages)) + return p; + p += 0x10000; + } while(p!=(void*)0xffff0000); + return NULL; +} +#undef LOWEST +#endif + + void init_custommem_helper(box64context_t* ctx) { if(inited) // already initialized diff --git a/src/include/custommem.h b/src/include/custommem.h index c1de067f..551063d1 100644 --- a/src/include/custommem.h +++ b/src/include/custommem.h @@ -45,6 +45,9 @@ void unprotectDB(uintptr_t addr, uintptr_t size); void lockDB(); void unlockDB(); #endif +#ifndef NOALIGN +void* find32bitBlock(size_t size); +#endif void init_custommem_helper(box64context_t* ctx); diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 756a8ee8..fa021802 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -1887,6 +1887,13 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot if(prot&PROT_WRITE) prot|=PROT_READ; // PROT_READ is implicit with PROT_WRITE on i386 if(box64_log", addr, length, prot, flags, fd, offset);} + #ifndef NOALIGN + if(!addr && (flags&0x40)) { + // 0x40 is MAP_32BIT, wich only exist on x86_64! + //flags &= ~0x40; // let the flags in? + addr = find32bitBlock(length); + } + #endif void* ret = mmap64(addr, length, prot, flags, fd, offset); if(box64_log