diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-01-24 01:46:18 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-23 18:46:18 +0100 |
| commit | 7099774a3c82642ad64bc3a4f1b798e951904f7d (patch) | |
| tree | 6432d96090892c5f7a6e52c9c3cf18ab09a1a60b /src | |
| parent | 925f6a992232e1011667d6334b04072f75659386 (diff) | |
| download | box64-7099774a3c82642ad64bc3a4f1b798e951904f7d.tar.gz box64-7099774a3c82642ad64bc3a4f1b798e951904f7d.zip | |
[DYNAREC] Added preliminary per-file settings (#2288)
Diffstat (limited to 'src')
25 files changed, 241 insertions, 201 deletions
diff --git a/src/core.c b/src/core.c index dd53d737..00b02354 100644 --- a/src/core.c +++ b/src/core.c @@ -58,7 +58,6 @@ int box64_mapclean = 0; int box64_zoom = 0; int box64_steam = 0; int box64_steamcmd = 0; -int box64_wine = 0; int box64_musl = 0; char* box64_custom_gstreamer = NULL; int box64_tcmalloc_minimal = 0; @@ -108,6 +107,10 @@ int la64_scq = 0; #endif #endif +int box64_wine = 0; +const char* box64_guest_name = NULL; +const char* box64_wine_guest_name = NULL; + #ifdef HAVE_TRACE uintptr_t trace_start = 0, trace_end = 0; char* trace_func = NULL; @@ -950,7 +953,6 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf #endif int ld_libs_args = -1; int is_custom_gstreamer = 0; - const char* wine_prog = NULL; // check if this is wine if(!strcmp(prog_, "wine64") || !strcmp(prog_, "wine64-development") @@ -987,16 +989,16 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf if(argv[nextarg+1] && argv[nextarg+1][0]!='-' && strlen(argv[nextarg+1])>4 && !strcasecmp(argv[nextarg+1]+strlen(argv[nextarg+1])-4, ".exe")) { const char* pp = strrchr(argv[nextarg+1], '/'); if(pp) - wine_prog = pp+1; + box64_wine_guest_name = pp + 1; else { pp = strrchr(argv[nextarg+1], '\\'); if(pp) - wine_prog = pp+1; + box64_wine_guest_name = pp + 1; else - wine_prog = argv[nextarg+1]; + box64_wine_guest_name = argv[nextarg + 1]; } } - if(wine_prog) printf_log(LOG_INFO, "Detected running wine with \"%s\"\n", wine_prog); + if (box64_wine_guest_name) printf_log(LOG_INFO, "Detected running wine with \"%s\"\n", box64_wine_guest_name); } else if(strstr(prog, "ld-musl-x86_64.so.1")) { // check if ld-musl-x86_64.so.1 is used printf_log(LOG_INFO, "ld-musl detected. Trying to workaround and use system ld-linux\n"); @@ -1101,11 +1103,11 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf } #endif } - const char* prgname = strrchr(prog, '/'); - if(!prgname) - prgname = prog; + box64_guest_name = strrchr(prog, '/'); + if (!box64_guest_name) + box64_guest_name = prog; else - ++prgname; + ++box64_guest_name; if(box64_wine) { #ifdef ANDROID AddPath("libdl.so", &ld_preload, 0); @@ -1114,13 +1116,13 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf #endif } // special case for zoom - if(strstr(prgname, "zoom")==prgname) { + if (strstr(box64_guest_name, "zoom") == box64_guest_name) { printf_log(LOG_INFO, "Zoom detected, Trying to use system libturbojpeg if possible\n"); box64_zoom = 1; } // special case for bash - if(!strcmp(prgname, "bash") || !strcmp(prgname, "box64-bash")) { - printf_log(LOG_INFO, "bash detected, disabling banner\n"); + if (!strcmp(box64_guest_name, "bash") || !strcmp(box64_guest_name, "box64-bash")) { + printf_log(LOG_INFO, "Bash detected, disabling banner\n"); if (!BOX64ENV(nobanner)) { setenv("BOX86_NOBANNER", "1", 0); setenv("BOX64_NOBANNER", "1", 0); @@ -1135,14 +1137,14 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf if(bashpath) my_context->bashpath = box_strdup(bashpath); - ApplyEnvFileEntry(prgname); - if (box64_wine && wine_prog) { - ApplyEnvFileEntry(wine_prog); - wine_prog = NULL; + ApplyEnvFileEntry(box64_guest_name); + if (box64_wine && box64_wine_guest_name) { + ApplyEnvFileEntry(box64_wine_guest_name); + box64_wine_guest_name = NULL; } openFTrace(0); setupZydis(my_context); - PrintEnvVariables(); + PrintEnvVariables(&box64env, LOG_INFO); for(int i=1; i<my_context->argc; ++i) { my_context->argv[i] = box_strdup(argv[i+nextarg]); @@ -1304,7 +1306,7 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf FreeCollection(&ld_preload); return -1; } - if(!strcmp(prgname, "heroic")) { + if (!strcmp(box64_guest_name, "heroic")) { // check if heroic needs patching (for the 2.15.1 version) uint8_t* address = GetBaseAddress(elf_header); if(address[0x422f6e1]==0x72 && address[0x422f6e2]==0x44 && address[0x422f6e0]==0xF8 && address[0x422f727]==0xcc) { @@ -1380,7 +1382,7 @@ int initialize(int argc, const char **argv, char** env, x64emu_t** emulator, elf printf_log(LOG_NONE, "Error setting process name (%s)\n", strerror(errno)); else printf_log(LOG_INFO, "Rename process to \"%s\"\n", p); - if(strcmp(prgname, p)) { + if (strcmp(box64_guest_name, p)) { ApplyEnvFileEntry(p); } // and now all change the argv (so libs libs mesa find the correct program names) diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 051a1a57..1a496940 100644 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1010,7 +1010,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x6C: case 0x6D: INST_NAME(opcode == 0x6C ? "INSB" : "INSD"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -1026,7 +1026,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x6E: case 0x6F: INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSD"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -1730,7 +1730,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ CMPSB");} else {INST_NAME("REPZ CMPSB");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SMREAD(); SETFLAGS(X_ALL, SF_SET_PENDING); @@ -1772,7 +1772,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ CMPSD");} else {INST_NAME("REPZ CMPSD");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_ALL, SF_SET_PENDING); SMREAD(); @@ -1914,7 +1914,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ SCASB");} else {INST_NAME("REPZ SCASB");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SMREAD(); SETFLAGS(X_ALL, SF_SET_PENDING); @@ -1953,7 +1953,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ SCASD");} else {INST_NAME("REPZ SCASD");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SMREAD(); SETFLAGS(X_ALL, SF_SET_PENDING); @@ -2283,7 +2283,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC2: INST_NAME("RETN"); //SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) - if(BOX64ENV(dynarec_safeflags)) { + if(BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // lets play safe here too } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -2295,7 +2295,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xC3: INST_NAME("RET"); // SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) - if(BOX64ENV(dynarec_safeflags)) { + if(BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // so instead, force the deferred flags, so it's not too slow, and flags are not lost } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -2573,7 +2573,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin jump_to_epilog(dyn, 0, xRIP, ninst); } else if(u8==0x03) { INST_NAME("INT 3"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -2587,7 +2587,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin *ok = 0; } else { INST_NAME("INT n"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -2748,7 +2748,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: INST_NAME("ROL Eb, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); UFLAG_IF { UFLAG_DF(x2, d_none); @@ -2778,7 +2778,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: INST_NAME("ROR Eb, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); UFLAG_IF { UFLAG_DF(x2, d_none); @@ -2808,7 +2808,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("RCL Eb, CL"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDw_mask(x2, xRCX, 0, 0b00100); @@ -2820,7 +2820,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("RCR Eb, CL"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDw_mask(x2, xRCX, 0, 0b00100); @@ -2832,7 +2832,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 6: INST_NAME("SHL Eb, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { @@ -2845,7 +2845,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 5: INST_NAME("SHR Eb, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { @@ -2858,7 +2858,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 7: INST_NAME("SAR Eb, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { @@ -2876,7 +2876,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: INST_NAME("ROL Ed, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -2911,7 +2911,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: INST_NAME("ROR Ed, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -2947,7 +2947,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); SETFLAGS(X_OF|X_CF, SF_SET_DF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x2, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -2965,7 +2965,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); SETFLAGS(X_OF|X_CF, SF_SET_DF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x2, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -2982,7 +2982,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 6: INST_NAME("SHL Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -3000,7 +3000,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 5: INST_NAME("SHR Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -3018,7 +3018,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 7: INST_NAME("SAR Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -3152,7 +3152,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin if (rex.is32bits && BOX64ENV(ignoreint3)) { F8; } else { - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -3239,7 +3239,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin PUSH1z(x2); break; default: - if((BOX64ENV(dynarec_safeflags)>1) || (ninst && dyn->insts[ninst-1].x64.set_flags)) { + if ((BOX64DRENV(dynarec_safeflags) > 1) || (ninst && dyn->insts[ninst - 1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state @@ -3248,7 +3248,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MOV64x(x2, addr); fpu_purgecache(dyn, ninst, 1, x1, x3, x4); PUSH1z(x2); - if(BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if(addr < (dyn->start+dyn->isize)) { @@ -3271,7 +3271,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin else j64 = addr+i32; jump_to_next(dyn, j64, 0, ninst, rex.is32bits); - if(BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); @@ -3331,7 +3331,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME(opcode==0xEC?"IN AL, DX":(opcode==0xED?"IN EAX, DX":(opcode==0xEE?"OUT DX, AL":"OUT DX, EAX"))); if(rex.is32bits && BOX64ENV(ignoreint3)) {} else { - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -3351,7 +3351,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0xF1: INST_NAME("INT1"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -3367,7 +3367,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0xF4: INST_NAME("HLT"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -3801,7 +3801,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME(opcode==0xFA?"CLI":"STI"); if(rex.is32bits && BOX64ENV(ignoreint3)) {} else { - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -3864,16 +3864,13 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF((BOX64ENV(dynarec_safeflags)>1) || - ((ninst && dyn->insts[ninst-1].x64.set_flags) - || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) - { + PASS2IF ((BOX64DRENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF); //Hack to put flag in "don't care" state } GETEDz(0); - if(BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock)>1) { + if (BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock) > 1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -3881,7 +3878,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin *ok = 0; } GETIP_(addr); - if(BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if(addr < (dyn->start+dyn->isize)) { @@ -3898,7 +3895,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } PUSH1z(xRIP); jump_to_next(dyn, 0, ed, ninst, rex.is32bits); - if(BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); @@ -3922,7 +3919,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin LDH(x4, xEmu, offsetof(x64emu_t, segs[_CS])); GETIP_(addr); /* - if(BOX64ENV(dynarec_callret)) { + if(BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if(addr < (dyn->start+dyn->isize)) { @@ -3938,7 +3935,8 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } STPx_S7_preindex(x4, xRIP, xSP, -16); } - */ // not doing callret because call far will exit the dynablock anyway, to be sure to recompute CS segment + */ + // not doing callret because call far will exit the dynablock anyway, to be sure to recompute CS segment PUSH1z(x4); PUSH1z(xRIP); STH(x3, xEmu, offsetof(x64emu_t, segs[_CS])); diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c index 71c844d2..65a3ac09 100644 --- a/src/dynarec/arm64/dynarec_arm64_0f.c +++ b/src/dynarec/arm64/dynarec_arm64_0f.c @@ -165,7 +165,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x09: INST_NAME("WBINVD"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -181,7 +181,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x0B: INST_NAME("UD2"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -220,7 +220,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x0E: INST_NAME("femms"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -527,7 +527,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 0x30: INST_NAME("WRMSR"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -1771,7 +1771,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin nextop = F8; INST_NAME("SHLD Ed, Gd, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); GETGD; GETED(0); @@ -1859,7 +1859,7 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin nextop = F8; INST_NAME("SHRD Ed, Gd, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); GETGD; GETED(0); diff --git a/src/dynarec/arm64/dynarec_arm64_64.c b/src/dynarec/arm64/dynarec_arm64_64.c index a0c706cd..867b9d44 100644 --- a/src/dynarec/arm64/dynarec_arm64_64.c +++ b/src/dynarec/arm64/dynarec_arm64_64.c @@ -607,7 +607,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x6C: case 0x6D: INST_NAME(opcode == 0x6C ? "INSB" : "INSD"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -623,7 +623,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x6E: case 0x6F: INST_NAME(opcode == 0x6C ? "OUTSB" : "OUTSD"); - if(BOX64ENV(dynarec_safeflags)>1) { + if(BOX64DRENV(dynarec_safeflags)>1) { READFLAGS(X_PEND); } else { SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state @@ -1263,7 +1263,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 6: INST_NAME("SHL Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -1279,7 +1279,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 5: INST_NAME("SHR Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -1295,7 +1295,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 7: INST_NAME("SAR Ed, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); if(rex.w) { ANDx_mask(x3, xRCX, 1, 0, 0b00101); //mask=0x000000000000003f @@ -1577,16 +1577,13 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF((BOX64ENV(dynarec_safeflags)>1) || - ((ninst && dyn->insts[ninst-1].x64.set_flags) - || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) - { + PASS2IF ((BOX64DRENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF); //Hack to put flag in "don't care" state } GETEDOz(x6, 0); - if(BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock)>1) { + if (BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock) > 1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -1594,7 +1591,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin *ok = 0; } GETIP_(addr); - if(BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if(addr < (dyn->start+dyn->isize)) { @@ -1611,7 +1608,7 @@ uintptr_t dynarec64_64(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } PUSH1z(xRIP); jump_to_next(dyn, 0, ed, ninst, rex.is32bits); - if(BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); diff --git a/src/dynarec/arm64/dynarec_arm64_66.c b/src/dynarec/arm64/dynarec_arm64_66.c index b42e14d2..192c7c1e 100644 --- a/src/dynarec/arm64/dynarec_arm64_66.c +++ b/src/dynarec/arm64/dynarec_arm64_66.c @@ -836,7 +836,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ CMPSW");} else {INST_NAME("REPZ CMPSW");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_ALL, SF_SET_PENDING); CBZx_NEXT(xRCX); @@ -936,7 +936,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: case 2: if(rep==1) {INST_NAME("REPNZ SCASW");} else {INST_NAME("REPZ SCASW");} - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_ALL, SF_SET_PENDING); CBZx_NEXT(xRCX); @@ -1167,7 +1167,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0: INST_NAME("ROL Ew, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); UFLAG_IF { ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f @@ -1193,7 +1193,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 1: INST_NAME("ROR Ew, CL"); SETFLAGS(X_OF|X_CF, SF_SUBSET); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); UFLAG_IF { ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f @@ -1219,7 +1219,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("RCL Ew, CL"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDw_mask(x2, xRCX, 0, 0b00100); @@ -1231,7 +1231,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin INST_NAME("RCR Ew, CL"); MESSAGE(LOG_DUMP, "Need Optimization\n"); READFLAGS(X_CF); - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); SETFLAGS(X_OF|X_CF, SF_SET_DF); ANDw_mask(x2, xRCX, 0, 0b00100); @@ -1243,7 +1243,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 6: INST_NAME("SHL Ew, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { @@ -1256,7 +1256,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 5: INST_NAME("SHR Ew, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { @@ -1269,7 +1269,7 @@ uintptr_t dynarec64_66(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 7: INST_NAME("SAR Ew, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); ANDw_mask(x2, xRCX, 0, 0b00100); //mask=0x00000001f UFLAG_IF { diff --git a/src/dynarec/arm64/dynarec_arm64_660f.c b/src/dynarec/arm64/dynarec_arm64_660f.c index 893ac0ce..46c910c5 100644 --- a/src/dynarec/arm64/dynarec_arm64_660f.c +++ b/src/dynarec/arm64/dynarec_arm64_660f.c @@ -2375,7 +2375,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; INST_NAME("SHLD Ew, Gw, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); GETGW(x2); GETEW(x1, 0); @@ -2443,7 +2443,7 @@ uintptr_t dynarec64_660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int n nextop = F8; INST_NAME("SHRD Ew, Gw, CL"); SETFLAGS(X_ALL, SF_SET_PENDING); // some flags are left undefined - if(BOX64ENV(dynarec_safeflags)>1) + if(BOX64DRENV(dynarec_safeflags)>1) MAYSETFLAGS(); GETGW(x2); GETEW(x1, 0); diff --git a/src/dynarec/arm64/dynarec_arm64_67.c b/src/dynarec/arm64/dynarec_arm64_67.c index fbe4b4c7..9c255932 100644 --- a/src/dynarec/arm64/dynarec_arm64_67.c +++ b/src/dynarec/arm64/dynarec_arm64_67.c @@ -1635,7 +1635,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF((BOX64ENV(dynarec_safeflags)>1) || + PASS2IF((BOX64DRENV(dynarec_safeflags)>1) || ((ninst && dyn->insts[ninst-1].x64.set_flags) || ((ninst>1) && dyn->insts[ninst-2].x64.set_flags)), 1) { @@ -1644,7 +1644,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET_NODF); //Hack to put flag in "don't care" state } GETED32(0); - if(BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock)>1) { + if(BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock)>1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -1652,7 +1652,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin *ok = 0; } GETIP_(addr); - if(BOX64ENV(dynarec_callret)) { + if(BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if(addr < (dyn->start+dyn->isize)) { @@ -1669,7 +1669,7 @@ uintptr_t dynarec64_67(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } PUSH1z(xRIP); jump_to_next(dyn, 0, ed, ninst, rex.is32bits); - if(BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if(BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); diff --git a/src/dynarec/arm64/dynarec_arm64_emit_math.c b/src/dynarec/arm64/dynarec_arm64_emit_math.c index a20af739..f6b2a6ca 100644 --- a/src/dynarec/arm64/dynarec_arm64_emit_math.c +++ b/src/dynarec/arm64/dynarec_arm64_emit_math.c @@ -83,8 +83,7 @@ void emit_add32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 void emit_add32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5) { MAYUSE(s5); - if((s1==xRSP) && (BOX64ENV(dynarec_safeflags)<2) && (!dyn->insts || (dyn->insts[ninst].x64.gen_flags==X_PEND) || (!BOX64ENV(dynarec_df) && (dyn->insts[ninst].x64.gen_flags==X_ALL)))) - { + if((s1==xRSP) && (BOX64DRENV(dynarec_safeflags)<2) && (!dyn->insts || (dyn->insts[ninst].x64.gen_flags==X_PEND) || (!BOX64ENV(dynarec_df) && (dyn->insts[ninst].x64.gen_flags==X_ALL)))) { // special case when doing math on ESP and only PEND is needed: ignoring it! if(c>=0 && c<0x1000) { ADDx_U12(s1, s1, c); @@ -224,8 +223,7 @@ void emit_sub32(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int s2, int s3 void emit_sub32c(dynarec_arm_t* dyn, int ninst, rex_t rex, int s1, int64_t c, int s3, int s4, int s5) { MAYUSE(s5); - if(s1==xRSP && (BOX64ENV(dynarec_safeflags)<2) && (!dyn->insts || (dyn->insts[ninst].x64.gen_flags==X_PEND) || (!BOX64ENV(dynarec_df) && (dyn->insts[ninst].x64.gen_flags==X_ALL)))) - { + if(s1==xRSP && (BOX64DRENV(dynarec_safeflags)<2) && (!dyn->insts || (dyn->insts[ninst].x64.gen_flags==X_PEND) || (!BOX64ENV(dynarec_df) && (dyn->insts[ninst].x64.gen_flags==X_ALL)))) { // special case when doing math on RSP and only PEND is needed: ignoring it! if(c>=0 && c<0x1000) { SUBxw_U12(s1, s1, c); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index 411afdca..86b08de0 100644 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -626,7 +626,7 @@ void ret_to_epilog(dynarec_arm_t* dyn, int ninst, rex_t rex) POP1z(xRIP); MOVz_REG(x1, xRIP); SMEND(); - if(BOX64ENV(dynarec_callret)) { + if(BOX64DRENV(dynarec_callret)) { // pop the actual return address for ARM stack LDPx_S7_postindex(xLR, x6, xSP, 16); SUBx_REG(x6, x6, xRIP); // is it the right address? @@ -673,7 +673,7 @@ void retn_to_epilog(dynarec_arm_t* dyn, int ninst, rex_t rex, int n) } MOVz_REG(x1, xRIP); SMEND(); - if(BOX64ENV(dynarec_callret)) { + if(BOX64DRENV(dynarec_callret)) { // pop the actual return address for ARM stack LDPx_S7_postindex(xLR, x6, xSP, 16); SUBx_REG(x6, x6, xRIP); // is it the right address? diff --git a/src/dynarec/dynarec_helper.h b/src/dynarec/dynarec_helper.h index 4f51c9a9..5ce38708 100644 --- a/src/dynarec/dynarec_helper.h +++ b/src/dynarec/dynarec_helper.h @@ -49,12 +49,12 @@ SMWRITE(); \ } while (0) -#define SMWRITE2() \ - do { \ - if (BOX64ENV(dynarec_strongmem) >= STRONGMEM_SIMD_WRITE) { \ - dyn->smwrite = 1; \ - dyn->insts[ninst].will_write = 2; \ - } \ +#define SMWRITE2() \ + do { \ + if (BOX64DRENV(dynarec_strongmem) >= STRONGMEM_SIMD_WRITE) { \ + dyn->smwrite = 1; \ + dyn->insts[ninst].will_write = 2; \ + } \ } while (0) #define SMREAD() @@ -71,7 +71,7 @@ #define SMEND() \ do { \ /* If there is any guest memory write, which is a SEQ, then compute the last_write. */ \ - if (dyn->smwrite && (BOX64ENV(dynarec_strongmem) >= STRONGMEM_LAST_WRITE)) { \ + if (dyn->smwrite && (BOX64DRENV(dynarec_strongmem) >= STRONGMEM_LAST_WRITE)) { \ int i = ninst; \ while (i >= 0 && !dyn->insts[i].will_write) \ --i; \ @@ -88,7 +88,7 @@ #define SMWRITE() \ do { \ /* Put a barrier at every third memory write. */ \ - if (BOX64ENV(dynarec_strongmem) >= STRONGMEM_SEQ_WRITE) { \ + if (BOX64DRENV(dynarec_strongmem) >= STRONGMEM_SEQ_WRITE) { \ if (++dyn->smwrite >= 3 /* Every third memory write */) { \ DMB_ISH(); \ dyn->smwrite = 1; \ @@ -110,10 +110,10 @@ } while (0) // Similar to SMWRITE, but for SIMD instructions. -#define SMWRITE2() \ - do { \ - if (BOX64ENV(dynarec_strongmem) >= STRONGMEM_SIMD_WRITE) \ - SMWRITE(); \ +#define SMWRITE2() \ + do { \ + if (BOX64DRENV(dynarec_strongmem) >= STRONGMEM_SIMD_WRITE) \ + SMWRITE(); \ } while (0) // An opcode reads guest memory, this need to be put before the LOAD instruction manually. @@ -130,22 +130,22 @@ } while (0) // An opcode will write memory, this will be put before the STORE instruction automatically. -#define WILLWRITE() \ - do { \ - if (BOX64ENV(dynarec_strongmem) >= dyn->insts[ninst].will_write && dyn->smwrite == 0) { \ - /* Will write but never written, this is the start of a SEQ, put a barrier. */ \ - if (BOX64ENV(dynarec_weakbarrier)) \ - DMB_ISHLD(); \ - else \ - DMB_ISH(); \ - } else if (BOX64ENV(dynarec_strongmem) >= STRONGMEM_LAST_WRITE && BOX64ENV(dynarec_weakbarrier) != 2 \ - && dyn->insts[ninst].last_write) { \ - /* Last write, put a barrier */ \ - if (BOX64ENV(dynarec_weakbarrier)) \ - DMB_ISHST(); \ - else \ - DMB_ISH(); \ - } \ +#define WILLWRITE() \ + do { \ + if (BOX64DRENV(dynarec_strongmem) >= dyn->insts[ninst].will_write && dyn->smwrite == 0) { \ + /* Will write but never written, this is the start of a SEQ, put a barrier. */ \ + if (BOX64ENV(dynarec_weakbarrier)) \ + DMB_ISHLD(); \ + else \ + DMB_ISH(); \ + } else if (BOX64DRENV(dynarec_strongmem) >= STRONGMEM_LAST_WRITE && BOX64ENV(dynarec_weakbarrier) != 2 \ + && dyn->insts[ninst].last_write) { \ + /* Last write, put a barrier */ \ + if (BOX64ENV(dynarec_weakbarrier)) \ + DMB_ISHST(); \ + else \ + DMB_ISH(); \ + } \ } while (0) // Similar to WILLWRITE, but checks lock. @@ -167,7 +167,7 @@ // Will be put at the end of the SEQ #define SMEND() \ do { \ - if (BOX64ENV(dynarec_strongmem)) { \ + if (BOX64DRENV(dynarec_strongmem)) { \ /* It's a SEQ, put a barrier here. */ \ if (dyn->smwrite) { \ /* Check if the next instruction has a end loop mark */ \ diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index d5453e7f..f9becee9 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -60,7 +60,7 @@ void printf_x64_instruction(zydis_dec_t* dec, instruction_x64_t* inst, const cha } void add_next(dynarec_native_t *dyn, uintptr_t addr) { - if(!BOX64ENV(dynarec_bigblock)) + if (!BOX64DRENV(dynarec_bigblock)) return; // exist? for(int i=0; i<dyn->next_sz; ++i) diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 7ab4f528..99401201 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -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)?0:1); // if block is in elf_memory, it can be extended with BOX64ENV(dynarec_bigblock)==2, else it needs 3 + int stopblock = 2 + (FindElfAddress(my_context, addr) ? 0 : 1); // if block is in elf_memory, it can be extended with BOX64DRENV(dynarec_bigblock)==2, else it needs 3 // ok, go now INIT; #if STEP == 0 @@ -262,7 +262,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int dyn->forward_ninst = 0; } // else just continue - } else if(!ok && !need_epilog && BOX64ENV(dynarec_bigblock) && (getProtection(addr+3)&~PROT_READ)) + } else if (!ok && !need_epilog && BOX64DRENV(dynarec_bigblock) && (getProtection(addr + 3) & ~PROT_READ)) if(*(uint32_t*)addr!=0) { // check if need to continue (but is next 4 bytes are 0, stop) uintptr_t next = get_closest_next(dyn, addr); if(next && ( @@ -278,8 +278,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int reset_n = get_first_jump(dyn, next); } if(BOX64ENV(dynarec_dump)) dynarec_log(LOG_NONE, "Extend block %p, %s%p -> %p (ninst=%d, jump from %d)\n", dyn, dyn->insts[ninst].x64.has_callret?"(opt. call) ":"", (void*)addr, (void*)next, ninst+1, dyn->insts[ninst].x64.has_callret?ninst:reset_n); - } else if(next && (int)(next-addr)<BOX64ENV(dynarec_forward) && (getProtection(next)&PROT_READ)/*BOX64ENV(dynarec_bigblock)>=stopblock*/) { - if(!((BOX64ENV(dynarec_bigblock)<stopblock) && !isJumpTableDefault64((void*)next))) { + } else if (next && (int)(next - addr) < BOX64ENV(dynarec_forward) && (getProtection(next) & PROT_READ) /*BOX64DRENV(dynarec_bigblock)>=stopblock*/) { + if (!((BOX64DRENV(dynarec_bigblock) < stopblock) && !isJumpTableDefault64((void*)next))) { if(dyn->forward) { if(next<dyn->forward_to) dyn->forward_to = next; @@ -327,9 +327,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int ++ninst; #if STEP == 0 memset(&dyn->insts[ninst], 0, sizeof(instruction_native_t)); - if((ok>0) && (((BOX64ENV(dynarec_bigblock)<stopblock) && !isJumpTableDefault64((void*)addr)) - || (addr>=BOX64ENV(nodynarec_start) && addr<BOX64ENV(nodynarec_end)))) - #else + if ((ok > 0) && (((BOX64DRENV(dynarec_bigblock) < stopblock) && !isJumpTableDefault64((void*)addr)) || (addr >= BOX64ENV(nodynarec_start) && addr < BOX64ENV(nodynarec_end)))) +#else if((ok>0) && (ninst==dyn->size)) #endif { diff --git a/src/dynarec/la64/dynarec_la64_00.c b/src/dynarec/la64/dynarec_la64_00.c index f9dfbc0a..347d0778 100644 --- a/src/dynarec/la64/dynarec_la64_00.c +++ b/src/dynarec/la64/dynarec_la64_00.c @@ -1796,7 +1796,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xC2: INST_NAME("RETN"); - if (BOX64ENV(dynarec_safeflags)) { + if (BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // lets play safe here too } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -1807,7 +1807,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 0xC3: INST_NAME("RET"); - if (BOX64ENV(dynarec_safeflags)) { + if (BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // so instead, force the deferred flags, so it's not too slow, and flags are not lost } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -1959,7 +1959,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) MAYSETFLAGS(); + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); emit_shl8(dyn, ninst, x1, x2, x5, x4, x6); EBBACK(); break; @@ -1975,7 +1975,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) MAYSETFLAGS(); + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); emit_shr8(dyn, ninst, x1, x2, x5, x4, x6); EBBACK(); break; @@ -2228,13 +2228,13 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } break; default: - if ((BOX64ENV(dynarec_safeflags) > 1) || (ninst && dyn->insts[ninst - 1].x64.set_flags)) { + if ((BOX64DRENV(dynarec_safeflags) > 1) || (ninst && dyn->insts[ninst - 1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags to "dont'care" state } // regular call - /*if (BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock) > 1) { + /*if (BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock) > 1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -2249,7 +2249,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } fpu_purgecache(dyn, ninst, 1, x1, x3, x4); PUSH1z(x2); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if (addr < (dyn->start + dyn->isize)) { @@ -2276,7 +2276,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni else j64 = addr + i32; jump_to_next(dyn, j64, 0, ninst, rex.is32bits); - if (BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); @@ -2602,13 +2602,13 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni break; case 2: INST_NAME("CALL Ed"); - PASS2IF ((BOX64ENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { + PASS2IF ((BOX64DRENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to put flag in "don't care" state } GETEDz(0); - if (BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock) > 1) { + if (BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock) > 1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -2616,7 +2616,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni *ok = 0; } GETIP_(addr); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address if (addr < (dyn->start + dyn->isize)) { @@ -2637,7 +2637,7 @@ uintptr_t dynarec64_00(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni } PUSH1z(xRIP); jump_to_next(dyn, 0, ed, ninst, rex.is32bits); - if (BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... MARK; j64 = getJumpTableAddress64(addr); diff --git a/src/dynarec/la64/dynarec_la64_66.c b/src/dynarec/la64/dynarec_la64_66.c index 68894bf4..4d9b0034 100644 --- a/src/dynarec/la64/dynarec_la64_66.c +++ b/src/dynarec/la64/dynarec_la64_66.c @@ -795,7 +795,7 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) MAYSETFLAGS(); + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETEW(x1, 0); emit_shr16(dyn, ninst, x1, x2, x5, x4, x6); EWBACK; @@ -811,7 +811,7 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETEW(x1, 0); emit_shl16(dyn, ninst, x1, x2, x5, x4, x6); @@ -827,7 +827,7 @@ uintptr_t dynarec64_66(dynarec_la64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETSEW(x1, 0); emit_sar16(dyn, ninst, x1, x2, x5, x4, x6); diff --git a/src/dynarec/la64/dynarec_la64_helper.c b/src/dynarec/la64/dynarec_la64_helper.c index af3ab1ea..627aa698 100644 --- a/src/dynarec/la64/dynarec_la64_helper.c +++ b/src/dynarec/la64/dynarec_la64_helper.c @@ -582,7 +582,7 @@ void ret_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex) POP1z(xRIP); MVz(x1, xRIP); SMEND(); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { // pop the actual return address from RV64 stack LD_D(xRA, xSP, 0); // native addr LD_D(x6, xSP, 8); // x86 addr @@ -627,7 +627,7 @@ void retn_to_epilog(dynarec_la64_t* dyn, int ninst, rex_t rex, int n) } MVz(x1, xRIP); SMEND(); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { // pop the actual return address from RV64 stack LD_D(xRA, xSP, 0); // native addr LD_D(x6, xSP, 8); // x86 addr diff --git a/src/dynarec/rv64/dynarec_rv64_00_3.c b/src/dynarec/rv64/dynarec_rv64_00_3.c index 0e200145..072ed33e 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_3.c +++ b/src/dynarec/rv64/dynarec_rv64_00_3.c @@ -280,7 +280,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0xC2: INST_NAME("RETN"); // SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) - if (BOX64ENV(dynarec_safeflags)) { + if (BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // lets play safe here too } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -292,7 +292,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int case 0xC3: INST_NAME("RET"); // SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...) - if (BOX64ENV(dynarec_safeflags)) { + if (BOX64DRENV(dynarec_safeflags)) { READFLAGS(X_PEND); // so instead, force the deferred flags, so it's not too slow, and flags are not lost } fpu_purgecache(dyn, ninst, 1, x1, x2, x3); // using next, even if there no next @@ -613,7 +613,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); emit_shl8(dyn, ninst, x1, x2, x5, x4, x6); EBBACK(x5, 0); @@ -630,7 +630,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); emit_shr8(dyn, ninst, x1, x2, x5, x4, x6); EBBACK(x5, 0); @@ -647,7 +647,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int BEQ_NEXT(x2, xZR); } SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); emit_sar8(dyn, ninst, x1, x2, x5, x4, x6); EBBACK(x5, 0); @@ -970,13 +970,13 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } break; default: - if ((BOX64ENV(dynarec_safeflags) > 1) || (ninst && dyn->insts[ninst - 1].x64.set_flags)) { + if ((BOX64DRENV(dynarec_safeflags) > 1) || (ninst && dyn->insts[ninst - 1].x64.set_flags)) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to set flags to "dont'care" state } // regular call - /*if(BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock)>1) { + /*if(BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock)>1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -991,7 +991,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int } fpu_purgecache(dyn, ninst, 1, x1, x3, x4); PUSH1z(x2); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); // Push actual return address j64 = (dyn->insts) ? (GETMARK - (dyn->native_size)) : 0; @@ -1011,9 +1011,9 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int j64 = addr + i32; jump_to_next(dyn, j64, 0, ninst, rex.is32bits); MARK; - if (BOX64ENV(dynarec_callret) && dyn->vector_sew != VECTOR_SEWNA) + if (BOX64DRENV(dynarec_callret) && dyn->vector_sew != VECTOR_SEWNA) vector_vsetvli(dyn, ninst, x3, dyn->vector_sew, VECTOR_LMUL1, 1); - if (BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... j64 = getJumpTableAddress64(addr); TABLE64(x4, j64); @@ -1466,13 +1466,13 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int break; case 2: // CALL Ed INST_NAME("CALL Ed"); - PASS2IF ((BOX64ENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { + PASS2IF ((BOX64DRENV(dynarec_safeflags) > 1) || ((ninst && dyn->insts[ninst - 1].x64.set_flags) || ((ninst > 1) && dyn->insts[ninst - 2].x64.set_flags)), 1) { READFLAGS(X_PEND); // that's suspicious } else { SETFLAGS(X_ALL, SF_SET_NODF, NAT_FLAGS_NOFUSION); // Hack to put flag in "don't care" state } GETEDz(0); - if (BOX64ENV(dynarec_callret) && BOX64ENV(dynarec_bigblock) > 1) { + if (BOX64DRENV(dynarec_callret) && BOX64DRENV(dynarec_bigblock) > 1) { BARRIER(BARRIER_FULL); } else { BARRIER(BARRIER_FLOAT); @@ -1480,7 +1480,7 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int *ok = 0; } GETIP_(addr); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { SET_HASCALLRET(); j64 = (dyn->insts) ? (GETMARK - (dyn->native_size)) : 0; AUIPC(x4, ((j64 + 0x800) >> 12) & 0xfffff); @@ -1493,9 +1493,9 @@ uintptr_t dynarec64_00_3(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int PUSH1z(xRIP); jump_to_next(dyn, 0, ed, ninst, rex.is32bits); MARK; - if (BOX64ENV(dynarec_callret) && dyn->vector_sew != VECTOR_SEWNA) + if (BOX64DRENV(dynarec_callret) && dyn->vector_sew != VECTOR_SEWNA) vector_vsetvli(dyn, ninst, x3, dyn->vector_sew, VECTOR_LMUL1, 1); - if (BOX64ENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { + if (BOX64DRENV(dynarec_callret) && addr >= (dyn->start + dyn->isize)) { // jumps out of current dynablock... j64 = getJumpTableAddress64(addr); TABLE64(x4, j64); diff --git a/src/dynarec/rv64/dynarec_rv64_0f.c b/src/dynarec/rv64/dynarec_rv64_0f.c index 73093af9..fd22aad4 100644 --- a/src/dynarec/rv64/dynarec_rv64_0f.c +++ b/src/dynarec/rv64/dynarec_rv64_0f.c @@ -1823,7 +1823,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni nextop = F8; INST_NAME("SHLD Ed, Gd, CL"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETGD; GETED(0); @@ -1885,7 +1885,7 @@ uintptr_t dynarec64_0F(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni nextop = F8; INST_NAME("SHRD Ed, Gd, CL"); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETGD; GETED(0); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 5fb476d9..fc939557 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -1302,7 +1302,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(x2, xRCX, 0x1f); BEQ_NEXT(x2, xZR); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETEW(x1, 0); emit_shr16(dyn, ninst, x1, x2, x5, x4, x6); @@ -1314,7 +1314,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(x2, xRCX, 0x1f); BEQ_NEXT(x2, xZR); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETEW(x1, 0); emit_shl16(dyn, ninst, x1, x2, x5, x4, x6); @@ -1325,7 +1325,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni ANDI(x2, xRCX, 0x1f); BEQ_NEXT(x2, xZR); SETFLAGS(X_ALL, SF_SET_PENDING, NAT_FLAGS_FUSION); // some flags are left undefined - if (BOX64ENV(dynarec_safeflags) > 1) + if (BOX64DRENV(dynarec_safeflags) > 1) MAYSETFLAGS(); GETSEW(x1, 0); emit_sar16(dyn, ninst, x1, x2, x5, x4, x6); diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index fd88271f..8f53ceb3 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -611,7 +611,7 @@ void ret_to_epilog(dynarec_rv64_t* dyn, int ninst, rex_t rex) POP1z(xRIP); MVz(x1, xRIP); SMEND(); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { // pop the actual return address from RV64 stack LD(xRA, xSP, 0); // native addr LD(x6, xSP, 8); // x86 addr @@ -680,7 +680,7 @@ void retn_to_epilog(dynarec_rv64_t* dyn, int ninst, rex_t rex, int n) } MVz(x1, xRIP); SMEND(); - if (BOX64ENV(dynarec_callret)) { + if (BOX64DRENV(dynarec_callret)) { // pop the actual return address from RV64 stack LD(xRA, xSP, 0); // native addr LD(x6, xSP, 8); // x86 addr diff --git a/src/include/debug.h b/src/include/debug.h index 0510d7fe..d5786ae1 100644 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -5,6 +5,7 @@ typedef struct box64context_s box64context_t; extern box64env_t box64env; +extern box64env_t* cur_box64env; extern uintptr_t box64_pagesize; extern int box64_rdtsc; diff --git a/src/include/env.h b/src/include/env.h index ba867f41..17ca27a9 100644 --- a/src/include/env.h +++ b/src/include/env.h @@ -5,6 +5,8 @@ #include <unistd.h> #define BOX64ENV(name) (box64env.name) +#define BOX64DRENV(name) \ + ((GetCurEnvByAddr(dyn->start) && cur_box64env->is_##name##_overridden) ? cur_box64env->name : box64env.name) #define SET_BOX64ENV(name, value) \ { \ box64env.name = (value); \ @@ -200,6 +202,8 @@ void ApplyEnvFileEntry(const char* name); const char* GetLastApplyEntryName(); void InitializeEnv(); void LoadEnvVariables(); -void PrintEnvVariables(); +void PrintEnvVariables(box64env_t* env, int level); +void RecordEnvMappings(uintptr_t addr, size_t length, int fd); +box64env_t* GetCurEnvByAddr(uintptr_t addr); #endif // __ENV_H diff --git a/src/include/wine_tools.h b/src/include/wine_tools.h index 4529a6d4..4bb0aa3a 100644 --- a/src/include/wine_tools.h +++ b/src/include/wine_tools.h @@ -10,6 +10,6 @@ void* get_wine_prereserve(void); void dynarec_wine_prereserve(void); #endif -void detect_unityplayer(int fd); +void DetectUnityPlayer(int fd); #endif //__WINE_TOOLS_H__ diff --git a/src/tools/env.c b/src/tools/env.c index 4f61083a..36b01821 100644 --- a/src/tools/env.c +++ b/src/tools/env.c @@ -12,13 +12,16 @@ #include "debug.h" #include "fileutils.h" #include "box64context.h" +#include "rbtree.h" box64env_t box64env = { 0 }; +box64env_t* cur_box64env = NULL; KHASH_MAP_INIT_STR(box64env_entry, box64env_t) static kh_box64env_entry_t* box64env_entries = NULL; static kh_box64env_entry_t* box64env_entries_gen = NULL; +static rbtree_t* envmap = NULL; static const char default_rcfile[] = "[bash]\n" @@ -379,7 +382,7 @@ const char* GetLastApplyEntryName() { return old_entryname; } -static void internalEnvFileEntry(const char* entryname, const box64env_t* env) +static void internalApplyEnvFileEntry(const char* entryname, const box64env_t* env) { #define INTEGER(NAME, name, default, min, max) \ if (env->is_##name##_overridden) { \ @@ -433,13 +436,13 @@ void ApplyEnvFileEntry(const char* entryname) const char* k2; kh_foreach_ref(box64env_entries_gen, k2, env, if (strstr(lowercase_entryname, k2)) - internalEnvFileEntry(entryname, env);) + internalApplyEnvFileEntry(entryname, env);) box_free(lowercase_entryname); } if (k1 == kh_end(box64env_entries)) return; box64env_t* env = &kh_value(box64env_entries, k1); - internalEnvFileEntry(entryname, env); + internalApplyEnvFileEntry(entryname, env); applyCustomRules(); } @@ -507,25 +510,25 @@ void LoadEnvVariables() applyCustomRules(); } -void PrintEnvVariables() +void PrintEnvVariables(box64env_t* env, int level) { - if (box64env.is_any_overridden) - printf_log(LOG_INFO, "BOX64ENV: Variables overridden via env and/or RC file:\n"); + if (env->is_any_overridden) + printf_log(level, "BOX64ENV: Variables overridden via env and/or RC file:\n"); #define INTEGER(NAME, name, default, min, max) \ - if (box64env.is_##name##_overridden) \ - printf_log_prefix(0, LOG_INFO, "\t%s=%d\n", #NAME, box64env.name); -#define INTEGER64(NAME, name, default) \ - if (box64env.is_##name##_overridden) \ - printf_log_prefix(0, LOG_INFO, "\t%s=%lld\n", #NAME, box64env.name); -#define BOOLEAN(NAME, name, default) \ - if (box64env.is_##name##_overridden) \ - printf_log_prefix(0, LOG_INFO, "\t%s=%d\n", #NAME, box64env.name); -#define ADDRESS(NAME, name) \ - if (box64env.is_##name##_overridden) \ - printf_log_prefix(0, LOG_INFO, "\t%s=%p\n", #NAME, (void*)box64env.name); -#define STRING(NAME, name) \ - if (box64env.is_##name##_overridden) \ - printf_log_prefix(0, LOG_INFO, "\t%s=%s\n", #NAME, box64env.name); + if (env->is_##name##_overridden) \ + printf_log_prefix(0, level, "\t%s=%d\n", #NAME, env->name); +#define INTEGER64(NAME, name, default) \ + if (env->is_##name##_overridden) \ + printf_log_prefix(0, level, "\t%s=%lld\n", #NAME, env->name); +#define BOOLEAN(NAME, name, default) \ + if (env->is_##name##_overridden) \ + printf_log_prefix(0, level, "\t%s=%d\n", #NAME, env->name); +#define ADDRESS(NAME, name) \ + if (env->is_##name##_overridden) \ + printf_log_prefix(0, level, "\t%s=%p\n", #NAME, (void*)env->name); +#define STRING(NAME, name) \ + if (env->is_##name##_overridden) \ + printf_log_prefix(0, level, "\t%s=%s\n", #NAME, env->name); ENVSUPER() #undef INTEGER #undef INTEGER64 @@ -533,3 +536,40 @@ void PrintEnvVariables() #undef ADDRESS #undef STRING } + +void RecordEnvMappings(uintptr_t addr, size_t length, int fd) +{ + if (!envmap) { envmap = rbtree_init("envmap"); } + + char* filename = NULL; + if (fd > 0) { + static char fullname[4096]; + static char buf[128]; + sprintf(buf, "/proc/self/fd/%d", fd); + ssize_t r = readlink(buf, fullname, sizeof(fullname) - 1); + if (r != -1) fullname[r] = 0; + + filename = strrchr(fullname, '/'); + } + if (!filename) return; + + char* lowercase_filename = LowerCase(filename); + + khint_t k = kh_get(box64env_entry, box64env_entries, lowercase_filename); + if (k == kh_end(box64env_entries)) return; + + box64env_t* env = &kh_value(box64env_entries, k); + rb_set_64(envmap, addr, addr + length, (uint64_t)env); + printf_log(LOG_DEBUG, "Applied [%s] of range %p:%p\n", filename, addr, addr + length); + PrintEnvVariables(env, LOG_DEBUG); +} + +box64env_t* GetCurEnvByAddr(uintptr_t addr) +{ + if (!envmap) { + envmap = rbtree_init("envmap"); + return NULL; + } + cur_box64env = (box64env_t*)rb_get_64(envmap, addr); + return cur_box64env; +} diff --git a/src/tools/wine_tools.c b/src/tools/wine_tools.c index ffbebdf2..7506710f 100644 --- a/src/tools/wine_tools.c +++ b/src/tools/wine_tools.c @@ -150,7 +150,7 @@ void dynarec_wine_prereserve() } #endif -void detect_unityplayer(int fd) +void DetectUnityPlayer(int fd) { static int unityplayer_detected = 0; if (fd > 0 && BOX64ENV(unityplayer) && !unityplayer_detected) { @@ -164,7 +164,7 @@ void detect_unityplayer(int fd) #ifdef DYNAREC if (!BOX64ENV(dynarec_strongmem)) { SET_BOX64ENV(dynarec_strongmem, 1); - PrintEnvVariables(); + PrintEnvVariables(&box64env, LOG_INFO); } #endif unityplayer_detected = 1; diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index ead6574d..d3af7de0 100644 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -3005,7 +3005,8 @@ EXPORT void* my_mmap64(x64emu_t* emu, void *addr, size_t length, int prot, int f prot |= PROT_NEVERCLEAN; } } - detect_unityplayer(fd); + DetectUnityPlayer(fd); + RecordEnvMappings((uintptr_t)addr, length, fd); if(emu) setProtection_mmap((uintptr_t)ret, length, prot); else |