diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-09-21 20:50:52 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-09-21 20:50:52 +0200 |
| commit | 7e4af27ba761b2feb2ba444f85f7889b9de4c2a6 (patch) | |
| tree | b80bd2362839bebcd3a94387fccdf437b1297ddd /src/dynarec | |
| parent | 06bbf93bf876c107ff41593a75fe6fa8a6d6a779 (diff) | |
| download | box64-7e4af27ba761b2feb2ba444f85f7889b9de4c2a6.tar.gz box64-7e4af27ba761b2feb2ba444f85f7889b9de4c2a6.zip | |
More work on gtk and nss3+friends
Diffstat (limited to 'src/dynarec')
| -rwxr-xr-x | src/dynarec/arm64_next.S | 5 | ||||
| -rwxr-xr-x | src/dynarec/dynarec.c | 6 |
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, ¤t); } |