about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-10 18:14:50 +0800
committerGitHub <noreply@github.com>2025-04-10 12:14:50 +0200
commitf9f082ee53ae0ab8e12b0c1bf1de339af8b92282 (patch)
treeb040c5f88bf691cc67f7fc1bd9c8b4914ea4758b
parent66bb1aeb89d7ee64cad83ab12208b221ce5e9731 (diff)
downloadbox64-f9f082ee53ae0ab8e12b0c1bf1de339af8b92282.tar.gz
box64-f9f082ee53ae0ab8e12b0c1bf1de339af8b92282.zip
[WOW64] More work on the PE wow64 build (#2518)
* [WOW64] More work on the PE wow64 build

* added a TODO
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_arch.c2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_arch.h6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c1
-rw-r--r--src/dynarec/dynarec_native.c11
-rw-r--r--src/dynarec/la64/dynarec_la64_functions.c1
-rw-r--r--src/dynarec/rv64/dynarec_rv64_functions.c1
-rw-r--r--src/include/dynarec_native.h2
-rw-r--r--src/include/myalign.h2
-rw-r--r--src/include/mysignal.h3
-rw-r--r--src/include/perfmap.h6
-rw-r--r--src/libtools/threads.c5
-rwxr-xr-xsrc/libtools/threads32.c3
-rw-r--r--src/os/os_wine.c5
-rw-r--r--src/tools/perfmap.c21
-rw-r--r--wow64/CMakeLists.txt27
16 files changed, 59 insertions, 38 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b21d1e4f..8e426600 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -391,6 +391,7 @@ set(ELFLOADER_SRC
     "${BOX64_ROOT}/src/tools/alternate.c"
     "${BOX64_ROOT}/src/tools/callback.c"
     "${BOX64_ROOT}/src/tools/gdbjit.c"
+    "${BOX64_ROOT}/src/tools/perfmap.c"
     "${BOX64_ROOT}/src/tools/my_cpuid.c"
     "${BOX64_ROOT}/src/tools/fileutils.c"
     "${BOX64_ROOT}/src/tools/pathcoll.c"
diff --git a/src/dynarec/arm64/dynarec_arm64_arch.c b/src/dynarec/arm64/dynarec_arm64_arch.c
index 45093acd..3ff8d073 100644
--- a/src/dynarec/arm64/dynarec_arm64_arch.c
+++ b/src/dynarec/arm64/dynarec_arm64_arch.c
@@ -262,6 +262,7 @@ int getX64AddressInst(dynablock_t* db, uintptr_t x64pc); // define is signal.c
 // NZCV V
 #define NZCV_V      28
 
+#ifndef _WIN32 // TODO: Implemented this for Win32
 void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc)
 {
     if(!db->arch_size || !db->arch)
@@ -392,6 +393,7 @@ void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc)
     }
     dynarec_log_prefix(0, LOG_INFO, "\n");
 }
+#endif
 
 int arch_unaligned(dynablock_t* db, uintptr_t x64pc)
 {
diff --git a/src/dynarec/arm64/dynarec_arm64_arch.h b/src/dynarec/arm64/dynarec_arm64_arch.h
index 4463df6c..ccdd2121 100644
--- a/src/dynarec/arm64/dynarec_arm64_arch.h
+++ b/src/dynarec/arm64/dynarec_arm64_arch.h
@@ -2,7 +2,6 @@
 #define __DYNAREC_ARM_ARCH_H__
 
 #include <stddef.h>
-#include <ucontext.h>
 
 #include "x64emu.h"
 #include "box64context.h"
@@ -13,8 +12,13 @@
 size_t get_size_arch(dynarec_arm_t* dyn);
 //populate the array
 void* populate_arch(dynarec_arm_t* dyn, void* p, size_t sz);
+#ifndef _WIN32
+#include <ucontext.h>
 //adjust flags and more
 void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc);
+#else
+#define adjust_arch(db, emu, p, x64pc)
+#endif
 // get if instruction can be regenerated for unaligned access
 int arch_unaligned(dynablock_t* db, uintptr_t x64pc);
 #endif // __DYNAREC_ARM_ARCH_H__
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c
index 72c4a05e..9a514ad1 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.c
+++ b/src/dynarec/arm64/dynarec_arm64_functions.c
@@ -25,6 +25,7 @@
 #include "custommem.h"
 #include "bridge.h"
 #include "gdbjit.h"
+#include "perfmap.h"
 
 // Get a FPU scratch reg
 int fpu_get_scratch(dynarec_arm_t* dyn, int ninst)
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index df6ab348..197a163e 100644
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -18,7 +18,6 @@
 #include "x64trace.h"
 #include "dynablock.h"
 #include "dynablock_private.h"
-#include "elfloader.h"
 
 #include "dynarec_native.h"
 #include "dynarec_arch.h"
