about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-01-24 01:46:18 +0800
committerGitHub <noreply@github.com>2025-01-23 18:46:18 +0100
commit7099774a3c82642ad64bc3a4f1b798e951904f7d (patch)
tree6432d96090892c5f7a6e52c9c3cf18ab09a1a60b /src
parent925f6a992232e1011667d6334b04072f75659386 (diff)
downloadbox64-7099774a3c82642ad64bc3a4f1b798e951904f7d.tar.gz
box64-7099774a3c82642ad64bc3a4f1b798e951904f7d.zip
[DYNAREC] Added preliminary per-file settings (#2288)
Diffstat (limited to 'src')
-rw-r--r--src/core.c42
-rw-r--r--src/dynarec/arm64/dynarec_arm64_00.c80
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c12
-rw-r--r--src/dynarec/arm64/dynarec_arm64_64.c21
-rw-r--r--src/dynarec/arm64/dynarec_arm64_66.c18
-rw-r--r--src/dynarec/arm64/dynarec_arm64_660f.c4
-rw-r--r--src/dynarec/arm64/dynarec_arm64_67.c8
-rw-r--r--src/dynarec/arm64/dynarec_arm64_emit_math.c6
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c4
-rw-r--r--src/dynarec/dynarec_helper.h58
-rw-r--r--src/dynarec/dynarec_native.c2
-rw-r--r--src/dynarec/dynarec_native_pass.c13
-rw-r--r--src/dynarec/la64/dynarec_la64_00.c24
-rw-r--r--src/dynarec/la64/dynarec_la64_66.c6
-rw-r--r--src/dynarec/la64/dynarec_la64_helper.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_00_3.c30
-rw-r--r--src/dynarec/rv64/dynarec_rv64_0f.c4
-rw-r--r--src/dynarec/rv64/dynarec_rv64_66.c6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c4
-rw-r--r--src/include/debug.h1
-rw-r--r--src/include/env.h6
-rw-r--r--src/include/wine_tools.h2
-rw-r--r--src/tools/env.c80
-rw-r--r--src/tools/wine_tools.c4
-rw-r--r--src/wrapped/wrappedlibc.c3
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