diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-14 17:29:22 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-14 11:29:22 +0200 |
| commit | ee530a73319423f7613304cf8c980fbabd89c5ae (patch) | |
| tree | b6efd6f08b0d39904a4e34b783e5ebe428099481 | |
| parent | b7cb36d362861cf857a6958c13c2357657c1d967 (diff) | |
| download | box64-ee530a73319423f7613304cf8c980fbabd89c5ae.tar.gz box64-ee530a73319423f7613304cf8c980fbabd89c5ae.zip | |
[WOW64] More tweaks for PE build (#2528)
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) |