about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-06-11 12:09:27 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-06-11 12:09:27 +0200
commite2f22310f4fe4d863872fadc8df656a27c4360ba (patch)
tree040b68fa81a4f93eeda5cec1ee5caab132273c1a /src
parent347f90f9758f31d74ae42258cd15c0c260e3305c (diff)
downloadbox64-e2f22310f4fe4d863872fadc8df656a27c4360ba.tar.gz
box64-e2f22310f4fe4d863872fadc8df656a27c4360ba.zip
[DYNACACHE] Made dynablock part of the dynarec memory
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/dynablock.c26
-rw-r--r--src/dynarec/dynarec_native.c39
-rw-r--r--src/include/dynarec_native.h2
3 files changed, 29 insertions, 38 deletions
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index 2c935e0a..45a2b4f9 100644
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -79,8 +79,7 @@ void FreeInvalidDynablock(dynablock_t* db, int need_lock)
         dynarec_log(LOG_DEBUG, "FreeInvalidDynablock(%p), db->block=%p x64=%p:%p already gone=%d\n", db, db->block, db->x64_addr, db->x64_addr+db->x64_size-1, db->gone);
         if(need_lock)
             mutex_lock(&my_context->mutex_dyndump);
-        FreeDynarecMap((uintptr_t)db->actual_block);
-        customFree(db);
+        FreeDynarecMap((uintptr_t)db->actual_block);    // will also free db
         if(need_lock)
             mutex_unlock(&my_context->mutex_dyndump);
     }
@@ -109,8 +108,7 @@ void FreeDynablock(dynablock_t* db, int need_lock)
         }
         if(db->previous)
             FreeInvalidDynablock(db->previous, 0);
-        FreeDynarecMap((uintptr_t)db->actual_block);
-        customFree(db);
+        FreeDynarecMap((uintptr_t)db->actual_block);    // will also free db
         if(need_lock)
             mutex_unlock(&my_context->mutex_dyndump);
     }
@@ -176,15 +174,6 @@ int FreeRangeDynablock(dynablock_t* db, uintptr_t addr, uintptr_t size)
     return 1;
 }
 
-dynablock_t *AddNewDynablock(uintptr_t addr)
-{
-    dynablock_t* block;
-    // create and add new block
-    dynarec_log(LOG_VERBOSE, "Ask for DynaRec Block creation @%p\n", (void*)addr);
-    block = (dynablock_t*)customCalloc(1, sizeof(dynablock_t));
-    return block;
-}
-
 NEW_JUMPBUFF(dynarec_jmpbuf);
 
 void cancelFillBlock()
@@ -230,22 +219,15 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
         return NULL;
     }
 #endif
-    block = AddNewDynablock(addr);
-
-    // fill the block
-    block->x64_addr = (void*)addr;
     if (SigSetJmp(GET_JUMPBUFF(dynarec_jmpbuf), 1)) {
         printf_log(LOG_INFO, "FillBlock at %p triggered a segfault, canceling\n", (void*)addr);
-        FreeDynablock(block, 0);
         if(need_lock)
             mutex_unlock(&my_context->mutex_dyndump);
         return NULL;
     }
