about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-09-12 13:59:10 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-09-12 13:59:10 +0200
commit6141421f92aa8a552ae612524ac67f3fa8c7eee8 (patch)
treee9b3895eda1535f5849e5a84d8bcdb476a6db9e2 /src
parent911ecc4489593b28d87fec30e94500693d03457c (diff)
downloadbox64-6141421f92aa8a552ae612524ac67f3fa8c7eee8.tar.gz
box64-6141421f92aa8a552ae612524ac67f3fa8c7eee8.zip
[DYNAREC] some fixes to alternate handling and vsyscall support
Diffstat (limited to 'src')
-rwxr-xr-xsrc/box64context.c6
-rwxr-xr-xsrc/dynarec/dynarec.c19
-rwxr-xr-xsrc/dynarec/dynarec_arm64_functions.c3
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, &current);
     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, &current);
+        }
+        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;