about summary refs log tree commit diff stats
path: root/src/custommem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/custommem.c')
-rw-r--r--src/custommem.c27
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;