about summary refs log tree commit diff stats
path: root/src/tools
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/tools
parent925f6a992232e1011667d6334b04072f75659386 (diff)
downloadbox64-7099774a3c82642ad64bc3a4f1b798e951904f7d.tar.gz
box64-7099774a3c82642ad64bc3a4f1b798e951904f7d.zip
[DYNAREC] Added preliminary per-file settings (#2288)
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/env.c80
-rw-r--r--src/tools/wine_tools.c4
2 files changed, 62 insertions, 22 deletions
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;