about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-15 22:50:58 +0800
committerGitHub <noreply@github.com>2025-04-15 16:50:58 +0200
commit4695a4ff3c2132edea634305850b4653c2f0fd1a (patch)
treeb8069c3b15d6d1e2eaeb5af7bcc23c5b0d59b9cc
parent8f3018e10ce4e77053c839758f8e2bc42b6bfb11 (diff)
downloadbox64-4695a4ff3c2132edea634305850b4653c2f0fd1a.tar.gz
box64-4695a4ff3c2132edea634305850b4653c2f0fd1a.zip
[WOW64] Added PE build to the build system (#2537)
-rw-r--r--CMakeLists.txt21
-rw-r--r--wow64/CMakeLists.txt132
-rw-r--r--wow64/toolchain_mingw.cmake5
3 files changed, 43 insertions, 115 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ff9f3a6d..b618764c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,7 @@ option(BOX32 "Set to ON to add Linux 32bits support (experimental, do not use)"
 option(BOX32_BINFMT "Also setup binfmt integration for box32" ${BOX32_BINFMT})
 option(LARCH64_ABI_1 "Set to ON if building for Loongarch64 ABI 1.0 system" ${LARCH64_ABI_1})
 option(GDBJIT "Set to ON to enable GDB JIT support" ${GDBJIT})
+option(WOW64 "Set to ON if you want a WOW64 PE build in addition")
 
 if(TERMUX)
     set(TERMUX_PATH "/data/data/com.termux/files")
@@ -1316,6 +1317,26 @@ if(NOT TARGET uninstall)
         COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
 endif()
 
+string(REPLACE ";" "," DYNAREC_ASM_STR "${DYNAREC_ASM}")
+string(REPLACE ";" "," DYNAREC_PASS_STR "${DYNAREC_PASS}")
+string(REPLACE ";" "," INTERPRETER_STR "${INTERPRETER}")
+
+if(WOW64 AND ARM_DYNAREC)
+    include(ExternalProject)
+    ExternalProject_Add(
+        wowbox64
+        SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/wow64"
+        CMAKE_ARGS 
+            -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/wow64/toolchain_mingw.cmake
+            -DDYNAREC_PASS_STR=${DYNAREC_PASS_STR}
+            -DDYNAREC_ASM_STR=${DYNAREC_ASM_STR}
+            -DINTERPRETER_STR=${INTERPRETER_STR}
+        INSTALL_COMMAND ""
+        TEST_COMMAND ""
+        BUILD_ALWAYS ON
+    )
+endif()
+
 set(CPACK_GENERATOR "DEB")
 set(CPACK_DEBIAN_PACKAGE_MAINTAINER "ptitSeb")
 set(CPACK_PACKAGE_CONTACT "ptitSeb@box86.org")
diff --git a/wow64/CMakeLists.txt b/wow64/CMakeLists.txt
index 1af8ccb4..5ca2f651 100644
--- a/wow64/CMakeLists.txt
+++ b/wow64/CMakeLists.txt
@@ -1,125 +1,27 @@
 cmake_minimum_required(VERSION 3.13)
-
-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}/..")
 
-set(MAIN_SRC
-    "${BOX64_ROOT}/wow64/wowbox64.c"
-)
+string(REPLACE "," ";" DYNAREC_ASM "${DYNAREC_ASM_STR}")
+string(REPLACE "," ";" DYNAREC_PASS "${DYNAREC_PASS_STR}")
+string(REPLACE "," ";" INTERPRETER "${INTERPRETER_STR}")
 
-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"
+set(WOW64_MAIN_SRC
+    "${BOX64_ROOT}/wow64/wowbox64.c"
 )
 
-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/arm64/dynarec_arm64_helper.c"
-    "${BOX64_ROOT}/src/dynarec/dynarec_native_pass.c"
-)
+set_source_files_properties(${DYNAREC_ASM} PROPERTIES COMPILE_OPTIONS "-mcpu=cortex-a76")
 
 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})
+    add_library(wow64_dynarec_pass${STEP_VALUE} OBJECT ${DYNAREC_PASS})
+    target_compile_definitions(wow64_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")
+add_library(wow64_test_interpreter OBJECT ${INTERPRETER})
+set_target_properties(wow64_test_interpreter PROPERTIES COMPILE_DEFINITIONS "TEST_INTERPRETER")
 
-set(BOX64CPU_SRC
+set(WOW64_BOX64CPU_SRC
     "${BOX64_ROOT}/src/custommem.c"
     "${BOX64_ROOT}/src/dynarec/arm64/arm64_immenc.c"
     "${BOX64_ROOT}/src/dynarec/arm64/dynarec_arm64_arch.c"
@@ -148,12 +50,12 @@ set(BOX64CPU_SRC
     "${BOX64_ROOT}/src/tools/rbtree.c"
 )
 
-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>)
+add_library(wowbox64 SHARED ${WOW64_MAIN_SRC} ${WOW64_BOX64CPU_SRC} ${INTERPRETER} ${DYNAREC_ASM}
+    $<TARGET_OBJECTS:wow64_dynarec_pass0>
+    $<TARGET_OBJECTS:wow64_dynarec_pass1>
+    $<TARGET_OBJECTS:wow64_dynarec_pass2>
+    $<TARGET_OBJECTS:wow64_dynarec_pass3>
+    $<TARGET_OBJECTS:wow64_test_interpreter>)
 
 include_directories(
     "${BOX64_ROOT}/src/include"
diff --git a/wow64/toolchain_mingw.cmake b/wow64/toolchain_mingw.cmake
new file mode 100644
index 00000000..544289da
--- /dev/null
+++ b/wow64/toolchain_mingw.cmake
@@ -0,0 +1,5 @@
+set(CMAKE_SYSTEM_NAME Windows)
+set(CMAKE_SYSTEM_PROCESSOR aarch64)
+
+set(CMAKE_C_COMPILER /home/ksco/llvm-mingw/bin/aarch64-w64-mingw32-clang)
+set(CMAKE_ASM_COMPILER /home/ksco/llvm-mingw/bin/aarch64-w64-mingw32-as)
\ No newline at end of file