diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-01 18:14:08 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-01 18:14:08 +0100 |
| commit | 107738f0f27493677c05fc7a8217aca7b673b5c9 (patch) | |
| tree | 471bd9cbf7c178497a4ca694e55f8581a87694c0 /src | |
| parent | 936fa20928ecaebf68826e1284bbf65e7b42e29c (diff) | |
| download | box64-107738f0f27493677c05fc7a8217aca7b673b5c9.tar.gz box64-107738f0f27493677c05fc7a8217aca7b673b5c9.zip | |
[ELFLOADER] Last improvment to elfloader memory managment, should be good now
Diffstat (limited to 'src')
| -rw-r--r-- | src/custommem.c | 18 | ||||
| -rw-r--r-- | src/elfs/elfloader.c | 1 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 7 |
3 files changed, 16 insertions, 10 deletions
diff --git a/src/custommem.c b/src/custommem.c index b85b2257..f72b83e4 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -1519,7 +1519,7 @@ int getMmapped(uintptr_t addr) } #define LOWEST (void*)0x10000 -#define MEDIUM (void*)0x20000000 +#define MEDIUM (void*)0x40000000 void* find31bitBlockNearHint(void* hint, size_t size) { @@ -1528,13 +1528,14 @@ void* find31bitBlockNearHint(void* hint, size_t size) if(hint<LOWEST) hint = LOWEST; while(m && m->end<0x80000000LL) { // granularity 0x10000 - uintptr_t addr = (m->end+1+0xffff)&~0xffff; + uintptr_t addr = m->end+1; uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL; // check hint and available size if(addr<=h && end>=h && end-h+1>=size) return hint; - if(addr>=h && end-addr+1>=size) - return (void*)addr; + uintptr_t aaddr = (addr+0xffff)&~0xffff; + if(aaddr>=h && end>aaddr && end-aaddr+1>=size) + return (void*)aaddr; m = m->next; } return NULL; @@ -1562,13 +1563,14 @@ void* find47bitBlockNearHint(void* hint, size_t size) if(hint<LOWEST) hint = LOWEST; while(m && m->end<0x800000000000LL) { // granularity 0x10000 - uintptr_t addr = (m->end+1+0xffff)&~0xffff; + uintptr_t addr = m->end+1; uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL; // check hint and available size if(addr<=h && end>=h && end-h+1>=size) return hint; - if(addr>=h && end-addr+1>=size) - return (void*)addr; + uintptr_t aaddr = (addr+0xffff)&~0xffff; + if(aaddr>=h && end>aaddr && end-aaddr+1>=size) + return (void*)aaddr; m = m->next; } return NULL; @@ -1595,7 +1597,7 @@ int isBlockFree(void* hint, size_t size) if(h>0x800000000000LL) return 0; // no tracking there while(m && m->end<0x800000000000LL) { - uintptr_t addr = (m->end+1+0xffff)&~0xffff; + uintptr_t addr = m->end+1; uintptr_t end = (m->next)?(m->next->begin-1):0xffffffffffffffffLL; if(addr<=h && end>=h && end-h+1>=size) return 1; diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c index a398694b..d6fe2efb 100644 --- a/src/elfs/elfloader.c +++ b/src/elfs/elfloader.c @@ -257,6 +257,7 @@ int AllocLoadElfMemory(box64context_t* context, elfheader_t* head, int mainbin) return 1; } setProtection_mmap((uintptr_t)p, head->multiblocks[n].asize, prot); + head->multiblocks[n].p = p; if(e->p_filesz) { fseeko64(head->file, head->multiblocks[n].offs, SEEK_SET); if(fread((void*)head->multiblocks[n].paddr, head->multiblocks[n].size, 1, head->file)!=1) { diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index ce284a8d..cee5fecd 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2572,7 +2572,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot void* ret = mmap64(addr, length, prot, new_flags, fd, offset); #ifndef NOALIGN if((ret!=MAP_FAILED) && (flags&MAP_32BIT) && - (((uintptr_t)ret>0xffffffffLL) || (box64_wine && ((uintptr_t)ret&0xffff)))) { + (((uintptr_t)ret>0xffffffffLL) || (box64_wine && ((uintptr_t)ret&0xffff) && (ret!=addr)))) { 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 @@ -2614,7 +2614,10 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot } #endif if(ret!=MAP_FAILED) { - setProtection_mmap((uintptr_t)ret, length, prot); + if(emu) + setProtection_mmap((uintptr_t)ret, length, prot); + else + setProtection((uintptr_t)ret, length, prot); } return ret; } |