diff options
Diffstat (limited to 'src/custommem.c')
| -rw-r--r-- | src/custommem.c | 27 |
1 files changed, 15 insertions, 12 deletions
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; |