about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-29 18:42:36 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-03-29 18:42:36 +0200
commit51c23856f33c9c7cc45a456a1d7ff0e2f0388b79 (patch)
treec10e19be93d403553aa132ac2698546c67ebedf0 /src
parent6cb6605a63ad066ba98cc129dab539e58a695f35 (diff)
downloadbox64-51c23856f33c9c7cc45a456a1d7ff0e2f0388b79.tar.gz
box64-51c23856f33c9c7cc45a456a1d7ff0e2f0388b79.zip
[DYNAREC] FillBlock is behind a mutex now, and use LR for easier debugging on jump_to_next
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64_next.S1
-rwxr-xr-xsrc/dynarec/dynablock.c15
-rwxr-xr-xsrc/dynarec/dynarec.c3
-rwxr-xr-xsrc/dynarec/dynarec_arm64_helper.c6
4 files changed, 15 insertions, 10 deletions
diff --git a/src/dynarec/arm64_next.S b/src/dynarec/arm64_next.S
index cd60dda5..834c1a89 100755
--- a/src/dynarec/arm64_next.S
+++ b/src/dynarec/arm64_next.S
@@ -19,6 +19,7 @@ arm64_next:
     stp     x14, x15, [sp, (8 *  6)]
     stp     x16, x17, [sp, (8 *  8)]
     str     x18, [sp, (8 * 10)]
+    mov     x2, lr      // "from" is in lr, so put in x2
     // call the function
     bl      LinkNext
     // preserve return value
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index c5e2d24b..6170fe67 100755
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -69,7 +69,7 @@ void FreeDynablock(dynablock_t* db)
         if(db->parent->direct) {
             uintptr_t addr = (uintptr_t)db->x64_addr;
             if(addr>=startdb && addr<enddb)
-                db->parent->direct[addr-startdb] = NULL;
+                arm64_lock_xchg(&db->parent->direct[addr-startdb], 0);   // secured write
         }
         // remove jumptable
         setJumpTableDefault64(db->x64_addr);
@@ -323,23 +323,26 @@ static dynablock_t* internalDBGetBlock(x64emu_t* emu, uintptr_t addr, uintptr_t
     if(!created)
         return block;   // existing block...
 
-    #if 1
+    #if 0
     if(box64_dynarec_dump)
         pthread_mutex_lock(&my_context->mutex_dyndump);
     #endif
     // fill the block
     block->x64_addr = (void*)addr;
-    if(!FillBlock64(block, filladdr)) {
+    pthread_mutex_lock(&my_context->mutex_dyndump);
+    void* ret = FillBlock64(block, filladdr);
+    pthread_mutex_unlock(&my_context->mutex_dyndump);
+    if(!ret) {
         dynarec_log(LOG_DEBUG, "Fillblock of block %p for %p returned an error\n", block, (void*)addr);
-        void* old = (void*)arm64_lock_xchg(&dynablocks->direct[addr-dynablocks->text], 0);
+        void* old = (void*)arm64_lock_storeifref(&dynablocks->direct[addr-dynablocks->text], 0, block);
         if(old!=block && old) {// put it back in place, strange things are happening here!
             dynarec_log(LOG_INFO, "Warning, a wild block appeared at %p: %p\n", (void*)addr, old);
-            arm64_lock_xchg(&dynablocks->direct[addr-dynablocks->text], (uintptr_t)old);
+            // doing nothing else, the block as not be writen
         }
         free(block);
         block = NULL;
     }
-    #if 1
+    #if 0
     if(box64_dynarec_dump)
         pthread_mutex_unlock(&my_context->mutex_dyndump);
     #endif
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index 8769bc1e..b2285014 100755
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -37,7 +37,6 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2)
 {
     #ifdef HAVE_TRACE
     if(!addr) {
-        x2-=8;  // actual PC is 2 instructions ahead
         dynablock_t* db = FindDynablockFromNativeAddress(x2);
         printf_log(LOG_NONE, "Warning, jumping to NULL address from %p (db=%p, x64addr=%p)\n", x2, db, db?(void*)getX64Address(db, (uintptr_t)x2):NULL);
     }
@@ -47,6 +46,8 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2)
     dynablock_t* block = DBGetBlock(emu, addr, 1, &current);
     if(!block) {
         // no block, let link table as is...
+dynablock_t* db = FindDynablockFromNativeAddress(x2);
+printf_log(LOG_NONE, "Warning, jumping to a no-block address from %p (db=%p, x64addr=%p)\n", x2, db, db?(void*)getX64Address(db, (uintptr_t)x2):NULL);
         //tableupdate(arm64_epilog, addr, table);
         return arm64_epilog;
     }
diff --git a/src/dynarec/dynarec_arm64_helper.c b/src/dynarec/dynarec_arm64_helper.c
index f22cac82..3d616bfb 100755
--- a/src/dynarec/dynarec_arm64_helper.c
+++ b/src/dynarec/dynarec_arm64_helper.c
@@ -263,7 +263,7 @@ void jump_to_next(dynarec_arm_t* dyn, uintptr_t ip, int reg, int ninst)
     #ifdef HAVE_TRACE
     //MOVx(x2, 15);    no access to PC reg 
     #endif
-    BR(x3);
+    BLR(x3); // save LR...
 }
 
 void ret_to_epilog(dynarec_arm_t* dyn, int ninst)
@@ -281,7 +281,7 @@ void ret_to_epilog(dynarec_arm_t* dyn, int ninst)
     UBFXx(x3, xRIP, 0, JMPTABL_SHIFT);
     LDRx_REG_LSL3(x2, x2, x3);
     MOVx_REG(x1, xRIP);
-    BR(x2);
+    BLR(x2); // save LR
 }
 
 void retn_to_epilog(dynarec_arm_t* dyn, int ninst, int n)
@@ -305,7 +305,7 @@ void retn_to_epilog(dynarec_arm_t* dyn, int ninst, int n)
     UBFXx(x3, xRIP, 0, JMPTABL_SHIFT);
     LDRx_REG_LSL3(x2, x2, x3);
     MOVx_REG(x1, xRIP);
-    BR(x2);
+    BLR(x2); // save LR
 }
 
 void iret_to_epilog(dynarec_arm_t* dyn, int ninst)