about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-14 17:29:22 +0800
committerGitHub <noreply@github.com>2025-04-14 11:29:22 +0200
commitee530a73319423f7613304cf8c980fbabd89c5ae (patch)
treeb6efd6f08b0d39904a4e34b783e5ebe428099481
parentb7cb36d362861cf857a6958c13c2357657c1d967 (diff)
downloadbox64-ee530a73319423f7613304cf8c980fbabd89c5ae.tar.gz
box64-ee530a73319423f7613304cf8c980fbabd89c5ae.zip
[WOW64] More tweaks for PE build (#2528)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_arch.c5
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c5
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass3.h9
-rw-r--r--src/dynarec/dynablock.c50
-rw-r--r--src/dynarec/dynarec.c2
-rw-r--r--src/dynarec/dynarec_native_pass.c4
-rw-r--r--src/dynarec/la64/dynarec_la64_pass3.h6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_arch.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass3.h6
-rw-r--r--src/emu/x64run.c5
-rw-r--r--src/emu/x64run67avx.c1
-rw-r--r--src/emu/x64run_private.c3
-rw-r--r--src/emu/x64runavx.c1
-rw-r--r--src/emu/x64runavx0f.c7
-rw-r--r--src/emu/x64runavxf20f.c1
-rw-r--r--src/emu/x64runavxf20f38.c1
-rw-r--r--src/emu/x64runavxf20f3a.c1
-rw-r--r--src/emu/x64runavxf30f.c7
-rw-r--r--src/emu/x64runavxf30f38.c1
-rw-r--r--src/emu/x64runavxf30f3a.c1
-rw-r--r--src/emu/x64runf30f.c10
-rw-r--r--src/emu/x64trace.c1
-rw-r--r--src/include/dynablock.h3
-rw-r--r--src/include/os.h11
-rw-r--r--src/libtools/signal32.c4
-rw-r--r--src/libtools/signals.c48
-rw-r--r--src/os/os_linux.c7
-rw-r--r--src/os/os_wine.c5
-rw-r--r--wow64/CMakeLists.txt118
30 files changed, 218 insertions, 111 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c
index 0a22ac90..24f127f5 100644
--- a/src/dynarec/arm64/dynarec_arm64_00.c
+++ b/src/dynarec/arm64/dynarec_arm64_00.c
@@ -19,7 +19,7 @@
 #include "../dynablock_private.h"
 #include "custommem.h"
 #include "alternate.h"
-
+#include "mysignal.h"
 #include "arm64_printer.h"
 #include "dynarec_arm64_private.h"
 #include "dynarec_arm64_functions.h"
diff --git a/src/dynarec/arm64/dynarec_arm64_arch.c b/src/dynarec/arm64/dynarec_arm64_arch.c
index 3ff8d073..0df40b2b 100644
--- a/src/dynarec/arm64/dynarec_arm64_arch.c
+++ b/src/dynarec/arm64/dynarec_arm64_arch.c
@@ -1,7 +1,6 @@
 #include <stddef.h>
 #include <stdio.h>
 #include <signal.h>
-#include <ucontext.h>
 #include <string.h>
 
 #include "debug.h"
@@ -155,7 +154,7 @@ static int arch_build(dynarec_arm_t* dyn, int ninst, arch_build_t* arch)
         arch->x87 = 1;
         arch->x87_.delta = dyn->insts[ninst].n.x87stack;
     }
-    // opcode can handle unaligned 
+    // opcode can handle unaligned
     arch->unaligned = dyn->insts[ninst].unaligned;
     return arch->flags + arch->x87 + arch->mmx + arch->sse + arch->ymm + arch->unaligned;
 }
@@ -251,8 +250,6 @@ void* populate_arch(dynarec_arm_t* dyn, void* p, size_t tot_sz)
     return p;
 }
 
-int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); // define is signal.c
-
 // NZCV N
 #define NZCV_N      31
 // NZCV Z
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c
index 9a514ad1..cdfcb645 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.c
+++ b/src/dynarec/arm64/dynarec_arm64_functions.c
@@ -18,7 +18,6 @@
 #include "emu/x64run_private.h"
 #include "emu/x87emu_private.h"
 #include "x64trace.h"
