about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-06-26 18:43:52 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-06-26 18:43:52 +0200
commitdc0ab611c46502f115dc68c5d924f4834511216a (patch)
treebcad1c146612e5eb6444a232aa1e587c4ca89bdd /src
parent5ddc93cf0dec903fb3aac1121861bd722acc6744 (diff)
downloadbox64-dc0ab611c46502f115dc68c5d924f4834511216a.tar.gz
box64-dc0ab611c46502f115dc68c5d924f4834511216a.zip
Added handling of INT 0x29 (__fastfail)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c8
-rwxr-xr-xsrc/emu/x64run.c6
2 files changed, 14 insertions, 0 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 8820136b..77a20622 100755
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -1972,6 +1972,14 @@ 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);
+            } else if(box64_wine && u8==0x29) {
+                INST_NAME("INT 0x29");
+                // __fastfail ignored!
+                MOV32w(x1, 1);
+                STRw_U12(x1, xEmu, offsetof(x64emu_t, quit));
+                jump_to_epilog(dyn, 0, xRIP, ninst);
+                *need_epilog = 0;
+                *ok = 0;
             } else {
                 INST_NAME("INT n");
                 SETFLAGS(X_ALL, SF_SET);    // Hack to set flags in "don't care" state
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 2e4264c8..bca01f1f 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -1378,6 +1378,12 @@ x64emurun:
             if(box64_wine && tmp8u==0x2D) {
                 // lets ignore the INT 2D
                 printf_log(LOG_DEBUG, "INT 2D called\n");
+            } else if(box64_wine && tmp8u==0x29) {
+                // INT 29 is __fastfail
+                printf_log(LOG_DEBUG, "INT 29 called => __fastfail(0x%x)\n", R_ECX);
+                emu->quit = 1;
+                R_RIP = addr;
+                goto fini;
             } else if (tmp8u==0x80) {
                 // 32bits syscall
                 #ifndef TEST_INTERPRETER