@@ -933,13 +932,3 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     //block->done = 1;
     return (void*)block;
 }
-
-void writePerfMap(uintptr_t func_addr, uintptr_t code_addr, size_t code_size, const char* inst_name)
-{
-    char pbuf[128];
-    uint64_t sz = 0;
-    uintptr_t start = 0;
-    const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, func_addr), (void*)func_addr, &start, &sz);
-    snprintf(pbuf, sizeof(pbuf), "0x%lx %ld %s:%s\n", code_addr, code_size, symbname, inst_name);
-    write(BOX64ENV(dynarec_perf_map_fd), pbuf, strlen(pbuf));
-}
diff --git a/src/dynarec/la64/dynarec_la64_functions.c b/src/dynarec/la64/dynarec_la64_functions.c
index c24e4f67..dfd95a12 100644
--- a/src/dynarec/la64/dynarec_la64_functions.c
+++ b/src/dynarec/la64/dynarec_la64_functions.c
@@ -25,6 +25,7 @@
 #include "custommem.h"
 #include "bridge.h"
 #include "gdbjit.h"
+#include "perfmap.h"
 #include "elfloader.h"
 
 #define XMM0 0
diff --git a/src/dynarec/rv64/dynarec_rv64_functions.c b/src/dynarec/rv64/dynarec_rv64_functions.c
index 9e8ed92b..8e289d5d 100644
--- a/src/dynarec/rv64/dynarec_rv64_functions.c
+++ b/src/dynarec/rv64/dynarec_rv64_functions.c
@@ -27,6 +27,7 @@
 #include "bridge.h"
 #include "rv64_lock.h"
 #include "gdbjit.h"
+#include "perfmap.h"
 
 #define XMM0 0
 #define X870 XMM0 + 16
diff --git a/src/include/dynarec_native.h b/src/include/dynarec_native.h
index 2754eed7..6e733eeb 100644
--- a/src/include/dynarec_native.h
+++ b/src/include/dynarec_native.h
@@ -26,6 +26,4 @@ void addInst(instsize_t* insts, size_t* size, int x64_size, int native_size);
 void CancelBlock64(int need_lock);
 void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bits, int inst_max);
 
-void writePerfMap(uintptr_t func_addr, uintptr_t code_addr, size_t code_size, const char* inst_name);
-
 #endif //__DYNAREC_ARM_H_
diff --git a/src/include/myalign.h b/src/include/myalign.h
index 8c6bcc06..ec7c6e70 100644
--- a/src/include/myalign.h
+++ b/src/include/myalign.h
@@ -2,6 +2,8 @@
 #define __MY_ALIGN__H_
 #include <stdint.h>
 
