about summary refs log tree commit diff stats
path: root/src/include
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-01-21 23:13:51 +0800
committerGitHub <noreply@github.com>2025-01-21 16:13:51 +0100
commit044dec0bfa0f3f8f62f7703d6b0a8600c1354dc5 (patch)
treedc41c611965cec299dcb62185c5fba4935b6251f /src/include
parented8b6fe9db863a8d9e473a645e84700c7291bb06 (diff)
downloadbox64-044dec0bfa0f3f8f62f7703d6b0a8600c1354dc5.tar.gz
box64-044dec0bfa0f3f8f62f7703d6b0a8600c1354dc5.zip
[ENV] Initial refactor of env variables infrastructure (#2274)
* [ENV] Initial refactor of env variables infrastructure

* Ported BOX64_DYNAREC_LOG

* Ported more options

* Ported BOX64_MALLOC_HACK

* Ported BOX64_DYNAREC_TEST

* Ported more options

* Ported more options

* Ported more options

* Ported all options

* Removed old rcfile parser

* Fix

* review

* fix

* fix

* more fixes
Diffstat (limited to 'src/include')
-rw-r--r--src/include/box64context.h2
-rw-r--r--src/include/debug.h99
-rw-r--r--src/include/env.h200
-rw-r--r--src/include/rcfile.h9
4 files changed, 217 insertions, 93 deletions
diff --git a/src/include/box64context.h b/src/include/box64context.h
index 6c14e219..d2c1d23a 100644
--- a/src/include/box64context.h
+++ b/src/include/box64context.h
@@ -259,7 +259,7 @@ void FreeBox64Context(box64context_t** context);
 // Cycle log handling
 void freeCycleLog(box64context_t* ctx);
 void initCycleLog(box64context_t* context);
-void print_cycle_log(int loglevel);
+void print_rolling_log(int loglevel);
 
 // return the index of the added header
 int AddElfHeader(box64context_t* ctx, elfheader_t* head);
diff --git a/src/include/debug.h b/src/include/debug.h
index 48843392..36a2e14a 100644
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -1,52 +1,16 @@
 #ifndef __DEBUG_H_
 #define __DEBUG_H_
 #include <stdint.h>
+#include <env.h>
 
 typedef struct box64context_s box64context_t;
-extern int box64_log;    // log level
-extern int box64_dump;   // dump elf or not
-extern int box64_dynarec_log;
-extern int box64_dynarec;
+extern box64env_t box64env;
+
 extern uintptr_t box64_pagesize;
-extern uintptr_t box64_load_addr;
-extern int box64_dynarec_test;
-extern int box64_maxcpu;
-extern int box64_mmap32;
-extern int box64_ignoreint3;
 extern int box64_rdtsc;
-extern int box64_rdtsc_1ghz;
 extern uint8_t box64_rdtsc_shift;
 extern int box64_is32bits;
-extern int box64_x11sync;
-extern int box64_dynarec_gdbjit;
-extern int box64_cputype;
 #ifdef DYNAREC
-extern int box64_dynarec_dump;
-extern int box64_dynarec_trace;
-extern int box64_dynarec_forced;
-extern uintptr_t box64_nodynarec_start, box64_nodynarec_end;
-extern uintptr_t box64_dynarec_test_start, box64_dynarec_test_end;
-extern int box64_dynarec_bigblock;
-extern int box64_dynarec_forward;
-extern int box64_dynarec_strongmem;
-extern int box64_dynarec_weakbarrier;
-extern int box64_dynarec_pause;
-extern int box64_dynarec_fastnan;
-extern int box64_dynarec_fastround;
-extern int box64_dynarec_x87double;
-extern int box64_dynarec_div0;
-extern int box64_dynarec_safeflags;
-extern int box64_dynarec_callret;
-extern int box64_dynarec_bleeding_edge;
-extern int box64_dynarec_tbb;
-extern int box64_dynarec_wait;
-extern int box64_dynarec_missing;
-extern int box64_dynarec_aligned_atomics;
-extern int box64_dynarec_nativeflags;
-extern int box64_dynarec_df;
-extern int box64_dynarec_perf_map;
-extern int box64_dynarec_perf_map_fd;
-extern int box64_dynarec_dirty;
 #ifdef ARM64
 extern int arm64_asimd;
 extern int arm64_aes;
@@ -84,58 +48,18 @@ extern int la64_lamcas;
 extern int la64_scq;
 #endif
 #endif
-extern int box64_libcef;
-extern int box64_jvm;
-extern int box64_unityplayer;
-extern int box64_sdl2_jguid;
-extern int dlsym_error;    // log dlsym error
-extern int cycle_log;      // if using rolling logs
 #ifdef HAVE_TRACE
-extern int trace_xmm;      // include XMM reg in trace?
-extern int trace_emm;      // include EMM reg in trace?
-extern int trace_regsdiff; // colorize standard registers on changes
 extern uintptr_t trace_start, trace_end;
 extern char* trace_func;
-extern char* trace_init;
-extern char* box64_trace;
-extern uint64_t start_cnt;
 #endif
-extern int box64_nosandbox;
-extern int box64_inprocessgpu;
-extern int box64_cefdisablegpu;
-extern int box64_cefdisablegpucompositor;
-extern int box64_maxcpu_immutable;
-extern int box64_malloc_hack;
-extern int box64_dummy_crashhandler;
-extern int box64_sse_flushto0;
-extern int box64_x87_no80bits;
-extern int box64_sync_rounding;
-extern int box64_shaext;
-extern int box64_sse42;
-extern int box64_avx;
-extern int box64_avx2;
-extern int allow_missing_libs;
 extern int box64_mapclean;
-extern int box64_prefer_wrapped;
-extern int box64_prefer_emulated;
-extern int box64_wrap_egl;
 extern int box64_steam;
 extern int box64_steamcmd;
 extern int box64_wine;
 extern int box64_musl;
-extern int box64_nopulse;   // disabling the use of wrapped pulseaudio
-extern int box64_nogtk; // disabling the use of wrapped gtk
-extern int box64_novulkan;  // disabling the use of wrapped vulkan
-extern int box64_showsegv;  // show sigv, even if a signal handler is present
-extern int box64_showbt;    // show a backtrace if a signal is caught
 extern int box64_isglibc234; // is the program linked with glibc 2.34+
-extern int box64_futex_waitv;
-extern int box64_x11threads;
-extern int box64_x11glx;
-extern char* box64_libGL;
 extern uintptr_t fmod_smc_start, fmod_smc_end; // to handle libfmod (from Unreal) SMC (self modifying code)
 extern uint32_t default_gs, default_fs;
-extern int jit_gdb; // launch gdb when a segfault is trapped
 extern int box64_tcmalloc_minimal;  // when using tcmalloc_minimal
 #define LOG_NONE 0
 #define LOG_INFO 1
@@ -145,13 +69,22 @@ extern int box64_tcmalloc_minimal;  // when using tcmalloc_minimal
 
 void printf_ftrace(const char* fmt, ...);
 
-#define printf_log(L, ...) do {if((L)<=box64_log) {printf_ftrace(__VA_ARGS__);}} while(0)
+#define printf_log(L, ...)                                        \
+    do {                                                          \
+        if ((L) <= BOX64ENV(log)) { printf_ftrace(__VA_ARGS__); } \
+    } while (0)
 
-#define printf_dump(L, ...) do {if(box64_dump || ((L)<=box64_log)) {printf_ftrace(__VA_ARGS__);}} while(0)
+#define printf_dump(L, ...)                                                           \
+    do {                                                                              \
+        if (BOX64ENV(dump) || ((L) <= BOX64ENV(log))) { printf_ftrace(__VA_ARGS__); } \
+    } while (0)
 
-#define printf_dlsym(L, ...) do {if(dlsym_error || ((L)<=box64_log)) {printf_ftrace(__VA_ARGS__);}} while(0)
+#define printf_dlsym(L, ...)                                                                 \
+    do {                                                                                     \
+        if (BOX64ENV(dlsym_error) || ((L) <= BOX64ENV(log))) { printf_ftrace(__VA_ARGS__); } \
+    } while (0)
 
-#define dynarec_log(L, ...) do {if((L)<=box64_dynarec_log) {printf_ftrace(__VA_ARGS__);}} while(0)
+#define dynarec_log(L, ...) do {if((L)<=BOX64ENV(dynarec_log)) {printf_ftrace(__VA_ARGS__);}} while(0)
 
 #define EXPORT __attribute__((visibility("default")))
 #ifdef BUILD_DYNAMIC
diff --git a/src/include/env.h b/src/include/env.h
new file mode 100644
index 00000000..d5385d8a
--- /dev/null
+++ b/src/include/env.h
@@ -0,0 +1,200 @@
+#ifndef __ENV_H
+#define __ENV_H
+
+#include <stdint.h>
+#include <unistd.h>
+
+#define BOX64ENV(name)            (box64env.name)
+#define SET_BOX64ENV(name, value) { box64env.name = (value); box64env.is_##name##_overridden = 1; }
+
+/*
+    INTEGER(NAME, name, default, min, max)
+    INTEGER64(NAME, name, default)
+    BOOLEAN(NAME, name, default)
+    ADDRESS(NAME, name)
+    STRING(NAME, name)
+*/
+
+extern char* ftrace_name;
+#define DEFAULT_LOG_LEVEL (ftrace_name ? LOG_INFO : (isatty(fileno(stdout)) ? LOG_INFO : LOG_NONE))
+
+#define ENVSUPER1()                                                          \
+    STRING(BOX64_ADDLIBS, addlibs)                                           \
+    BOOLEAN(BOX64_ALLOWMISSINGLIBS, allow_missing_libs, 0)                   \
+    STRING(BOX64_ARGS, args)                                                 \
+    STRING(BOX64_BASH, bash)                                                 \
+    BOOLEAN(BOX64_CEFDISABLEGPU, cefdisablegpu, 0)                           \
+    BOOLEAN(BOX64_CEFDISABLEGPUCOMPOSITOR, cefdisablegpucompositor, 0)       \
+    INTEGER(BOX64_CPUTYPE, cputype, 0, 0, 1)                                 \
+    BOOLEAN(BOX64_CRASHHANDLER, dummy_crashhandler, 1)                       \
+    BOOLEAN(BOX64_DLSYM_ERROR, dlsym_error, 0)                               \
+    INTEGER(BOX64_DUMP, dump, 0, 0, 2)                                       \
+    BOOLEAN(BOX64_DYNAREC_ALIGNED_ATOMICS, dynarec_aligned_atomics, 0)       \
+    INTEGER(BOX64_DYNAREC_BIGBLOCK, dynarec_bigblock, 1, 0, 3)               \
+    BOOLEAN(BOX64_DYNAREC_BLEEDING_EDGE, dynarec_bleeding_edge, 1)           \
+    BOOLEAN(BOX64_DYNAREC_CALLRET, dynarec_callret, 0)                       \
+    BOOLEAN(BOX64_DYNAREC_DF, dynarec_df, 0)                                 \
+    BOOLEAN(BOX64_DYNAREC_DIRTY, dynarec_dirty, 0)                           \
+    BOOLEAN(BOX64_DYNAREC_DIV0, dynarec_div0, 0)                             \
+    INTEGER(BOX64_DYNAREC_DUMP, dynarec_dump, 0, 0, 2)                       \
+    BOOLEAN(BOX64_DYNAREC_FASTNAN, dynarec_fastnan, 1)                       \
+    BOOLEAN(BOX64_DYNAREC_FASTROUND, dynarec_fastround, 1)                   \
+    BOOLEAN(BOX64_DYNAREC_FORCED, dynarec_forced, 0)                         \
+    INTEGER(BOX64_DYNAREC_FORWARD, dynarec_forward, 128, 0, 1024)            \
+    BOOLEAN(BOX64_DYNAREC_GDBJIT, dynarec_gdbjit, 0)                         \
+    INTEGER(BOX64_DYNAREC_LOG, dynarec_log, 0, 0, 3)                         \
+    BOOLEAN(BOX64_DYNAREC_MISSING, dynarec_missing, 0)                       \
+    BOOLEAN(BOX64_DYNAREC_NATIVEFLAGS, dynarec_nativeflags, 1)               \
+    INTEGER(BOX64_DYNAREC_PAUSE, dynarec_pause, 0, 0, 3)                     \
+    BOOLEAN(BOX64_DYNAREC_PERFMAP, dynarec_perf_map, 0)                      \
+    INTEGER(BOX64_DYNAREC_SAFEFLAGS, dynarec_safeflags, 1, 0, 2)             \
+    BOOLEAN(BOX64_DYNAREC_STRONGMEM, dynarec_strongmem, 0)                   \
+    BOOLEAN(BOX64_DYNAREC_TBB, dynarec_tbb, 1)                               \
+    STRING(BOX64_DYNAREC_TEST, dynarec_test_str)                             \
+    BOOLEAN(BOX64_DYNAREC_TRACE, dynarec_trace, 0)                           \
+    BOOLEAN(BOX64_DYNAREC_WAIT, dynarec_wait, 1)                             \
+    BOOLEAN(BOX64_DYNAREC_WEAKBARRIER, dynarec_weakbarrier, 1)               \
+    BOOLEAN(BOX64_DYNAREC_X87DOUBLE, dynarec_x87double, 0)                   \
+    STRING(BOX64_EMULATED_LIBS, emulated_libs)                               \
+    STRING(BOX64_ENV, env)                                                   \
+    STRING(BOX64_ENV1, env1)                                                 \
+    STRING(BOX64_ENV2, env2)                                                 \
+    STRING(BOX64_ENV3, env3)                                                 \
+    STRING(BOX64_ENV4, env4)                                                 \
+    STRING(BOX64_ENV5, env5)                                                 \
+    BOOLEAN(BOX64_EXIT, exit, 0)                                             \
+    BOOLEAN(BOX64_FIX_64BIT_INODES, fix_64bit_inodes, 0)                     \
+    BOOLEAN(BOX64_IGNOREINT3, ignoreint3, 0)                                 \
+    STRING(BOX64_INSERT_ARGS, insert_args)                                   \
+    BOOLEAN(BOX64_INPROCESSGPU, inprocessgpu, 0)                             \
+    BOOLEAN(BOX64_JITGDB, jitgdb, 0)                                         \
+    BOOLEAN(BOX64_JVM, jvm, 1)                                               \
+    STRING(BOX64_LD_LIBRARY_PATH, ld_library_path)                           \
+    BOOLEAN(BOX64_LIBCEF, libcef, 1)                                         \
+    STRING(BOX64_LIBGL, libgl)                                               \
+    ADDRESS(BOX64_LOAD_ADDR, load_addr)                                      \
+    INTEGER(BOX64_LOG, log, DEFAULT_LOG_LEVEL, 0, 3)                         \
+    BOOLEAN(BOX64_MALLOC_HACK, malloc_hack, 0)                               \
+    INTEGER(BOX64_MAXCPU, new_maxcpu, 0, 0, 100)                             \
+    BOOLEAN(BOX64_NOBANNER, nobanner, (isatty(fileno(stdout)) ? 0 : 1))      \
+    STRING(BOX64_NODYNAREC, nodynarec)                                       \
+    BOOLEAN(BOX64_NOGTK, nogtk, 0)                                           \
+    BOOLEAN(BOX64_NOPULSE, nopulse, 0)                                       \
+    BOOLEAN(BOX64_NORCFILES, noenvfiles, 0)                                  \
+    BOOLEAN(BOX64_NOSANDBOX, nosandbox, 0)                                   \
+    BOOLEAN(BOX64_NOSIGSEGV, nosigsegv, 0)                                   \
+    BOOLEAN(BOX64_NOSIGILL, nosigill, 0)                                     \
+    BOOLEAN(BOX64_NOVULKAN, novulkan, 0)                                     \
+    STRING(BOX64_PATH, path)                                                 \
+    BOOLEAN(BOX64_PREFER_EMULATED, prefer_emulated, 0)                       \
+    BOOLEAN(BOX64_PREFER_WRAPPED, prefer_wrapped, 0)                         \
+    STRING(BOX64_RCFILE, envfile)                                            \
+    BOOLEAN(BOX64_RDTSC_1GHZ, rdtsc_1ghz, 0)                                 \
+    BOOLEAN(BOX64_RESERVE_HIGH, reserve_high, 0)                             \
+    BOOLEAN(BOX64_ROLLING_LOG, rolling_log, 0)                               \
+    BOOLEAN(BOX64_SDL2_JGUID, sdl2_jguid, 0)                                 \
+    BOOLEAN(BOX64_SHAEXT, shaext, 1)                                         \
+    BOOLEAN(BOX64_SHOWBT, showbt, 0)                                         \
+    BOOLEAN(BOX64_SHOWSEGV, showsegv, 0)                                     \
+    BOOLEAN(BOX64_SSE_FLUSHTO0, sse_flushto0, 0)                             \
+    BOOLEAN(BOX64_SSE42, sse42, 1)                                           \
+    BOOLEAN(BOX64_SYNC_ROUNDING, sync_rounding, 0)                           \
+    BOOLEAN(BOX64_TRACE_COLOR, trace_regsdiff, 0)                            \
+    BOOLEAN(BOX64_TRACE_EMM, trace_emm, 0)                                   \
+    STRING(BOX64_TRACE_FILE, trace_file)                                     \
+    STRING(BOX64_TRACE_INIT, trace_init)                                     \
+    INTEGER64(BOX64_TRACE_START, start_cnt, 0)                               \
+    BOOLEAN(BOX64_TRACE_XMM, trace_xmm, 0)                                   \
+    STRING(BOX64_TRACE, trace)                                               \
+    BOOLEAN(BOX64_UNITYPLAYER, unityplayer, 1)                               \
+    BOOLEAN(BOX64_WRAP_EGL, wrap_egl, 0)                                     \
+    BOOLEAN(BOX64_X11GLX, x11glx, 1)                                         \
+    BOOLEAN(BOX64_X11SYNC, x11sync, 0)                                       \
+    BOOLEAN(BOX64_X11THREADS, x11threads, 0)                                 \
+    BOOLEAN(BOX64_X87_NO80BITS, x87_no80bits, 0)
+
+#ifdef ARM64
+#define ENVSUPER2() \
+    INTEGER(BOX64_AVX, avx, 2, 0, 2)
+#else
+#define ENVSUPER2() \
+    INTEGER(BOX64_AVX, avx, 0, 0, 2)
+#endif
+
+#ifdef DYNAREC
+#define ENVSUPER3() \
+    BOOLEAN(BOX64_DYNAREC, dynarec, 1)
+#else
+#define ENVSUPER3() \
+    BOOLEAN(BOX64_DYNAREC, dynarec, 0)
+#endif
+
+#ifdef BAD_SIGNAL
+#define ENVSUPER4() \
+    BOOLEAN(BOX64_FUTEX_WAITV, futex_waitv, 0)
+#else
+#define ENVSUPER4() \
+    BOOLEAN(BOX64_FUTEX_WAITV, futex_waitv, 1)
+#endif
+
+#if defined(SD845) || defined(SD888) || defined(SD8G2) || defined(TEGRAX1)
+#define ENVSUPER5() \
+    BOOLEAN(BOX64_MMAP32, mmap32, 1)
+#else
+#define ENVSUPER5() \
+    BOOLEAN(BOX64_MMAP32, mmap32, 0)
+#endif
+
+#define ENVSUPER() \
+    ENVSUPER1()    \
+    ENVSUPER2()    \
+    ENVSUPER3()    \
+    ENVSUPER4()    \
+    ENVSUPER5()
+
+typedef struct box64env_s {
+#define INTEGER(NAME, name, default, min, max) int name;
+#define INTEGER64(NAME, name, default)         int64_t name;
+#define BOOLEAN(NAME, name, default)           int name;
+#define ADDRESS(NAME, name)                    uintptr_t name;
+#define STRING(NAME, name)                     char* name;
+    ENVSUPER()
+#undef INTEGER
+#undef INTEGER64
+#undef BOOLEAN
+#undef ADDRESS
+#undef STRING
+
+#define INTEGER(NAME, name, default, min, max) uint64_t is_##name##_overridden : 1;
+#define INTEGER64(NAME, name, default)         uint64_t is_##name##_overridden : 1;
+#define BOOLEAN(NAME, name, default)           uint64_t is_##name##_overridden : 1;
+#define ADDRESS(NAME, name)                    uint64_t is_##name##_overridden : 1;
+#define STRING(NAME, name)                     uint64_t is_##name##_overridden : 1;
+    ENVSUPER()
+#undef INTEGER
+#undef INTEGER64
+#undef BOOLEAN
+#undef ADDRESS
+#undef STRING
+
+    /******** Custom ones ********/
+    int maxcpu;
+    int dynarec_test;
+    int avx2;
+    uintptr_t dynarec_test_start;
+    uintptr_t dynarec_test_end;
+    uintptr_t nodynarec_start;
+    uintptr_t nodynarec_end;
+    int dynarec_perf_map_fd;
+
+    uint64_t is_dynarec_perf_map_fd_overridden : 1;
+} box64env_t;
+
+void InitializeEnvFiles();
+void ApplyEnvFileEntry(const char* name);
+const char* GetLastApplyEntryName();
+void InitializeEnv();
+void LoadEnvVariables();
+void PrintEnvVariables();
+
+#endif // __ENV_H
diff --git a/src/include/rcfile.h b/src/include/rcfile.h
deleted file mode 100644
index 3c8218cb..00000000
--- a/src/include/rcfile.h
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef __RCFILE_H__
-#define __RCFILE_H__
-
-void LoadRCFile(const char* filename);
-void DeleteParams(void);
-void ApplyParams(const char* name);
-const char* GetLastApplyName();
-
-#endif //__RCFILE_H__
\ No newline at end of file