diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-04 11:00:43 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-04 11:00:43 +0200 |
| commit | ee7b10f064326a657c13821d5f07cca41a45d4ae (patch) | |
| tree | 2a23b841dfb31ede19da428ec36bd99a8e56832c | |
| parent | c1ad6b5829af34e5ff93d5f89b08a007b1a88f2e (diff) | |
| download | box64-ee7b10f064326a657c13821d5f07cca41a45d4ae.tar.gz box64-ee7b10f064326a657c13821d5f07cca41a45d4ae.zip | |
[BOX32] Small improvments on memory management
| -rw-r--r-- | src/custommmap.c | 8 | ||||
| -rw-r--r-- | src/librarian/librarian.c | 4 | ||||
| -rw-r--r-- | src/librarian/library.c | 36 | ||||
| -rwxr-xr-x | src/libtools/threads32.c | 8 | ||||
| -rw-r--r-- | src/tools/box32stack.c | 2 | ||||
| -rw-r--r-- | src/tools/box64stack.c | 2 | ||||
| -rw-r--r-- | src/wrapped/wrappedlibc.c | 26 |
7 files changed, 47 insertions, 39 deletions
diff --git a/src/custommmap.c b/src/custommmap.c index 7ad26b7d..ab5288dd 100644 --- a/src/custommmap.c +++ b/src/custommmap.c @@ -13,6 +13,10 @@ #define EXPORTDYN #endif +#ifndef MAP_32BIT +#define MAP_32BIT 0x40 +#endif + typedef void x64emu_t; extern void* mapallmem; extern int box64_is32bits; @@ -29,8 +33,8 @@ extern int box64_mmap32; EXPORT void* mmap64(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset) { void* ret; - if(!addr && ((running32bits && box64_mmap32) || (flags&0x40) || box64_is32bits)) - ret = my_mmap64(NULL, addr, length, prot, flags | 0x40, fd, offset); + if(!addr && ((running32bits && box64_mmap32) || (flags&MAP_32BIT) || box64_is32bits)) + ret = my_mmap64(NULL, addr, length, prot, flags | MAP_32BIT, fd, offset); else ret = internal_mmap(addr, length, prot, flags, fd, offset); if(ret!=MAP_FAILED && mapallmem) diff --git a/src/librarian/librarian.c b/src/librarian/librarian.c index ddeb063b..aee6acf0 100644 --- a/src/librarian/librarian.c +++ b/src/librarian/librarian.c @@ -511,7 +511,7 @@ int GetGlobalSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* start, u if(GetGlobalSymbolStartEnd_internal(maplib, name, start, end, self, &version, &vername, &veropt, elfsym)) { if(start && end && *end==*start) { // object is of 0 sized, try to see an "_END" object of null size uintptr_t start2, end2; - char* buff = (char*)malloc(strlen(name) + strlen("_END") + 1); + char* buff = (char*)box_malloc(strlen(name) + strlen("_END") + 1); strcpy(buff, name); strcat(buff, "_END"); if(GetGlobalSymbolStartEnd_internal(maplib, buff, &start2, &end2, self, &version, &vername, &veropt, elfsym)) { @@ -584,7 +584,7 @@ int GetGlobalWeakSymbolStartEnd(lib_t *maplib, const char* name, uintptr_t* star if(GetGlobalWeakSymbolStartEnd_internal(maplib, name, start, end, self, &version, &vername, &veropt, elfsym)) { if(start && end && *end==*start) { // object is of 0 sized, try to see an "_END" object of null size uintptr_t start2, end2; - char* buff = (char*)malloc(strlen(name) + strlen("_END") + 1); + char* buff = (char*)box_malloc(strlen(name) + strlen("_END") + 1); strcpy(buff, name); strcat(buff, "_END"); if(GetGlobalWeakSymbolStartEnd_internal(maplib, buff, &start2, &end2, self, &version, &vername, &veropt, elfsym)) { diff --git a/src/librarian/library.c b/src/librarian/library.c index e4ab45e5..e21e648c 100644 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -452,7 +452,7 @@ library_t *NewLibrary(const char* path, box64context_t* context, elfheader_t* ve printf_dump(LOG_DEBUG, "Trying to load \"%s\"\n", path); //library_t *lib = (library_t*)box_calloc(1, sizeof(library_t)); if(cur_lib==lib_cap) { - lib_brick_t *new_brick = calloc(1, sizeof(lib_brick_t)); + lib_brick_t *new_brick = box_calloc(1, sizeof(lib_brick_t)); if(!lib_head) cur_brick = lib_head = new_brick; else { @@ -1211,23 +1211,23 @@ void AddMainElfToLinkmap(elfheader_t* elf) needed_libs_t* new_neededlib(int n) { - needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t)); + needed_libs_t* ret = (needed_libs_t*)box_calloc(1, sizeof(needed_libs_t)); ret->cap = ret->size = n; ret->init_size = n; - ret->libs = (library_t**)calloc(n, sizeof(library_t*)); - ret->names = (char**)calloc(n, sizeof(char*)); + ret->libs = (library_t**)box_calloc(n, sizeof(library_t*)); + ret->names = (char**)box_calloc(n, sizeof(char*)); return ret; } void free_neededlib(needed_libs_t* needed) { if(!needed) return; - free(needed->libs); - free(needed->names); + box_free(needed->libs); + box_free(needed->names); needed->libs = NULL; needed->names = NULL; needed->cap = needed->size = 0; - free(needed); + box_free(needed); } void add1_neededlib(needed_libs_t* needed) { @@ -1236,8 +1236,8 @@ void add1_neededlib(needed_libs_t* needed) if(needed->size+1<=needed->cap) return; needed->cap = needed->size+1; - needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*)); - needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*)); + needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*)); + needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*)); needed->size++; needed->init_size++; } @@ -1252,8 +1252,8 @@ void add1lib_neededlib(needed_libs_t* needed, library_t* lib, const char* name) // add it if(needed->size==needed->cap) { needed->cap = needed->size+1; - needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*)); - needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*)); + needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*)); + needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*)); } needed->libs[needed->size] = lib; needed->names[needed->size] = (char*)name; @@ -1271,8 +1271,8 @@ void add1lib_neededlib_name(needed_libs_t* needed, library_t* lib, const char* n // add it if(needed->size==needed->cap) { needed->cap = needed->size+1; - needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*)); - needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*)); + needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*)); + needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*)); } needed->libs[needed->size] = lib; needed->names[needed->size] = (char*)name; @@ -1290,8 +1290,8 @@ void add1libref_neededlib(needed_libs_t* needed, library_t* lib) // add it if(needed->size==needed->cap) { needed->cap = needed->size+4; - needed->libs = (library_t**)realloc(needed->libs, needed->cap*sizeof(library_t*)); - needed->names = (char**)realloc(needed->names, needed->cap*sizeof(char*)); + needed->libs = (library_t**)box_realloc(needed->libs, needed->cap*sizeof(library_t*)); + needed->names = (char**)box_realloc(needed->names, needed->cap*sizeof(char*)); } needed->libs[needed->size] = lib; needed->names[needed->size] = (char*)lib->name; @@ -1302,12 +1302,12 @@ needed_libs_t* copy_neededlib(needed_libs_t* needed) { if(!needed) return NULL; - needed_libs_t* ret = (needed_libs_t*)calloc(1, sizeof(needed_libs_t)); + needed_libs_t* ret = (needed_libs_t*)box_calloc(1, sizeof(needed_libs_t)); ret->cap = needed->cap; ret->size = needed->size; ret->init_size = needed->init_size; - ret->libs = (library_t**)calloc(ret->cap, sizeof(library_t*)); - ret->names = (char**)calloc(ret->cap, sizeof(char*)); + ret->libs = (library_t**)box_calloc(ret->cap, sizeof(library_t*)); + ret->names = (char**)box_calloc(ret->cap, sizeof(char*)); memcpy(ret->libs, needed->libs, ret->size*sizeof(library_t*)); memcpy(ret->names, needed->names, ret->size*sizeof(char*)); return ret; diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c index d99a085e..bd437633 100755 --- a/src/libtools/threads32.c +++ b/src/libtools/threads32.c @@ -29,6 +29,10 @@ #include "dynablock.h" #endif +#ifndef MAP_32BIT +#define MAP_32BIT 0x40 +#endif + typedef void (*vFppp_t)(void*, void*, void*); typedef void (*vFpi_t)(void*, int); //starting with glibc 2.34+, those 2 functions are in libc.so as versionned symbol only @@ -205,7 +209,7 @@ EXPORT int my32_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_r own = 0; } else { //stack = malloc(stacksize); - stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); + stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_32BIT, -1, 0); own = 1; } @@ -250,7 +254,7 @@ void* my32_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** p { int stacksize = (ssize)?ssize:(2*1024*1024); //default stack size is 2Mo //void* stack = malloc(stacksize); - void* stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); + void* stack = mmap64(NULL, stacksize, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN|MAP_32BIT, -1, 0); emuthread_t *et = (emuthread_t*)calloc(1, sizeof(emuthread_t)); x64emu_t *emuthread = NewX64Emu(emu->context, (uintptr_t)f, (uintptr_t)stack, stacksize, 1); SetupX64Emu(emuthread, emu); diff --git a/src/tools/box32stack.c b/src/tools/box32stack.c index 441b27ab..0fa1460e 100644 --- a/src/tools/box32stack.c +++ b/src/tools/box32stack.c @@ -48,7 +48,7 @@ void SetupInitialStack32(x64emu_t *emu) for (int i=emu->context->argc-1; i>=0; --i) { PushString32(emu, emu->context->argv[i]); p_argv[i] = R_ESP; - free(emu->context->argv[i]); + box_free(emu->context->argv[i]); emu->context->argv[i] = (char*)p_argv[i]; } // align diff --git a/src/tools/box64stack.c b/src/tools/box64stack.c index 82dc9a63..9036bda4 100644 --- a/src/tools/box64stack.c +++ b/src/tools/box64stack.c @@ -22,7 +22,7 @@ int CalcStackSize(box64context_t *context) CalcStack(context->elfs[i], &context->stacksz, &context->stackalign); //if (posix_memalign((void**)&context->stack, context->stackalign, context->stacksz)) { - context->stack = internal_mmap(NULL, context->stacksz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); + context->stack = mmap(NULL, context->stacksz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0); if (context->stack==(void*)-1) { printf_log(LOG_NONE, "Cannot allocate aligned memory (0x%lx/0x%zx) for stack\n", context->stacksz, context->stackalign); return 1; diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 4f7e6dc6..51160827 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2816,45 +2816,45 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot (void)emu; if(prot&PROT_WRITE) prot|=PROT_READ; // PROT_READ is implicit with PROT_WRITE on i386 - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mmap64(%p, 0x%lx, 0x%x, 0x%x, %d, %ld) => ", addr, length, prot, flags, fd, offset);} + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mmap64(%p, 0x%lx, 0x%x, 0x%x, %d, %ld) => ", addr, length, prot, flags, fd, offset);} int new_flags = flags; #ifndef NOALIGN void* old_addr = addr; new_flags&=~MAP_32BIT; // remove MAP_32BIT if(flags&MAP_32BIT) { // MAP_32BIT only exist on x86_64! - addr = find31bitBlockNearHint(addr, length, 0); + addr = find31bitBlockNearHint(old_addr, length, 0); } else if (box64_wine || 1) { // other mmap should be restricted to 47bits if(!addr) addr = find47bitBlock(length); } #endif void* ret = internal_mmap(addr, length, prot, new_flags, fd, offset); - #ifndef NOALIGN + #if !defined(NOALIGN) || defined(BOX32) if((ret!=MAP_FAILED) && (flags&MAP_32BIT) && (((uintptr_t)ret>0xffffffffLL) || ((box64_wine) && ((uintptr_t)ret&0xffff) && (ret!=addr)))) { int olderr = errno; - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret); - munmap(ret, length); + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 32bits didn't worked, ask %p, got %p ", addr, ret); + internal_munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously addr = find31bitBlockNearHint(old_addr, length, 0); // is this the best way? new_flags = (addr && isBlockFree(addr, length) )? (new_flags|MAP_FIXED) : new_flags; if((new_flags&(MAP_FIXED|MAP_FIXED_NOREPLACE))==(MAP_FIXED|MAP_FIXED_NOREPLACE)) new_flags&=~MAP_FIXED_NOREPLACE; ret = internal_mmap(addr, length, prot, new_flags, fd, offset); - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret); + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret); if(old_addr && ret!=old_addr && ret!=MAP_FAILED) errno = olderr; } else if((ret!=MAP_FAILED) && !(flags&MAP_FIXED) && ((box64_wine)) && (addr && (addr!=ret)) && (((uintptr_t)ret>0x7fffffffffffLL) || ((uintptr_t)ret&~0xffff))) { int olderr = errno; - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret); - munmap(ret, length); + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, "Warning, mmap on 47bits didn't worked, ask %p, got %p ", addr, ret); + internal_munmap(ret, length); loadProtectionFromMap(); // reload map, because something went wrong previously addr = find47bitBlockNearHint(old_addr, length, 0); // is this the best way? new_flags = (addr && isBlockFree(addr, length)) ? (new_flags|MAP_FIXED) : new_flags; if((new_flags&(MAP_FIXED|MAP_FIXED_NOREPLACE))==(MAP_FIXED|MAP_FIXED_NOREPLACE)) new_flags&=~MAP_FIXED_NOREPLACE; ret = internal_mmap(addr, length, prot, new_flags, fd, offset); - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret); + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) printf_log(LOG_NONE, " tried again with %p, got %p\n", addr, ret); if(old_addr && ret!=old_addr && ret!=MAP_FAILED) { errno = olderr; if(old_addr>(void*)0x7fffffffff && !have48bits) @@ -2867,7 +2867,7 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, unsigned long length, int prot errno = EEXIST; return MAP_FAILED; } - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);} + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);} #ifdef DYNAREC if(box64_dynarec && ret!=MAP_FAILED) { /*if(flags&0x100000 && addr!=ret) @@ -2918,9 +2918,9 @@ EXPORT void* my_mmap(x64emu_t* emu, void *addr, unsigned long length, int prot, EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t new_size, int flags, void* new_addr) { (void)emu; - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mremap(%p, %lu, %lu, %d, %p)=>", old_addr, old_size, new_size, flags, new_addr);} + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "mremap(%p, %lu, %lu, %d, %p)=>", old_addr, old_size, new_size, flags, new_addr);} void* ret = mremap(old_addr, old_size, new_size, flags, new_addr); - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);} + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "%p\n", ret);} if(ret!=(void*)-1) { uint32_t prot = getProtection((uintptr_t)old_addr)&~PROT_CUSTOM; if(ret==old_addr) { @@ -2968,7 +2968,7 @@ EXPORT void* my_mremap(x64emu_t* emu, void* old_addr, size_t old_size, size_t ne EXPORT int my_munmap(x64emu_t* emu, void* addr, unsigned long length) { (void)emu; - if(emu && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "munmap(%p, %lu)\n", addr, length);} + if((emu || box64_is32bits) && (box64_log>=LOG_DEBUG || box64_dynarec_log>=LOG_DEBUG)) {printf_log(LOG_NONE, "munmap(%p, %lu)\n", addr, length);} int ret = internal_munmap(addr, length); #ifdef DYNAREC if(!ret && box64_dynarec && length) { |