-#include "signals.h"
 #include "dynarec_native.h"
 #include "dynarec_arm64_private.h"
 #include "dynarec_arm64_functions.h"
@@ -1046,7 +1045,7 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags)
             return 0;
         // update used flags
         //used_flags |= (flag2native(dyn->insts[ninst].x64.need_after)&flags);
-        
+
         // go next
         if(!dyn->insts[ninst].x64.has_next) {
             // check if it's a jump to an opcode with only 1 preds, then just follow the jump
@@ -1152,7 +1151,7 @@ int nativeFlagsNeedsTransform(dynarec_arm_t* dyn, int ninst)
     flags_x86 &= ~flags_after;
     if((flags_before&NF_CF) && (flags_after&NF_CF) && (nc_before!=nc_after))
         return 1;
-    // all flags_after should be present and none remaining flags_x86 
+    // all flags_after should be present and none remaining flags_x86
     if(((flags_before&flags_after)!=flags_after) || (flags_before&flags_x86))
         return 1;
     return 0;
diff --git a/src/dynarec/arm64/dynarec_arm64_pass3.h b/src/dynarec/arm64/dynarec_arm64_pass3.h
index a0d79f30..3f5d3900 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass3.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass3.h
@@ -1,4 +1,4 @@
-#define INIT    
+#define INIT
 #define FINI        \
     if(ninst)       \
         addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \
@@ -12,14 +12,17 @@
         dyn->insts[ninst].size2 += 4;                   \
     }while(0)
 
-#define MESSAGE(A, ...)  if(BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__)
+#define MESSAGE(A, ...)                                                   \
+    do {                                                                  \
+        if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \
+    } while (0)
 #define NEW_INST        \
     if(ninst) {                                                  \
         if(dyn->insts[ninst].address!=(uintptr_t)dyn->block-(uintptr_t)dyn->native_start) dyn->abort = 1;   \
         addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \
         dyn->insts[ninst].ymm0_pass3 = dyn->ymm_zero;   \
     }
-#define INST_EPILOG     
+#define INST_EPILOG
 #define INST_NAME(name) inst_name_pass3(dyn, ninst, name, rex)
 #define TABLE64(A, V)   {int val64offset = Table64(dyn, (V), 3); MESSAGE(LOG_DUMP, "  Table64: 0x%lx\n", (V)); LDRx_literal(A, val64offset);}
 #define FTABLE64(A, V)  {mmx87_regs_t v = {.d = V}; int val64offset = Table64(dyn, v.q, 3); MESSAGE(LOG_DUMP, "  FTable64: %g\n", v.d); VLDR64_literal(A, val64offset);}
diff --git a/src/dynarec/dynablock.c b/src/dynarec/dynablock.c
index 561ab529..9bc13ffe 100644
--- a/src/dynarec/dynablock.c
+++ b/src/dynarec/dynablock.c
@@ -368,3 +368,53 @@ dynablock_t* DBAlternateBlock(x64emu_t* emu, uintptr_t addr, uintptr_t filladdr,
         emu->test.test = 0;
     return db;
 }
+
+uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr)
+{
+    uintptr_t x64addr = (uintptr_t)db->x64_addr;
+    uintptr_t armaddr = (uintptr_t)db->block;
+    if (native_addr < (uintptr_t)db->block || native_addr > (uintptr_t)db->block + db->size)
+        return 0;
+    int i = 0;
+    do {
+        int x64sz = 0;
+        int armsz = 0;
+        do {
+            x64sz += db->instsize[i].x64;
+            armsz += db->instsize[i].nat * 4;
+            ++i;
+        } while ((db->instsize[i - 1].x64 == 15) || (db->instsize[i - 1].nat == 15));
+        // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find
+        if ((native_addr >= armaddr) && (native_addr < (armaddr + armsz)))
+            return x64addr;
+        armaddr += armsz;
+        x64addr += x64sz;
+    } while (db->instsize[i].x64 || db->instsize[i].nat);
+    return x64addr;
+}
+
+int getX64AddressInst(dynablock_t* db, uintptr_t x64pc)
+{
+    uintptr_t x64addr = (uintptr_t)db->x64_addr;
+    uintptr_t armaddr = (uintptr_t)db->block;
+    int ret = 0;
+    if (x64pc < (uintptr_t)db->x64_addr || x64pc > (uintptr_t)db->x64_addr + db->x64_size)
+        return -1;
+    int i = 0;
+    do {
+        int x64sz = 0;
+        int armsz = 0;
+        do {
+            x64sz += db->instsize[i].x64;
+            armsz += db->instsize[i].nat * 4;
+            ++i;
+        } while ((db->instsize[i - 1].x64 == 15) || (db->instsize[i - 1].nat == 15));
+        // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find
+        if ((x64pc >= x64addr) && (x64pc < (x64addr + x64sz)))
+            return ret;
+        armaddr += armsz;
+        x64addr += x64sz;
+        ret++;
+    } while (db->instsize[i].x64 || db->instsize[i].nat);
+    return ret;
+}
\ No newline at end of file
diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c
index 8c246f70..2356f451 100644
--- a/src/dynarec/dynarec.c
+++ b/src/dynarec/dynarec.c
@@ -28,8 +28,6 @@
 #endif
 
 #ifdef DYNAREC
-uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr);
-
 void* LinkNext(x64emu_t* emu, uintptr_t addr, void* x2, uintptr_t* x3)
 {
     int is32bits = (R_CS == 0x23);
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 99cb2449..be9c5fe9 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -4,6 +4,7 @@
 #include <errno.h>
 #include <string.h>
 
+#include "os.h"
 #include "debug.h"
 #include "box64context.h"
 #include "box64cpu.h"
@@ -16,7 +17,6 @@
 #include "dynarec_native.h"
 #include "dynablock_private.h"
 #include "custommem.h"
-#include "elfloader.h"
 #include "x64test.h"
 
 #include "dynarec_arch.h"
@@ -57,7 +57,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
     ARCH_INIT();
     int reset_n = -1; // -1 no reset; -2 reset to 0; else reset to the state of reset_n
     dyn->last_ip = (alternate || (dyn->insts && dyn->insts[0].pred_sz))?0:ip;  // RIP is always set at start of block unless there is a predecessor!
-    int stopblock = 2 + ((FindElfAddress(my_context, addr) || IsAddrFileMapped(addr, NULL, NULL)) ? 0 : 1);            // if block is in elf memory or file mapped memory, it can be extended with BOX64DRENV(dynarec_bigblock)==2, else it needs 3
+    int stopblock = 2 + !IsAddrElfOrFileMapped(addr);                          // if block is in elf memory or file mapped memory, it can be extended with BOX64DRENV(dynarec_bigblock)==2, else it needs 3
     // ok, go now
     INIT;
     #if STEP == 0
diff --git a/src/dynarec/la64/dynarec_la64_pass3.h b/src/dynarec/la64/dynarec_la64_pass3.h
index 4fe3d247..900e95d3 100644
--- a/src/dynarec/la64/dynarec_la64_pass3.h
+++ b/src/dynarec/la64/dynarec_la64_pass3.h
@@ -13,8 +13,10 @@
         dyn->insts[ninst].size2 += 4;                                          \
     } while (0)
 
-#define MESSAGE(A, ...) \
-    if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__)
+#define MESSAGE(A, ...)                                                   \
+    do {                                                                  \
+        if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \
+    } while (0)
 #define NEW_INST \
     if (ninst) {  \
         addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst - 1].x64.size, dyn->insts[ninst - 1].size / 4); \
diff --git a/src/dynarec/rv64/dynarec_rv64_arch.c b/src/dynarec/rv64/dynarec_rv64_arch.c
index e9065657..1bd30759 100644
--- a/src/dynarec/rv64/dynarec_rv64_arch.c
+++ b/src/dynarec/rv64/dynarec_rv64_arch.c
@@ -83,7 +83,7 @@ static int arch_build(dynarec_rv64_t* dyn, int ninst, arch_build_t* arch)
 {
     memset(arch, 0, sizeof(arch_build_t));
     // todo
-    // opcode can handle unaligned 
+    // opcode can handle unaligned
     arch->unaligned = dyn->insts[ninst].unaligned;
     return arch->flags + arch->x87 + arch->mmx + arch->sse + arch->ymm + arch->unaligned;
 }
@@ -168,8 +168,6 @@ void* populate_arch(dynarec_rv64_t* dyn, void* p, size_t sz)
     return p;
 }
 
