about summary refs log tree commit diff stats
path: root/src/dynarec/dynarec_native.c
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/dynarec/dynarec_native.c
parent347f90f9758f31d74ae42258cd15c0c260e3305c (diff)
downloadbox64-e2f22310f4fe4d863872fadc8df656a27c4360ba.tar.gz
box64-e2f22310f4fe4d863872fadc8df656a27c4360ba.zip
[DYNACACHE] Made dynablock part of the dynarec memory
Diffstat (limited to 'src/dynarec/dynarec_native.c')
-rw-r--r--src/dynarec/dynarec_native.c39
1 files changed, 24 insertions, 15 deletions
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;
 }