about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAlexandre Julliard <julliard@winehq.org>2023-06-28 17:50:14 +0200
committerGitHub <noreply@github.com>2023-06-28 17:50:14 +0200
commit1f65d3add7cc97ee5276470ff47ff591fb903034 (patch)
tree20aa1f2428dacc76e7bba2711292fbbeb3edd0e0
parent3b9772471724e663acc29fa22d466486a7539071 (diff)
downloadbox64-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.
-rwxr-xr-xsrc/dynarec/arm64/arm64_printer.c1
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c7
-rw-r--r--src/dynarec/dynarec_next.h6
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