diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-05-30 16:23:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-30 10:23:10 +0200 |
| commit | d29be5fd143cd75d1540df3a0891132c5d604a09 (patch) | |
| tree | 167fd51f93124fab1fd74f175d6945a1e30de8b7 /src | |
| parent | 53bb00a769f3168a5663893981fccebecd7ff4d7 (diff) | |
| download | box64-d29be5fd143cd75d1540df3a0891132c5d604a09.tar.gz box64-d29be5fd143cd75d1540df3a0891132c5d604a09.zip | |
[WOW64] Added support for cosim (#2683)
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_00.c | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_helper.c | 6 | ||||
| -rw-r--r-- | src/os/os_wine.c | 3 | ||||
| -rw-r--r-- | src/tools/env.c | 36 |
4 files changed, 26 insertions, 20 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 6feae03c..8557af3f 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -2652,7 +2652,6 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin GETIP(addr); STORE_XEMU_CALL(xRIP); MOV32w(x1, u8); - LDRx_U12(xR8, xEmu, offsetof(x64emu_t, win64_teb)); CALL_S(native_int, -1); LOAD_XEMU_CALL(xRIP); TABLE64(x3, addr); // expected return address diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index a3c8f027..7f78e4de 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -782,6 +782,9 @@ void call_c(dynarec_arm_t* dyn, int ninst, void* fnc, int reg, int ret, int save STPx_S7_offset(xR8, xR9, xEmu, offsetof(x64emu_t, regs[_R8])); fpu_pushcache(dyn, ninst, savereg, 0); } + #ifdef _WIN32 + LDRx_U12(xR8, xEmu, offsetof(x64emu_t, win64_teb)); + #endif TABLE64(reg, (uintptr_t)fnc); BLR(reg); if(ret>=0) { @@ -831,6 +834,9 @@ void call_i(dynarec_arm_t* dyn, int ninst, void* fnc) STRx_U12(xFlags, xEmu, offsetof(x64emu_t, eflags)); fpu_pushcache(dyn, ninst, x87pc, 0); + #ifdef _WIN32 + LDRx_U12(xR8, xEmu, offsetof(x64emu_t, win64_teb)); + #endif TABLE64(x87pc, (uintptr_t)fnc); BLR(x87pc); LDPx_S7_postindex(xEmu, x1, xSP, 16); diff --git a/src/os/os_wine.c b/src/os/os_wine.c index 83be99b2..7b222706 100644 --- a/src/os/os_wine.c +++ b/src/os/os_wine.c @@ -211,7 +211,8 @@ void PrintfFtrace(int prefix, const char* fmt, ...) static char buf[1024] = { 0 }; char* p = buf; - strcpy(p, prefix > 1 ? "[\033[31mBOX64\033[0m] " : "[BOX64] "); + p[0] = '\0'; + if (prefix) strcpy(p, prefix > 1 ? "[\033[31mBOX64\033[0m] " : "[BOX64] "); va_list args; va_start(args, fmt); vsprintf(p + strlen(p), fmt, args); diff --git a/src/tools/env.c b/src/tools/env.c index 08f823e9..4b512693 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -125,23 +125,6 @@ static void applyCustomRules() initCycleLog(my_context); } - if (box64env.is_dynarec_test_str_overridden) { - if (strlen(box64env.dynarec_test_str) == 1) { - if (box64env.dynarec_test_str[0] >= '0' && box64env.dynarec_test_str[0] <= '1') - box64env.dynarec_test = box64env.dynarec_test_str[0] - '0'; - - box64env.dynarec_test_start = 0x0; - box64env.dynarec_test_end = 0x0; - } else if (strchr(box64env.dynarec_test_str, '-')) { - parseRange(box64env.dynarec_test_str, &box64env.dynarec_test_start, &box64env.dynarec_test_end); - if (box64env.dynarec_test_end > box64env.dynarec_test_start) { - box64env.dynarec_test = 1; - } else { - box64env.dynarec_test = 0; - } - } - } - if (box64env.is_dynarec_gdbjit_str_overridden) { if (strlen(box64env.dynarec_gdbjit_str) == 1) { if (box64env.dynarec_gdbjit_str[0] >= '0' && box64env.dynarec_gdbjit_str[0] <= '3') @@ -158,13 +141,30 @@ static void applyCustomRules() } } } +#endif + + if (box64env.is_dynarec_test_str_overridden) { + if (strlen(box64env.dynarec_test_str) == 1) { + if (box64env.dynarec_test_str[0] >= '0' && box64env.dynarec_test_str[0] <= '1') + box64env.dynarec_test = box64env.dynarec_test_str[0] - '0'; + + box64env.dynarec_test_start = 0x0; + box64env.dynarec_test_end = 0x0; + } else if (strchr(box64env.dynarec_test_str, '-')) { + parseRange(box64env.dynarec_test_str, &box64env.dynarec_test_start, &box64env.dynarec_test_end); + if (box64env.dynarec_test_end > box64env.dynarec_test_start) { + box64env.dynarec_test = 1; + } else { + box64env.dynarec_test = 0; + } + } + } if (box64env.is_nodynarec_overridden) parseRange(box64env.nodynarec, &box64env.nodynarec_start, &box64env.nodynarec_end); if (box64env.is_dynarec_dump_range_overridden) parseRange(box64env.dynarec_dump_range, &box64env.dynarec_dump_range_start, &box64env.dynarec_dump_range_end); -#endif if (box64env.dynarec_test) { SET_BOX64ENV(dynarec_fastnan, 0); |