diff options
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_arch.c | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_arch.h | 6 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 1 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 11 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_functions.c | 1 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_functions.c | 1 | ||||
| -rw-r--r-- | src/include/dynarec_native.h | 2 | ||||
| -rw-r--r-- | src/include/myalign.h | 2 | ||||
| -rw-r--r-- | src/include/mysignal.h | 3 | ||||
| -rw-r--r-- | src/include/perfmap.h | 6 | ||||
| -rw-r--r-- | src/libtools/threads.c | 5 | ||||
| -rwxr-xr-x | src/libtools/threads32.c | 3 | ||||
| -rw-r--r-- | src/os/os_wine.c | 5 | ||||
| -rw-r--r-- | src/tools/perfmap.c | 21 | ||||
| -rw-r--r-- | wow64/CMakeLists.txt | 27 |
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}) |