diff options
Diffstat (limited to 'src/dynarec/dynarec.c')
| -rw-r--r-- | src/dynarec/dynarec.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 3675d5c9..5dddc23b 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -28,7 +28,7 @@ #ifdef DYNAREC uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr); -void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2) +void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3) { int is32bits = (R_CS == 0x23); #ifdef HAVE_TRACE @@ -53,6 +53,7 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2) uintptr_t old_addr = addr; addr = (uintptr_t)getAlternate((void*)addr); // set new address R_RIP = addr; // but also new RIP! + *x3 = addr; // and the RIP in x27 register printf_log(LOG_DEBUG, " -> %p\n", (void*)addr); block = DBAlternateBlock(emu, old_addr, addr, is32bits); } else @@ -65,12 +66,12 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2) } else { dynablock_t* db = FindDynablockFromNativeAddress(x2-4); elfheader_t* h = FindElfAddress(my_context, (uintptr_t)x2-4); - dynarec_log(LOG_INFO, "Warning, jumping to a no-block address %p from %p (db=%p, x64addr=%p(elf=%s), RIP=%p)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, h?ElfName(h):"(none)", R_RIP); + dynarec_log(LOG_INFO, "Warning, jumping to a no-block address %p from %p (db=%p, x64addr=%p(elf=%s), RIP=%p)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, h?ElfName(h):"(none)", (void*)*x3); } } #endif //tableupdate(native_epilog, addr, table); - return native_epilog_fast; + return native_epilog; } if(!block->done) { // not finished yet... leave linker @@ -80,11 +81,11 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2) printf_log(LOG_NONE, "Warning, NULL block at %p from %p (db=%p, x64addr=%p/%s)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL, db?getAddrFunctionName(getX64Address(db, (uintptr_t)x2-4)):"(nil)"); } #endif - return native_epilog_fast; + return native_epilog; } if(!(jblock=block->block)) { // null block, but done: go to epilog, no linker here - return native_epilog_fast; + return native_epilog; } //dynablock_t *father = block->father?block->father:block; return jblock; |