about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-07-03 18:31:03 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-07-03 18:31:03 +0200
commitab9b88091cb175ce0d8ec242c04583b54e2db02c (patch)
tree8077484743d97f4df7542204246de86a91bb469c
parenta0fb28ac551a3f3d95828445a6fdea74ead78437 (diff)
downloadbox64-ab9b88091cb175ce0d8ec242c04583b54e2db02c.tar.gz
box64-ab9b88091cb175ce0d8ec242c04583b54e2db02c.zip
[BOX32] Simplified and improved 32bits memory management
-rw-r--r--src/core.c6
-rw-r--r--src/custommem.c27
-rw-r--r--src/include/debug.h1
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