about summary refs log tree commit diff stats
path: root/src/dynarec
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-09-21 20:50:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-09-21 20:50:52 +0200
commit7e4af27ba761b2feb2ba444f85f7889b9de4c2a6 (patch)
treeb80bd2362839bebcd3a94387fccdf437b1297ddd /src/dynarec
parent06bbf93bf876c107ff41593a75fe6fa8a6d6a779 (diff)
downloadbox64-7e4af27ba761b2feb2ba444f85f7889b9de4c2a6.tar.gz
box64-7e4af27ba761b2feb2ba444f85f7889b9de4c2a6.zip
More work on gtk and nss3+friends
Diffstat (limited to 'src/dynarec')
-rwxr-xr-xsrc/dynarec/arm64_next.S5
-rwxr-xr-xsrc/dynarec/dynarec.c6
2 files changed, 7 insertions, 4 deletions
diff --git a/src/dynarec/arm64_next.S b/src/dynarec/arm64_next.S
index 48aefc17..5e890137 100755
--- a/src/dynarec/arm64_next.S
+++ b/src/dynarec/arm64_next.S
@@ -18,9 +18,10 @@ arm64_next:
     stp     x12, x13, [sp, (8 *  4)]
     stp     x14, x15, [sp, (8 *  6)]
     stp     x16, x17, [sp, (8 *  8)]
-    str     x18, [sp, (8 * 10)]
+    stp     x18, x27, [sp, (8 * 10)]    // also save x27(rip) to allow change in LinkNext
 
     mov     x2, lr      // "from" is in lr, so put in x2
+    add     x3, sp, 8*11    // x3 is address to change rip
     // call the function
     bl      LinkNext
     // preserve return value
@@ -31,7 +32,7 @@ arm64_next:
     ldp     x12, x13, [sp, (8 *  4)]
     ldp     x14, x15, [sp, (8 *  6)]
     ldp     x16, x17, [sp, (8 *  8)]
-    ldr     x18, [sp, (8 * 10)]
+    ldp     x18, x27, [sp, (8 * 10)]
     add     sp,  sp, (8 * 12)
     // return offset is jump address
     br      x3
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index 5f4e94bd..976070ab 100755
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -33,7 +33,7 @@ void arm64_epilog_fast() EXPORTDYN;
 #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)
 {
     #ifdef HAVE_TRACE
     if(!addr) {
@@ -48,7 +48,9 @@ void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2)
         // no block, let link table as is...
         if(hasAlternate((void*)addr)) {
             printf_log(LOG_INFO, "Jmp address has alternate: %p", (void*)addr);
-            addr = (uintptr_t)getAlternate((void*)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_INFO, " -> %p\n", (void*)addr);
             block = DBGetBlock(emu, addr, 1, &current);
         }