+#include "mysignal.h"
+
 typedef struct x64_va_list_s {
    unsigned int gp_offset;
    unsigned int fp_offset;
diff --git a/src/include/mysignal.h b/src/include/mysignal.h
index 5eb1b782..8d4f84a6 100644
--- a/src/include/mysignal.h
+++ b/src/include/mysignal.h
@@ -8,8 +8,9 @@ typedef struct {
     int a;
 } sigset_t;
 
+typedef sigset_t __sigset_t;
+
 #define sigfillset(x)
-#define pthread_sigmask(a, b, c)
 #endif
 
 #endif // __MYSIGNAL_H_
\ No newline at end of file
diff --git a/src/include/perfmap.h b/src/include/perfmap.h
new file mode 100644
index 00000000..574b3f2c
--- /dev/null
+++ b/src/include/perfmap.h
@@ -0,0 +1,6 @@
+#ifndef __PERFMAP_H__
+#define __PERFMAP_H__
+
+void writePerfMap(uintptr_t func_addr, uintptr_t code_addr, size_t code_size, const char* inst_name);
+
+#endif // __PERFMAP_H__
\ No newline at end of file
diff --git a/src/libtools/threads.c b/src/libtools/threads.c
index 02ada9ca..dfe92ab0 100644
--- a/src/libtools/threads.c
+++ b/src/libtools/threads.c
@@ -7,8 +7,6 @@
 #include <signal.h>
 #include <errno.h>
 #include <setjmp.h>
-#include <sys/mman.h>
-#include <dlfcn.h>
 
 #include "os.h"
 #include "debug.h"
@@ -67,9 +65,6 @@ typedef struct x64_unwind_buff_s {
 typedef void(*vFv_t)();
 
 KHASH_MAP_INIT_INT64(threadstack, threadstack_t*)
-#ifndef ANDROID
-KHASH_MAP_INIT_INT64(cancelthread, __pthread_unwind_buf_t*)
-#endif
 
 void CleanStackSize(box64context_t* context)
 {
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c
index 87187b24..c72deca7 100755
--- a/src/libtools/threads32.c
+++ b/src/libtools/threads32.c
@@ -90,9 +90,6 @@ static void del_attr(void* attr);
 typedef void(*vFv_t)();
 
 KHASH_MAP_INIT_INT(threadstack, threadstack_t)
-#ifndef ANDROID
-KHASH_MAP_INIT_INT(cancelthread, __pthread_unwind_buf_t*)
-#endif
 
 void CleanStackSize(box64context_t* context);
 void FreeStackSize(uintptr_t attr);
diff --git a/src/os/os_wine.c b/src/os/os_wine.c
index e5bc47b5..6f6eaf38 100644
--- a/src/os/os_wine.c
+++ b/src/os/os_wine.c
@@ -7,6 +7,11 @@ int GetTID(void)
     return GetCurrentThreadId();
 }
 
+int SchedYield(void)
+{
+    return SwitchToThread();
+}
+
 void PersonalityAddrLimit32Bit(void) { }
 
 ULONG_PTR default_zero_bits32 = 0x7fffffff;
diff --git a/src/tools/perfmap.c b/src/tools/perfmap.c
new file mode 100644
index 00000000..c3a9d0e3
--- /dev/null
+++ b/src/tools/perfmap.c
@@ -0,0 +1,21 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+#include "debug.h"
+#include "box64context.h"
+#include "perfmap.h"
+#include "elfloader.h"
+
+void writePerfMap(uintptr_t func_addr, uintptr_t code_addr, size_t code_size, const char* inst_name)
+{
+    char pbuf[128];
+    uint64_t sz = 0;
+    uintptr_t start = 0;
+    const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, func_addr), (void*)func_addr, &start, &sz);
+    snprintf(pbuf, sizeof(pbuf), "0x%lx %ld %s:%s\n", code_addr, code_size, symbname, inst_name);
+    write(BOX64ENV(dynarec_perf_map_fd), pbuf, strlen(pbuf));
+}
diff --git a/wow64/CMakeLists.txt b/wow64/CMakeLists.txt
index 6f58d5b8..d64a2c96 100644
--- a/wow64/CMakeLists.txt
+++ b/wow64/CMakeLists.txt
@@ -1,18 +1,11 @@
 cmake_minimum_required(VERSION 3.13)
 
-set(WINE_INCLUDE_DIR "" CACHE PATH "Path to wine's include directory")
-
-if(WINE_INCLUDE_DIR STREQUAL "")
-    message(FATAL_ERROR "Use -DWINE_INCLUDE_DIR= to set wine's include directory")
-endif()
-
-if(NOT IS_DIRECTORY ${WINE_INCLUDE_DIR})
-    message(FATAL_ERROR "No such directory: ${WINE_INCLUDE_DIR}")
-endif()
-
 set(CMAKE_C_COMPILER aarch64-w64-mingw32-clang)
 set(CMAKE_ASM_COMPILER aarch64-w64-mingw32-as)
 
+set(CMAKE_SYSTEM_NAME Windows)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+
 project(wowbox64 C ASM)
 
 set(BOX64_ROOT "${CMAKE_SOURCE_DIR}/..")
@@ -24,17 +17,21 @@ set(MAIN_SRC
 set(DYNAREC_ASM_SRC
     "${BOX64_ROOT}/src/dynarec/arm64/arm64_prolog.S"
     "${BOX64_ROOT}/src/dynarec/arm64/arm64_epilog.S"
-    # "${BOX64_ROOT}/src/dynarec/arm64/arm64_next.S"
-    # "${BOX64_ROOT}/src/dynarec/arm64/arm64_lock.S"
+    "${BOX64_ROOT}/src/dynarec/arm64/arm64_next.S"
+    "${BOX64_ROOT}/src/dynarec/arm64/arm64_lock.S"
 )
 
 set_source_files_properties(${DYNAREC_ASM_SRC} PROPERTIES COMPILE_OPTIONS "-mcpu=cortex-a76")
 
 set(BOX64CPU_SRC
+    "${BOX64_ROOT}/src/custommem.c"
+    "${BOX64_ROOT}/src/dynarec/dynablock.c"
+    "${BOX64_ROOT}/src/dynarec/dynarec_native.c"
+    "${BOX64_ROOT}/src/os/backtrace.c"
     "${BOX64_ROOT}/src/os/os_wine.c"
-    # "${BOX64_ROOT}/src/custommem.c"
-    # "${BOX64_ROOT}/src/tools/rbtree.c"
-    # "${BOX64_ROOT}/src/dynarec/dynablock.c"
+    "${BOX64_ROOT}/src/tools/alternate.c"
+    "${BOX64_ROOT}/src/tools/rbtree.c"
+    "${BOX64_ROOT}/src/libtools/threads.c"
 )
 
 add_library(wowbox64 SHARED ${MAIN_SRC} ${BOX64CPU_SRC} ${DYNAREC_ASM_SRC})