about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-25 22:22:22 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-25 22:22:22 +0000
commit85da2b7e235a1d289ca957cbe926896ed882a094 (patch)
tree7d6864e2150edde272b979cc48ac353e3cbfd274 /src
parentda7136ab7edc3ef2206b48a932352bb17c20cbc6 (diff)
downloadbox64-85da2b7e235a1d289ca957cbe926896ed882a094.tar.gz
box64-85da2b7e235a1d289ca957cbe926896ed882a094.zip
[DYNAREC] Some fixes and small improvment to common codeblock generator
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_native.c11
-rwxr-xr-xsrc/dynarec/dynarec_native_pass.c26
2 files changed, 26 insertions, 11 deletions
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index 887e3869..d07588ec 100755
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -520,12 +520,13 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
     // keep size of instructions for signal handling
     size_t insts_rsize = (helper.insts_size+2)*sizeof(instsize_t);
     insts_rsize = (insts_rsize+7)&~7;   // round the size...
+    size_t native_size = (helper.native_size+7)&~7;   // round the size...
     // ok, now allocate mapped memory, with executable flag on
-    size_t sz = sizeof(void*) + helper.native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize;
+    size_t sz = sizeof(void*) + native_size + helper.table64size*sizeof(uint64_t) + 4*sizeof(void*) + insts_rsize;
     //           dynablock_t*     block (arm insts)            table64                       jmpnext code       instsize
     void* actual_p = (void*)AllocDynarecMap(sz);
     void* p = actual_p + sizeof(void*);
-    void* next = p + helper.native_size + helper.table64size*sizeof(uint64_t);
+    void* next = p + native_size + helper.table64size*sizeof(uint64_t);
     void* instsize = next + 4*sizeof(void*);
     if(actual_p==NULL) {
         dynarec_log(LOG_INFO, "AllocDynarecMap(%p, %zu) failed, cancelling block\n", block, sz);
@@ -534,7 +535,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
     }
     helper.block = p;
     helper.native_start = (uintptr_t)p;
-    helper.tablestart = helper.native_start + helper.native_size;
+    helper.tablestart = helper.native_start + native_size;
     helper.insts_size = 0;  // reset
     helper.instsize = (instsize_t*)instsize;
     *(dynablock_t**)actual_p = block;
@@ -583,8 +584,8 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr) {
     block->block = p;
     block->jmpnext = next+sizeof(void*);
     *(dynablock_t**)next = block;
-    *(void**)(next+2*sizeof(void*)) = native_next;
-    CreateJmpNext(block->jmpnext, next+2*sizeof(void*));
+    *(void**)(next+3*sizeof(void*)) = native_next;
+    CreateJmpNext(block->jmpnext, next+3*sizeof(void*));
     block->need_test = 0;
     //block->x64_addr = (void*)start;
     block->x64_size = end-start;
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index c76c8020..d8cd21b7 100755
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -191,12 +191,14 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
                         }
                     if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n);
                 } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) {
-                    dyn->forward = addr;
-                    dyn->forward_to = next;
-                    dyn->forward_size = dyn->size;
-                    dyn->forward_ninst = ninst;
-                    reset_n = -2;
-                    ok = 1;
+                    if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next))) {
+                        dyn->forward = addr;
+                        dyn->forward_to = next;
+                        dyn->forward_size = dyn->size;
+                        dyn->forward_ninst = ninst;
+                        reset_n = -2;
+                        ok = 1;
+                    }
                 }
             }
         #endif
@@ -221,6 +223,18 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
         if(ok && (ninst==dyn->size))
         #endif
         {
+            #if STEP == 0
+            if(dyn->forward) {
+                // stopping too soon
+                dyn->size = dyn->forward_size;
+                ninst = dyn->forward_ninst;
+                addr = dyn->forward;
+                dyn->forward = 0;
+                dyn->forward_to = 0;
+                dyn->forward_size = 0;
+                dyn->forward_ninst = 0;
+            }
+            #endif
             int j32;
             MAYUSE(j32);
             MESSAGE(LOG_DEBUG, "Stopping block %p (%d / %d)\n",(void*)init_addr, ninst, dyn->size);