diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-03-29 18:42:36 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-03-29 18:42:36 +0200 |
| commit | 51c23856f33c9c7cc45a456a1d7ff0e2f0388b79 (patch) | |
| tree | c10e19be93d403553aa132ac2698546c67ebedf0 /src | |
| parent | 6cb6605a63ad066ba98cc129dab539e58a695f35 (diff) | |
| download | box64-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-x | src/dynarec/arm64_next.S | 1 | ||||
| -rwxr-xr-x | src/dynarec/dynablock.c | 15 | ||||
| -rwxr-xr-x | src/dynarec/dynarec.c | 3 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_helper.c | 6 |
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, ¤t); 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) |