about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-30 10:43:39 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-30 10:43:39 +0200
commit84498707dd4341607f1495cd131e4177e4e8cac3 (patch)
treefe6c9e1338a9ec01f559e7973ced12f10cf962fd /src
parentd29be5fd143cd75d1540df3a0891132c5d604a09 (diff)
downloadbox64-84498707dd4341607f1495cd131e4177e4e8cac3.tar.gz
box64-84498707dd4341607f1495cd131e4177e4e8cac3.zip
[ARM64_DYNAREC] Small improvment on Wine INT n handling
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 8557af3f..7b227e24 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -2662,17 +2662,24 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             MARK;
             LOAD_XEMU_REM();
             jump_to_epilog(dyn, 0, xRIP, ninst);
-            break;
-            #endif
-            if(box64_wine && (u8==0x2D || u8==0x2C || u8==0x29)) {
-                INST_NAME("INT 29/2c/2d");
+            #else
+            if(box64_wine && (u8==0x2E || u8==0x2D || u8==0x2C || u8==0x29)) {
+                INST_NAME("INT 29/2c/2d/2e");
                 // lets do nothing
-                MESSAGE(LOG_INFO, "INT 29/2c/2d Windows interruption\n");
+                MESSAGE(LOG_INFO, "INT 29/2c/2d/2e Windows interruption\n");
                 GETIP(ip);  // priviledged instruction, IP not updated
                 STORE_XEMU_CALL(xRIP);
                 MOV32w(x1, u8);
                 CALL(native_int, -1);
                 LOAD_XEMU_CALL(xRIP);
+                TABLE64(x3, addr); // expected return address
+                CMPSx_REG(xRIP, x3);
+                B_MARK(cNE);
+                LDRw_U12(w1, xEmu, offsetof(x64emu_t, quit));
+                CBZw_NEXT(w1);
+                MARK;
+                LOAD_XEMU_REM();
+                jump_to_epilog(dyn, 0, xRIP, ninst);
             } else if (u8==0x80) {
                 INST_NAME("32bits SYSCALL");
                 NOTEST(x1);
@@ -2723,6 +2730,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                 *need_epilog = 0;
                 *ok = 0;
             }
+            #endif
             break;
         case 0xCE:
             if(!rex.is32bits) {