-int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); // define is signal.c
-
 void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc)
 {
     if(!db->arch_size || !db->arch)
diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h
index 5176c5c4..b5deb451 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass3.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass3.h
@@ -12,8 +12,10 @@
         dyn->insts[ninst].size2 += 4;                                        \
     } while (0)
 
-#define MESSAGE(A, ...) \
-    if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__)
+#define MESSAGE(A, ...)                                                   \
+    do {                                                                  \
+        if (BOX64DRENV(dynarec_dump)) dynarec_log(LOG_NONE, __VA_ARGS__); \
+    } while (0)
 #define NEW_INST                                                                                                  \
     dyn->vector_sew = dyn->insts[ninst].vector_sew_entry;                                                         \
     dyn->inst_sew = dyn->vector_sew;                                                                              \
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 4e75641d..40768f27 100644
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -21,6 +21,7 @@
 #include "box64context.h"
 #include "alternate.h"
 #include "emit_signals.h"
+#include "mysignal.h"
 #ifdef DYNAREC
 #include "../dynarec/native_lock.h"
 #endif
@@ -1375,7 +1376,7 @@ x64emurun:
             if(rex.is32bits && !(MODREG)) {
                 GETED(0);
                 GETGD;
-                emu->segs[_ES] = *(__uint16_t*)(((char*)ED)+4);
+                emu->segs[_ES] = *(uint16_t*)(((char*)ED) + 4);
                 emu->segs_serial[_ES] = 0;
                 GD->dword[0] = *(uint32_t*)ED;
             } else {
@@ -1410,7 +1411,7 @@ x64emurun:
             if(rex.is32bits && !(MODREG)) {
                 GETED(0);
                 GETGD;
-                emu->segs[_DS] = *(__uint16_t*)(((char*)ED)+4);
+                emu->segs[_DS] = *(uint16_t*)(((char*)ED) + 4);
                 emu->segs_serial[_DS] = 0;
                 GD->dword[0] = *(uint32_t*)ED;
             } else {
diff --git a/src/emu/x64run67avx.c b/src/emu/x64run67avx.c
index de275c92..854ff614 100644
--- a/src/emu/x64run67avx.c
+++ b/src/emu/x64run67avx.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #include "x64shaext.h"
 #ifdef DYNAREC
 #include "custommem.h"
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 36d72642..e3760cc0 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1,5 +1,4 @@
-#define _GNU_SOURCE         /* See feature_test_macros(7) */
-#include <dlfcn.h>
+#define _GNU_SOURCE /* See feature_test_macros(7) */
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
diff --git a/src/emu/x64runavx.c b/src/emu/x64runavx.c
index 9651e924..6a39e5a9 100644
--- a/src/emu/x64runavx.c
+++ b/src/emu/x64runavx.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #include "x64shaext.h"
 #ifdef DYNAREC
 #include "custommem.h"
diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c
index 3da790c8..dc20399a 100644
--- a/src/emu/x64runavx0f.c
+++ b/src/emu/x64runavx0f.c
@@ -30,11 +30,6 @@
 
 #include "modrm.h"
 
-#ifdef __clang__
-extern int isinff(float);
-extern int isnanf(float);
-#endif
-
 #ifdef TEST_INTERPRETER
 uintptr_t TestAVX_0F(x64test_t *test, vex_t vex, uintptr_t addr, int *step)
 #else
@@ -149,7 +144,7 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 GY->u128 = 0;
             break;
         case 0x16:
-            nextop = F8;               
+            nextop = F8;
             GETEX(0);
             GETGX;
             GETVX;
diff --git a/src/emu/x64runavxf20f.c b/src/emu/x64runavxf20f.c
index 55da18dc..e5dd33ad 100644
--- a/src/emu/x64runavxf20f.c
+++ b/src/emu/x64runavxf20f.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #include "x64shaext.h"
 #ifdef DYNAREC
 #include "custommem.h"
diff --git a/src/emu/x64runavxf20f38.c b/src/emu/x64runavxf20f38.c
index 276ccbfd..cf6d7286 100644
--- a/src/emu/x64runavxf20f38.c
+++ b/src/emu/x64runavxf20f38.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #ifdef DYNAREC
 #include "custommem.h"
 #include "../dynarec/native_lock.h"
diff --git a/src/emu/x64runavxf20f3a.c b/src/emu/x64runavxf20f3a.c
index f9691fe4..22225d48 100644
--- a/src/emu/x64runavxf20f3a.c
+++ b/src/emu/x64runavxf20f3a.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #ifdef DYNAREC
 #include "custommem.h"
 #include "../dynarec/native_lock.h"
diff --git a/src/emu/x64runavxf30f.c b/src/emu/x64runavxf30f.c
index 9b2ab7a7..6b630544 100644
--- a/src/emu/x64runavxf30f.c
+++ b/src/emu/x64runavxf30f.c
@@ -9,6 +9,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
+#include "os.h"
 #include "debug.h"
 #include "box64stack.h"
 #include "x64emu.h"
@@ -20,7 +21,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #include "x64shaext.h"
 #ifdef DYNAREC
 #include "custommem.h"
@@ -29,11 +29,6 @@
 
 #include "modrm.h"
 
-#ifdef __clang__
-extern int isinff(float);
-extern int isnanf(float);
-#endif
-
 #ifdef TEST_INTERPRETER
 uintptr_t TestAVX_F30F(x64test_t *test, vex_t vex, uintptr_t addr, int *step)
 #else
diff --git a/src/emu/x64runavxf30f38.c b/src/emu/x64runavxf30f38.c
index 4dbdbbd5..975977d7 100644
--- a/src/emu/x64runavxf30f38.c
+++ b/src/emu/x64runavxf30f38.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #ifdef DYNAREC
 #include "custommem.h"
 #include "../dynarec/native_lock.h"
diff --git a/src/emu/x64runavxf30f3a.c b/src/emu/x64runavxf30f3a.c
index 0100c3c8..9bd0b9f0 100644
--- a/src/emu/x64runavxf30f3a.c
+++ b/src/emu/x64runavxf30f3a.c
@@ -20,7 +20,6 @@
 #include "box64context.h"
 #include "my_cpuid.h"
 #include "bridge.h"
-#include "signals.h"
 #ifdef DYNAREC
 #include "custommem.h"
 #include "../dynarec/native_lock.h"
diff --git a/src/emu/x64runf30f.c b/src/emu/x64runf30f.c
index f4d7d0a6..4eb5a539 100644
--- a/src/emu/x64runf30f.c
+++ b/src/emu/x64runf30f.c
@@ -9,6 +9,7 @@
 #include <sys/types.h>

 #include <unistd.h>

 

+#include "os.h"

 #include "debug.h"

 #include "box64stack.h"

 #include "x64emu.h"

@@ -43,11 +44,6 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
     #endif

     int is_nan;

 

-    #ifdef __clang__

-    extern int isinff(float);

-    extern int isnanf(float);

-    #endif

-

     opcode = F8;

 

     switch(opcode) {

@@ -75,7 +71,7 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
         GX->ud[1] = GX->ud[0] = EX->ud[0];

         GX->ud[3] = GX->ud[2] = EX->ud[2];

         break;

-    

+

     case 0x16:  /* MOVSHDUP Gx, Ex */

         nextop = F8;

         GETEX(0);

@@ -176,7 +172,7 @@ uintptr_t RunF30F(x64emu_t *emu, rex_t rex, uintptr_t addr)
             GD->dword[1] = 0;

         }

         break;

-    

+

     case 0x38:  /* MAP 0F38 */

         opcode = F8;

         switch(opcode) {

diff --git a/src/emu/x64trace.c b/src/emu/x64trace.c
index e14f22df..fb8b205b 100644
--- a/src/emu/x64trace.c
+++ b/src/emu/x64trace.c
@@ -1,7 +1,6 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <dlfcn.h>
 
 #include "debug.h"
 #include "x64trace.h"
diff --git a/src/include/dynablock.h b/src/include/dynablock.h
index b9aeddc0..551a223e 100644
--- a/src/include/dynablock.h
+++ b/src/include/dynablock.h
@@ -24,4 +24,7 @@ void cancelFillBlock(void);
 // clear instruction cache on a range
 void ClearCache(void* start, size_t len);
 
+uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr);
+int getX64AddressInst(dynablock_t* db, uintptr_t x64pc);
+
 #endif //__DYNABLOCK_H_
\ No newline at end of file
diff --git a/src/include/os.h b/src/include/os.h
index f6e7371d..d4566305 100644
--- a/src/include/os.h
+++ b/src/include/os.h
@@ -9,7 +9,6 @@
 #include <sys/mman.h>
 #else
 typedef __int64 ssize_t;
-
 #define dlsym(a, b) NULL
 
 #define PROT_READ  0x1
@@ -49,6 +48,8 @@ void EmuInt3(void* emu, void* addr);
 void* EmuFork(void* emu, int forktype);
 
 void PersonalityAddrLimit32Bit(void);
+
+int IsAddrElfOrFileMapped(uintptr_t addr);
 // ----------------------------------------------------------------
 
 #ifndef _WIN32
@@ -81,4 +82,12 @@ void PersonalityAddrLimit32Bit(void);
 #define PROT_WRITE 0x2
 #define PROT_EXEC  0x4
 
+#if defined(__clang__) && !defined(_WIN32)
+extern int isinff(float);
+extern int isnanf(float);
+#elif defined(_WIN32)
+#define isnanf _isnanf
+#define isinff isinf
+#endif
+
 #endif //__OS_H_
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c
index f19ecb17..56c844ab 100644
--- a/src/libtools/signal32.c
+++ b/src/libtools/signal32.c
@@ -306,10 +306,6 @@ typedef struct __attribute__((packed, aligned(4))) my_siginfo32_s
     } _sifields;
 } my_siginfo32_t;
 
