diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-07-03 18:31:03 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-07-03 18:31:03 +0200 |
| commit | ab9b88091cb175ce0d8ec242c04583b54e2db02c (patch) | |
| tree | 8077484743d97f4df7542204246de86a91bb469c | |
| parent | a0fb28ac551a3f3d95828445a6fdea74ead78437 (diff) | |
| download | box64-ab9b88091cb175ce0d8ec242c04583b54e2db02c.tar.gz box64-ab9b88091cb175ce0d8ec242c04583b54e2db02c.zip | |
[BOX32] Simplified and improved 32bits memory management
| -rw-r--r-- | src/core.c | 6 | ||||
| -rw-r--r-- | src/custommem.c | 27 | ||||
| -rw-r--r-- | src/include/debug.h | 1 |
3 files changed, 21 insertions, 13 deletions
diff --git a/src/core.c b/src/core.c index e8b14024..b8a85d0c 100644 --- a/src/core.c +++ b/src/core.c @@ -59,6 +59,7 @@ int box64_stdout_no_w = 0; uintptr_t box64_pagesize; path_collection_t box64_addlibs = {0}; int box64_is32bits = 0; +int box64_isAddressSpace32 = 0; int box64_rdtsc = 0; uint8_t box64_rdtsc_shift = 0; int box64_mapclean = 0; @@ -1159,7 +1160,10 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf if(tried) { unsetenv("BOX32_PERSONA32BITS"); int p = personality(0xffffffff); - if(p==ADDR_LIMIT_32BIT) printf_log(LOG_INFO, "Personality set to 32bits\n"); + if(p==ADDR_LIMIT_32BIT) { + box64_isAddressSpace32 = 1; + printf_log(LOG_INFO, "Personality set to 32bits\n"); + } } else { if(personality(ADDR_LIMIT_32BIT)!=-1) { int nenv = 0; diff --git a/src/custommem.c b/src/custommem.c index 7d81f7ce..d093528f 100644 --- a/src/custommem.c +++ b/src/custommem.c @@ -89,7 +89,8 @@ typedef struct blocklist_s { size_t size; void* first; uint32_t lowest; - uint8_t type; + uint8_t type; // could use 7bits for type and 1bit fot is32bits, + uint8_t is32bits; // but that wont really change the size of structure anyway } blocklist_t; #define MMAPSIZE (512*1024) // allocate 512kb sized blocks @@ -398,7 +399,7 @@ void testAllBlocks() for(int i=0; i<n_blocks; ++i) { // just silently skip blocks with 0 size, as they are not finished and so might be not coherent if(p_blocks[i].size) { - int is32bits = (box64_is32bits && p_blocks[i].block<(void*)0x100000000LL); + int is32bits = p_blocks[i].is32bits; if(is32bits) ++n_blocks32; if((p_blocks[i].type==BTYPE_LIST) && !printBlockCoherent(i)) printBlock(p_blocks[i].block, p_blocks[i].first); @@ -548,7 +549,7 @@ void* map128_customMalloc(size_t size, int is32bits) size = 128; mutex_lock(&mutex_blocks); for(int i=0; i<n_blocks; ++i) { - if(p_blocks[i].block && (p_blocks[i].type == BTYPE_MAP) && p_blocks[i].maxfree && (!box64_is32bits || ((!is32bits && p_blocks[i].block>(void*)0xffffffffLL)) || (is32bits && p_blocks[i].block<(void*)0x100000000LL))) { + if(p_blocks[i].block && (p_blocks[i].type == BTYPE_MAP) && p_blocks[i].maxfree && (p_blocks[i].is32bits==is32bits)) { // look for a free block uint8_t* map = p_blocks[i].first; for(uint32_t idx=p_blocks[i].lowest; idx<(p_blocks[i].size>>7); ++idx) { @@ -588,6 +589,7 @@ void* map128_customMalloc(size_t size, int is32bits) size_t mapsize = (allocsize/128)/8; mapsize = (mapsize+127)&~127LL; p_blocks[i].type = BTYPE_MAP; + p_blocks[i].is32bits = is32bits; p_blocks[i].block = p; p_blocks[i].first = p+allocsize-mapsize; p_blocks[i].size = allocsize; @@ -655,9 +657,7 @@ void* map64_customMalloc(size_t size, int is32bits) if (p_blocks[i].block && p_blocks[i].type == BTYPE_MAP64 && p_blocks[i].maxfree - && (!box64_is32bits - || ((!is32bits && p_blocks[i].block > (void*)0xffffffffLL) - || (is32bits && p_blocks[i].block < (void*)0x100000000LL))) + && (p_blocks[i].is32bits==is32bits) ) { uint16_t* map = p_blocks[i].first; uint32_t slices = p_blocks[i].size >> 6; @@ -704,6 +704,7 @@ void* map64_customMalloc(size_t size, int is32bits) mapsize = (mapsize + 255) & ~255LL; p_blocks[i].type = BTYPE_MAP64; + p_blocks[i].is32bits = is32bits; p_blocks[i].block = p; p_blocks[i].first = p+allocsize-mapsize; p_blocks[i].size = allocsize; @@ -761,7 +762,7 @@ void* internal_customMalloc(size_t size, int is32bits) size_t fullsize = size+2*sizeof(blockmark_t); mutex_lock(&mutex_blocks); for(int i=0; i<n_blocks; ++i) { - if(p_blocks[i].block && (p_blocks[i].type == BTYPE_LIST) && p_blocks[i].maxfree>=init_size && (!box64_is32bits || ((!is32bits && p_blocks[i].block>(void*)0xffffffffLL)) || (is32bits && p_blocks[i].block<(void*)0x100000000LL))) { + if(p_blocks[i].block && (p_blocks[i].type == BTYPE_LIST) && p_blocks[i].maxfree>=init_size && (p_blocks[i].is32bits==is32bits)) { size_t rsize = 0; sub = getFirstBlock(p_blocks[i].block, init_size, &rsize, p_blocks[i].first); if(sub) { @@ -790,6 +791,7 @@ void* internal_customMalloc(size_t size, int is32bits) p_blocks[i].first = NULL; p_blocks[i].size = 0; p_blocks[i].type = BTYPE_LIST; + p_blocks[i].is32bits = is32bits; if(is32bits) // unlocking, because mmap might use it mutex_unlock(&mutex_blocks); void* p = is32bits @@ -1035,7 +1037,7 @@ void* internal_customMemAligned(size_t align, size_t size, int is32bits) size_t fullsize = size+2*sizeof(blockmark_t); mutex_lock(&mutex_blocks); for(int i=0; i<n_blocks; ++i) { - if(p_blocks[i].block && (p_blocks[i].type==BTYPE_LIST) && p_blocks[i].maxfree>=size && ((!is32bits) || ((uintptr_t)p_blocks[i].block<0x100000000LL))) { + if(p_blocks[i].block && (p_blocks[i].type==BTYPE_LIST) && p_blocks[i].maxfree>=size && (p_blocks[i].is32bits==is32bits)) { size_t rsize = 0; sub = getFirstBlock(p_blocks[i].block, init_size, &rsize, p_blocks[i].first); uintptr_t p = (uintptr_t)sub+sizeof(blockmark_t); @@ -1077,6 +1079,7 @@ void* internal_customMemAligned(size_t align, size_t size, int is32bits) p_blocks[i].first = NULL; p_blocks[i].size = 0; p_blocks[i].type = BTYPE_LIST; + p_blocks[i].is32bits = is32bits; fullsize += 2*align+sizeof(blockmark_t); size_t allocsize = (fullsize>MMAPSIZE)?fullsize:MMAPSIZE; allocsize = (allocsize+box64_pagesize-1)&~(box64_pagesize-1); @@ -1190,10 +1193,11 @@ void* box32_dynarec_mmap(size_t size, int fd, off_t offset) cur = bend; } #endif - uint32_t map_flags = ((fd==-1)?0:MAP_ANONYMOUS) | MAP_PRIVATE; + uint32_t map_flags = ((fd==-1)?MAP_ANONYMOUS:0) | MAP_PRIVATE; //printf_log(LOG_INFO, "BOX32: Error allocating Dynarec memory: %s\n", "fallback to internal mmap"); - return InternalMmap((void*)0x100000000LL, size, PROT_READ | PROT_WRITE | PROT_EXEC, map_flags, fd, offset); - ; + void* ret = InternalMmap(box64_isAddressSpace32?NULL:(void*)0x100000000ULL, size, PROT_READ | PROT_WRITE | PROT_EXEC, map_flags, fd, offset); + printf_log(LOG_INFO, "fallback on box32_dynarec_mmap: %p\n", ret); + return ret; } #ifdef DYNAREC @@ -2749,7 +2753,6 @@ void fini_custommem_helper(box64context_t *ctx) } free(head); } - box_free(mmaplist); #ifdef JMPTABL_SHIFT4 uintptr_t**** box64_jmptbl3; diff --git a/src/include/debug.h b/src/include/debug.h index a4b2ee53..eb0ef7d1 100644 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -14,6 +14,7 @@ extern uintptr_t box64_pagesize; extern int box64_rdtsc; extern uint8_t box64_rdtsc_shift; extern int box64_is32bits; +extern int box64_isAddressSpace32; #ifdef DYNAREC extern cpu_ext_t cpuext; #endif |