-    void* ret = FillBlock64(block, filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS);
-    if(!ret) {
+    block = FillBlock64(filladdr, (addr==filladdr)?0:1, is32bits, MAX_INSTS);
+    if(!block) {
         dynarec_log(LOG_DEBUG, "Fillblock of block %p for %p returned an error\n", block, (void*)addr);
-        customFree(block);
-        block = NULL;
     }
     // check size
     if(block) {
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index 0a57db95..b6e7a86b 100644
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -558,17 +558,21 @@ uintptr_t native_pass1(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
 uintptr_t native_pass2(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max);
 uintptr_t native_pass3(dynarec_native_t* dyn, uintptr_t addr, int alternate, int is32bits, int inst_max);
 
-void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr, int is32bits) {
-    block->isize = 0;
-    block->done = 0;
-    size_t sz = 4*sizeof(void*);
+dynablock_t* CreateEmptyBlock(uintptr_t addr, int is32bits) {
+    size_t sz = 4*sizeof(void*) + sizeof(dynablock_t);
     void* actual_p = (void*)AllocDynarecMap(addr, sz);
     void* p = actual_p + sizeof(void*);
     if(actual_p==NULL) {
-        dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", block, sz);
+        dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", (void*)addr, sz);
         CancelBlock64(0);
         return NULL;
     }
+    dynablock_t* block = (dynablock_t*)(actual_p+4*sizeof(void*));
+    memset(block, 0, sizeof(dynablock_t));
+    // fill the block
+    block->x64_addr = (void*)addr;
+    block->isize = 0;
+    block->done = 0;
     block->size = sz;
     block->actual_block = actual_p;
     block->block = p;
@@ -582,7 +586,7 @@ void* CreateEmptyBlock(dynablock_t* block, uintptr_t addr, int is32bits) {
     return block;
 }
 
-void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bits, int inst_max) {
+dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max) {
     /*
         A Block must have this layout:
 
@@ -599,7 +603,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     */
     if(addr>=BOX64ENV(nodynarec_start) && addr<BOX64ENV(nodynarec_end)) {
         dynarec_log(LOG_INFO, "Create empty block in no-dynarec zone\n");
-        return CreateEmptyBlock(block, addr, is32bits);
+        return CreateEmptyBlock(addr, is32bits);
     }
     if(current_helper) {
         dynarec_log(LOG_DEBUG, "Canceling dynarec FillBlock at %p as another one is going on\n", (void*)addr);
@@ -618,7 +622,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     helper.gdbjit_block = box_calloc(1, sizeof(gdbjit_block_t));
 #endif
     current_helper = &helper;
-    helper.dynablock = block;
+    helper.dynablock = NULL;
     helper.start = addr;
     uintptr_t start = addr;
     helper.cap = MAX_INSTS;
@@ -643,7 +647,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     if(!helper.size) {
         dynarec_log(LOG_INFO, "Warning, null-sized dynarec block (%p)\n", (void*)addr);
         CancelBlock64(0);
-        return CreateEmptyBlock(block, addr, is32bits);
+        return CreateEmptyBlock(addr, is32bits);
     }
     if(!isprotectedDB(addr, 1)) {
         dynarec_log(LOG_INFO, "Warning, write on current page on pass0, aborting dynablock creation (%p)\n", (void*)addr);
@@ -745,7 +749,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
         // NULL block after removing dead code, how is that possible?
         dynarec_log(LOG_INFO, "Warning, null-sized dynarec block after trimming dead code (%p)\n", (void*)addr);
         CancelBlock64(0);
-        return CreateEmptyBlock(block, addr, is32bits);
+        return CreateEmptyBlock(addr, is32bits);
     }
     updateYmm0s(&helper, 0, 0);
     UPDATE_SPECIFICS(&helper);
@@ -799,15 +803,15 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
         --imax;
         if(dyn->need_dump || BOX64ENV(dynarec_log))dynarec_log(LOG_NONE, "Dynablock oversized, with %zu (max=%zd), recomputing cutting at %d from %d\n", native_size, MAXBLOCK_SIZE, imax, helper.size);
         CancelBlock64(0);
-        return FillBlock64(block, addr, alternate, is32bits, imax);
+        return FillBlock64(addr, alternate, is32bits, imax);
     }
     size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t);
     insts_rsize = (insts_rsize+7)&~7;   // round the size...
     size_t arch_size = ARCH_SIZE(&helper);
     size_t callret_size = helper.callret_size*sizeof(callret_t);
     // ok, now allocate mapped memory, with executable flag on
-    size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize + arch_size + callret_size;
-    //           dynablock_t*     block (arm insts)            table64               jmpnext code       instsize     arch         callrets
+    size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize + arch_size + callret_size + sizeof(dynablock_t);
+    //           dynablock_t*     block (arm insts)            table64               jmpnext code       instsize     arch         callrets          dynablock
     void* actual_p = (void*)AllocDynarecMap(addr, sz);
     void* p = (void*)(((uintptr_t)actual_p) + sizeof(void*));
     void* tablestart = p + native_size;
@@ -816,11 +820,16 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     void* arch = instsize + insts_rsize;
     void* callrets = arch + arch_size;
     if(actual_p==NULL) {
-        dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", block, sz);
+        dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, canceling block\n", (void*)addr, sz);
         CancelBlock64(0);
         return NULL;
     }
     helper.block = p;
+    dynablock_t* block = (dynablock_t*)(callrets+callret_size);
+    memset(block, 0, sizeof(dynablock_t));
+    // fill the block
+    block->x64_addr = (void*)addr;
+    block->isize = 0;
     block->actual_block = actual_p;
     helper.native_start = (uintptr_t)p;
     helper.tablestart = (uintptr_t)tablestart;
@@ -946,5 +955,5 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     }
     current_helper = NULL;
     //block->done = 1;
-    return (void*)block;
+    return block;
 }
diff --git a/src/include/dynarec_native.h b/src/include/dynarec_native.h
index 6e733eeb..74e0e05a 100644
--- a/src/include/dynarec_native.h
+++ b/src/include/dynarec_native.h
@@ -24,6 +24,6 @@ typedef struct instsize_s instsize_t;
 void addInst(instsize_t* insts, size_t* size, int x64_size, int native_size);
 
 void CancelBlock64(int need_lock);
-void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bits, int inst_max);
+dynablock_t* FillBlock64(uintptr_t addr, int alternate, int is32bits, int inst_max);
 
 #endif //__DYNAREC_ARM_H_