-#ifdef DYNAREC
-uintptr_t getX64Address(dynablock_t* db, uintptr_t arm_addr);
-#endif
-
 x64_stack_t* sigstack_getstack();
 int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss);
 EXPORT int my32_sigaltstack(x64emu_t* emu, const i386_stack_t* ss, i386_stack_t* oss)
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index cacf19b5..b924a32f 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -484,54 +484,6 @@ EXPORT int my_sigaltstack(x64emu_t* emu, const x64_stack_t* ss, x64_stack_t* oss
 }
 
 #ifdef DYNAREC
-uintptr_t getX64Address(dynablock_t* db, uintptr_t native_addr)
-{
-    uintptr_t x64addr = (uintptr_t)db->x64_addr;
-    uintptr_t armaddr = (uintptr_t)db->block;
-    if(native_addr<(uintptr_t)db->block || native_addr>(uintptr_t)db->block+db->size)
-        return 0;
-    int i = 0;
-    do {
-        int x64sz = 0;
-        int armsz = 0;
-        do {
-            x64sz+=db->instsize[i].x64;
-            armsz+=db->instsize[i].nat*4;
-            ++i;
-        } while((db->instsize[i-1].x64==15) || (db->instsize[i-1].nat==15));
-        // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find
-        if((native_addr>=armaddr) && (native_addr<(armaddr+armsz)))
-            return x64addr;
-        armaddr+=armsz;
-        x64addr+=x64sz;
-    } while(db->instsize[i].x64 || db->instsize[i].nat);
-    return x64addr;
-}
-int getX64AddressInst(dynablock_t* db, uintptr_t x64pc)
-{
-    uintptr_t x64addr = (uintptr_t)db->x64_addr;
-    uintptr_t armaddr = (uintptr_t)db->block;
-    int ret = 0;
-    if(x64pc<(uintptr_t)db->x64_addr || x64pc>(uintptr_t)db->x64_addr+db->x64_size)
-        return -1;
-    int i = 0;
-    do {
-        int x64sz = 0;
-        int armsz = 0;
-        do {
-            x64sz+=db->instsize[i].x64;
-            armsz+=db->instsize[i].nat*4;
-            ++i;
-        } while((db->instsize[i-1].x64==15) || (db->instsize[i-1].nat==15));
-        // if the opcode is a NOP on ARM side (so armsz==0), it cannot be an address to find
-        if((x64pc>=x64addr) && (x64pc<(x64addr+x64sz)))
-            return ret;
-        armaddr+=armsz;
-        x64addr+=x64sz;
-        ret++;
-    } while(db->instsize[i].x64 || db->instsize[i].nat);
-    return ret;
-}
 x64emu_t* getEmuSignal(x64emu_t* emu, ucontext_t* p, dynablock_t* db)
 {
 #if defined(ARM64)
diff --git a/src/os/os_linux.c b/src/os/os_linux.c
index daef3807..6d9db214 100644
--- a/src/os/os_linux.c
+++ b/src/os/os_linux.c
@@ -8,6 +8,8 @@
 #include "signals.h"
 #include "emu/x64int_private.h"
 #include "bridge.h"
+#include "elfloader.h"
+#include "env.h"
 
 int GetTID(void)
 {
@@ -54,6 +56,11 @@ void PersonalityAddrLimit32Bit(void)
     personality(ADDR_LIMIT_32BIT);
 }
 
+int IsAddrElfOrFileMapped(uintptr_t addr)
+{
+    return FindElfAddress(my_context, addr) || IsAddrFileMapped(addr, NULL, NULL);
+}
+
 void* InternalMmap(void* addr, unsigned long length, int prot, int flags, int fd, ssize_t offset)
 {
 #if 1 // def STATICBUILD
diff --git a/src/os/os_wine.c b/src/os/os_wine.c
index baafc669..7e3c58fb 100644
--- a/src/os/os_wine.c
+++ b/src/os/os_wine.c
@@ -19,6 +19,11 @@ int IsBridgeSignature(char s, char c)
 
 void PersonalityAddrLimit32Bit(void) { }
 
+int IsAddrElfOrFileMapped(uintptr_t addr)
+{
+    return 0;
+}
+
 ULONG_PTR default_zero_bits32 = 0x7fffffff;
 
 static uint32_t prot_unix_to_win32(uint32_t unx)
diff --git a/wow64/CMakeLists.txt b/wow64/CMakeLists.txt
index be045828..a9c36eea 100644
--- a/wow64/CMakeLists.txt
+++ b/wow64/CMakeLists.txt
@@ -23,14 +23,117 @@ set(DYNAREC_ASM_SRC
 
 set_source_files_properties(${DYNAREC_ASM_SRC} PROPERTIES COMPILE_OPTIONS "-mcpu=cortex-a76")
 
+set(DYNAREC_PASS_SRC
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_00.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_0f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_64.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_660f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_6664.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f0.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f20f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_66f30f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67_32.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67_avx.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_67.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_6764_32.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_0f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_0f38.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_66_0f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_66_0f38.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_66_0f3a.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f2_0f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f2_0f38.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f2_0f3a.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f3_0f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx_f3_0f38.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_avx.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d8.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_d9.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_da.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_db.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_dc.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_dd.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_de.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_df.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_logic.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_math.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_shift.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_emit_tests.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f0.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f20f.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_f30f.c"
+    "${BOX64_ROOT}/src/dynarec/dynarec_native_pass.c"
+)
+
+foreach(STEP_VALUE RANGE 3)
+    add_library(dynarec_pass${STEP_VALUE} OBJECT ${DYNAREC_PASS_SRC})
+    target_compile_definitions(dynarec_pass${STEP_VALUE} PRIVATE STEP=${STEP_VALUE})
+endforeach()
+
+set(INTERPRETER_SRC
+    "${BOX64_ROOT}/src/emu/x64run.c"
+    "${BOX64_ROOT}/src/emu/x64run0f.c"
+    "${BOX64_ROOT}/src/emu/x64run64.c"
+    "${BOX64_ROOT}/src/emu/x64run66.c"
+    "${BOX64_ROOT}/src/emu/x64run660f.c"
+    "${BOX64_ROOT}/src/emu/x64run66f20f.c"
+    "${BOX64_ROOT}/src/emu/x64run66f30f.c"
+    "${BOX64_ROOT}/src/emu/x64run6664.c"
+    "${BOX64_ROOT}/src/emu/x64run66d9.c"
+    "${BOX64_ROOT}/src/emu/x64run66dd.c"
+    "${BOX64_ROOT}/src/emu/x64run66f0.c"
+    "${BOX64_ROOT}/src/emu/x64run67.c"
+    "${BOX64_ROOT}/src/emu/x64run67avx.c"
+    "${BOX64_ROOT}/src/emu/x64run67_32.c"
+    "${BOX64_ROOT}/src/emu/x64run6764_32.c"
+    "${BOX64_ROOT}/src/emu/x64run670f.c"
+    "${BOX64_ROOT}/src/emu/x64run6766.c"
+    "${BOX64_ROOT}/src/emu/x64run67660f.c"
+    "${BOX64_ROOT}/src/emu/x64rund8.c"
+    "${BOX64_ROOT}/src/emu/x64rund9.c"
+    "${BOX64_ROOT}/src/emu/x64runda.c"
+    "${BOX64_ROOT}/src/emu/x64rundb.c"
+    "${BOX64_ROOT}/src/emu/x64rundc.c"
+    "${BOX64_ROOT}/src/emu/x64rundd.c"
+    "${BOX64_ROOT}/src/emu/x64runde.c"
+    "${BOX64_ROOT}/src/emu/x64rundf.c"
+    "${BOX64_ROOT}/src/emu/x64runf0.c"
+    "${BOX64_ROOT}/src/emu/x64runf20f.c"
+    "${BOX64_ROOT}/src/emu/x64runf30f.c"
+    "${BOX64_ROOT}/src/emu/x64runavx.c"
+    "${BOX64_ROOT}/src/emu/x64runavx0f.c"
+    "${BOX64_ROOT}/src/emu/x64runavx0f38.c"
+    "${BOX64_ROOT}/src/emu/x64runavx660f.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf20f.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf30f.c"
+    "${BOX64_ROOT}/src/emu/x64runavx660f38.c"
+    "${BOX64_ROOT}/src/emu/x64runavx660f3a.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf20f38.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf30f38.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf20f3a.c"
+    "${BOX64_ROOT}/src/emu/x64runavxf30f3a.c"
+)
+
+add_library(test_interpreter OBJECT ${INTERPRETER_SRC})
+set_target_properties(test_interpreter PROPERTIES COMPILE_DEFINITIONS "TEST_INTERPRETER")
+
 set(BOX64CPU_SRC
     "${BOX64_ROOT}/src/custommem.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_arch.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_functions.c"
+    "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_helper.c"
     "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_jmpnext.c"
-    "${BOX64_ROOT}/src/emu/x64emu.c"
-    "${BOX64_ROOT}/src/emu/x87emu_private.c"
     "${BOX64_ROOT}/src/dynarec/dynablock.c"
     "${BOX64_ROOT}/src/dynarec/dynarec_native_functions.c"
     "${BOX64_ROOT}/src/dynarec/dynarec_native.c"
+    "${BOX64_ROOT}/src/dynarec/dynarec.c"
+    "${BOX64_ROOT}/src/emu/x64compstrings.c"
+    "${BOX64_ROOT}/src/emu/x64emu.c"
+    "${BOX64_ROOT}/src/emu/x64primop.c"
+    "${BOX64_ROOT}/src/emu/x64shaext.c"
+    "${BOX64_ROOT}/src/emu/x64trace.c"
+    "${BOX64_ROOT}/src/emu/x87emu_private.c"
     "${BOX64_ROOT}/src/os/backtrace.c"
     "${BOX64_ROOT}/src/os/os_wine.c"
     "${BOX64_ROOT}/src/os/symbolfuncs_wine.c"
@@ -38,15 +141,20 @@ set(BOX64CPU_SRC
     "${BOX64_ROOT}/src/tools/rbtree.c"
 )
 
-add_library(wowbox64 SHARED ${MAIN_SRC} ${BOX64CPU_SRC} ${DYNAREC_ASM_SRC})
+add_library(wowbox64 SHARED ${MAIN_SRC} ${BOX64CPU_SRC} ${INTERPRETER_SRC} ${DYNAREC_ASM_SRC}
+    $<TARGET_OBJECTS:dynarec_pass0>
+    $<TARGET_OBJECTS:dynarec_pass1>
+    $<TARGET_OBJECTS:dynarec_pass2>
+    $<TARGET_OBJECTS:dynarec_pass3>
+    $<TARGET_OBJECTS:test_interpreter>)
 
-target_include_directories(wowbox64 PRIVATE
+include_directories(
     "${BOX64_ROOT}/src/include"
     "${BOX64_ROOT}/src"
 )
 
 # always enable DynaRec, only supports ARM64 for now.
-target_compile_definitions(wowbox64 PRIVATE DYNAREC ARM64)
+add_compile_definitions(DYNAREC ARM64)
 target_link_libraries(wowbox64 PRIVATE winpthread)