diff options
| author | Alexandre Julliard <julliard@winehq.org> | 2023-06-28 17:50:14 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-28 17:50:14 +0200 |
| commit | 1f65d3add7cc97ee5276470ff47ff591fb903034 (patch) | |
| tree | 20aa1f2428dacc76e7bba2711292fbbeb3edd0e0 /src | |
| parent | 3b9772471724e663acc29fa22d466486a7539071 (diff) | |
| download | box64-1f65d3add7cc97ee5276470ff47ff591fb903034.tar.gz box64-1f65d3add7cc97ee5276470ff47ff591fb903034.zip | |
[DYNAREC] Fix push rsp instruction (#875)
* [DYNAREC] Add one more missing void to a function prototype. * [DYNAREC] Add a missing return in arm64_print(). * [DYNAREC] Use an intermediate register for PUSH RSP. To avoid undefined behavior, similar to POP RSP.
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/arm64_printer.c | 1 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 7 | ||||
| -rw-r--r-- | src/dynarec/dynarec_next.h | 6 |
3 files changed, 10 insertions, 4 deletions
diff --git a/src/dynarec/arm64/arm64_printer.c b/src/dynarec/arm64/arm64_printer.c index 5bace025..ead54a61 100755 --- a/src/dynarec/arm64/arm64_printer.c +++ b/src/dynarec/arm64/arm64_printer.c @@ -1523,6 +1523,7 @@ const char* arm64_print(uint32_t opcode, uintptr_t addr) // DMB ISH if(isMask(opcode, "11010101000000110011nnnn10111111", &a)) { snprintf(buff, sizeof(buff), "DMB %s", (Rn==0b1011)?"ISH":"???"); + return buff; } diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 5375e78a..3269ac1b 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -585,7 +585,12 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin dyn->doublepush = 1; } } else { - PUSH1z(gd); + if (gd == xRSP) { + MOVz_REG(x1, xRSP); + PUSH1z(x1); + } else { + PUSH1z(gd); + } } } break; diff --git a/src/dynarec/dynarec_next.h b/src/dynarec/dynarec_next.h index 0ad6c18d..dc37aadb 100644 --- a/src/dynarec/dynarec_next.h +++ b/src/dynarec/dynarec_next.h @@ -4,21 +4,21 @@ #ifdef ARM64 void arm64_next(void) EXPORTDYN; void arm64_prolog(x64emu_t* emu, void* addr) EXPORTDYN; -void arm64_epilog() EXPORTDYN; +void arm64_epilog(void) EXPORTDYN; #define native_next arm64_next #define native_prolog arm64_prolog #define native_epilog arm64_epilog #elif defined(LA464) void la464_next(void) EXPORTDYN; void la464_prolog(x64emu_t* emu, void* addr) EXPORTDYN; -void la464_epilog() EXPORTDYN; +void la464_epilog(void) EXPORTDYN; #define native_next la464_next #define native_prolog la464_prolog #define native_epilog la464_epilog #elif defined(RV64) void rv64_next(void) EXPORTDYN; void rv64_prolog(x64emu_t* emu, void* addr) EXPORTDYN; -void rv64_epilog() EXPORTDYN; +void rv64_epilog(void) EXPORTDYN; #define native_next rv64_next #define native_prolog rv64_prolog #define native_epilog rv64_epilog |