diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-09-12 13:59:10 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-09-12 13:59:10 +0200 |
| commit | 6141421f92aa8a552ae612524ac67f3fa8c7eee8 (patch) | |
| tree | e9b3895eda1535f5849e5a84d8bcdb476a6db9e2 /src | |
| parent | 911ecc4489593b28d87fec30e94500693d03457c (diff) | |
| download | box64-6141421f92aa8a552ae612524ac67f3fa8c7eee8.tar.gz box64-6141421f92aa8a552ae612524ac67f3fa8c7eee8.zip | |
[DYNAREC] some fixes to alternate handling and vsyscall support
Diffstat (limited to 'src')
| -rwxr-xr-x | src/box64context.c | 6 | ||||
| -rwxr-xr-x | src/dynarec/dynarec.c | 19 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_arm64_functions.c | 3 |
3 files changed, 20 insertions, 8 deletions
diff --git a/src/box64context.c b/src/box64context.c index eb2512b3..1558811e 100755 --- a/src/box64context.c +++ b/src/box64context.c @@ -169,9 +169,9 @@ box64context_t *NewBox64Context(int argc) context->vsyscalls[1] = AddVSyscall(context->system, 201); context->vsyscalls[2] = AddVSyscall(context->system, 309); // create the alternate to map at address - addAlternate((void*)context->vsyscalls[0], (void*)0xffffffffff600000); - addAlternate((void*)context->vsyscalls[1], (void*)0xffffffffff600400); - addAlternate((void*)context->vsyscalls[2], (void*)0xffffffffff600800); + addAlternate((void*)0xffffffffff600000, (void*)context->vsyscalls[0]); + addAlternate((void*)0xffffffffff600400, (void*)context->vsyscalls[1]); + addAlternate((void*)0xffffffffff600800, (void*)context->vsyscalls[2]); // get handle to box64 itself context->box64lib = dlopen(NULL, RTLD_NOW|RTLD_GLOBAL); context->dlprivate = NewDLPrivate(); diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 0c7550b9..5f4e94bd 100755 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -19,6 +19,7 @@ #ifdef DYNAREC #include "dynablock.h" #include "dynablock_private.h" +#include "bridge.h" #endif #ifdef DYNAREC @@ -45,10 +46,20 @@ 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-4); -printf_log(LOG_NONE, "Warning, jumping to a no-block address %p from %p (db=%p, x64addr=%p)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL); - //tableupdate(arm64_epilog, addr, table); - return arm64_epilog; + if(hasAlternate((void*)addr)) { + printf_log(LOG_INFO, "Jmp address has alternate: %p", (void*)addr); + addr = (uintptr_t)getAlternate((void*)addr); + printf_log(LOG_INFO, " -> %p\n", (void*)addr); + block = DBGetBlock(emu, addr, 1, ¤t); + } + if(!block) { + #ifdef HAVE_TRACE + dynablock_t* db = FindDynablockFromNativeAddress(x2-4); + printf_log(LOG_INFO, "Warning, jumping to a no-block address %p from %p (db=%p, x64addr=%p)\n", (void*)addr, x2-4, db, db?(void*)getX64Address(db, (uintptr_t)x2-4):NULL); + #endif + //tableupdate(arm64_epilog, addr, table); + return arm64_epilog; + } } if(!block->done) { // not finished yet... leave linker diff --git a/src/dynarec/dynarec_arm64_functions.c b/src/dynarec/dynarec_arm64_functions.c index faf09e27..5e6ecfd2 100755 --- a/src/dynarec/dynarec_arm64_functions.c +++ b/src/dynarec/dynarec_arm64_functions.c @@ -26,6 +26,7 @@ #include "dynarec_arm64_private.h" #include "dynarec_arm64_functions.h" #include "custommem.h" +#include "bridge.h" void arm_fstp(x64emu_t* emu, void* p) { @@ -448,7 +449,7 @@ int isNativeCall(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t* calladdress, int return 0; if(PK(0)==0xff && PK(1)==0x25) { // "absolute" jump, maybe the GOT (well, RIP relative in fact) uintptr_t a1 = addr + 6 + (PK32(2)); // need to add a check to see if the address is from the GOT ! - addr = *(uintptr_t*)a1; + addr = (uintptr_t)getAlternate(*(void**)a1); } if(!addr || !getProtection(addr)) return 0; |