diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-01-21 23:13:51 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-21 16:13:51 +0100 |
| commit | 044dec0bfa0f3f8f62f7703d6b0a8600c1354dc5 (patch) | |
| tree | dc41c611965cec299dcb62185c5fba4935b6251f /src/tools/rcfile.c | |
| parent | ed8b6fe9db863a8d9e473a645e84700c7291bb06 (diff) | |
| download | box64-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/tools/rcfile.c')
| -rw-r--r-- | src/tools/rcfile.c | 783 |
1 files changed, 0 insertions, 783 deletions
diff --git a/src/tools/rcfile.c b/src/tools/rcfile.c deleted file mode 100644 index 674ec52d..00000000 --- a/src/tools/rcfile.c +++ /dev/null @@ -1,783 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "debug.h" -#include "rcfile.h" -#include "box64context.h" -#include "fileutils.h" -#include "pathcoll.h" -#include "x64emu.h" -#ifdef HAVE_TRACE -#include "x64trace.h" -#endif -#include "custommem.h" -#include "khash.h" - -// This file handle the box64rc files -// file are basicaly ini file, with section [XXXX] defining the name of the process -// and BOX64_XXXX=YYYY entry like the env. var. variables - -// default rcfile -static const char default_rcfile[] = -"[bash]\n" -"BOX64_LOG=0\n" -"\n" -"[deadcells]\n" -"BOX64_PREFER_EMULATED=1\n" -"\n" -"[dontstarve]\n" -"BOX64_EMULATED_LIBS=libSDL2-2.0.so.0\n" -"\n" -"[dota2]\n" -"BOX64_CRASHHANDLER=1\n" -"BOX64_DYNAREC_STRONGMEM=1\n" -"\n" -"[factorio]\n" -"BOX64_DYNAREC_FASTROUND=0\n" -"\n" -"[heroic]\n" -"BOX64_NOSANDBOX=1\n" -"BOX64_MALLOC_HACK=2\n" -"\n" -"[LotCG.x86_64]\n" -"BOX64_DYNAREC_FASTROUND=0\n" -"\n" -"[Mini Metro]\n" -"BOX64_ADDLIBS=stdc++.so.6\n" -"\n" -"[pressure-vessel-wrap]\n" -"BOX64_NOGTK=1\n" -"\n" -"[ShovelKnight]\n" -"BOX64_SDL2_JGUID=1\n" -"\n" -"[Soma.bin.x86_64]\n" -"BOX64_DYNAREC_FASTROUND=0\n" -"\n" -"[streaming_client]\n" -"BOX64_EMULATED_LIBS=libSDL2-2.0.so.0:libSDL2_ttf-2.0.so.0\n" -"\n" -"[steam-runtime-check-requirements]\n" -"BOX64_EXIT=1\n" -"\n" -"[steam-runtime-launcher-service]\n" -"BOX64_EXIT=1\n" -; - -// list of all entries -#define SUPER1() \ -ENTRYINTPOS(BOX64_ROLLING_LOG, new_cycle_log) \ -ENTRYSTRING_(BOX64_LD_LIBRARY_PATH, ld_library_path) \ -ENTRYSTRING_(BOX64_PATH, box64_path) \ -ENTRYSTRING_(BOX64_TRACE_FILE, trace_file) \ -ENTRYADDR(BOX64_LOAD_ADDR, box64_load_addr) \ -ENTRYINT(BOX64_LOG, box64_log, 0, 3, 2) \ -ENTRYBOOL(BOX64_DUMP, box64_dump) \ -ENTRYBOOL(BOX64_DLSYM_ERROR, dlsym_error) \ -CENTRYBOOL(BOX64_NOSIGSEGV, no_sigsegv) \ -CENTRYBOOL(BOX64_NOSIGILL, no_sigill) \ -ENTRYBOOL(BOX64_SHOWSEGV, box64_showsegv) \ -ENTRYBOOL(BOX64_SHOWBT, box64_showbt) \ -ENTRYBOOL(BOX64_MMAP32, box64_mmap32) \ -ENTRYBOOL(BOX64_IGNOREINT3, box64_ignoreint3) \ -IGNORE(BOX64_RDTSC) \ -ENTRYBOOL(BOX64_X11THREADS, box64_x11threads) \ -ENTRYBOOL(BOX64_X11GLX, box64_x11glx) \ -ENTRYDSTRING(BOX64_LIBGL, box64_libGL) \ -ENTRYBOOL(BOX64_SSE_FLUSHTO0, box64_sse_flushto0) \ -ENTRYBOOL(BOX64_X87_NO80BITS, box64_x87_no80bits) \ -ENTRYBOOL(BOX64_SYNC_ROUNDING, box64_sync_rounding) \ -ENTRYSTRING_(BOX64_EMULATED_LIBS, emulated_libs) \ -ENTRYBOOL(BOX64_ALLOWMISSINGLIBS, allow_missing_libs) \ -ENTRYBOOL(BOX64_PREFER_WRAPPED, box64_prefer_wrapped) \ -ENTRYBOOL(BOX64_PREFER_EMULATED, box64_prefer_emulated) \ -ENTRYBOOL(BOX64_WRAP_EGl, box64_wrap_egl) \ -ENTRYBOOL(BOX64_CRASHHANDLER, box64_dummy_crashhandler) \ -ENTRYBOOL(BOX64_NOPULSE, box64_nopulse) \ -ENTRYBOOL(BOX64_NOGTK, box64_nogtk) \ -ENTRYBOOL(BOX64_NOVULKAN, box64_novulkan) \ -ENTRYBOOL(BOX64_RDTSC_1GHZ, box64_rdtsc_1ghz) \ -ENTRYBOOL(BOX64_SHAEXT, box64_shaext) \ -ENTRYBOOL(BOX64_SSE42, box64_sse42) \ -ENTRYINT(BOX64_AVX, new_avx, 0, 2, 2) \ -ENTRYBOOL(BOX64_FUTEX_WAITV, box64_futex_waitv) \ -ENTRYSTRING_(BOX64_BASH, bash) \ -ENTRYINT(BOX64_JITGDB, jit_gdb, 0, 3, 2) \ -ENTRYBOOL(BOX64_NOSANDBOX, box64_nosandbox) \ -ENTRYBOOL(BOX64_INPROCESSGPU, box64_inprocessgpu) \ -ENTRYBOOL(BOX64_CEFDISABLEGPU, box64_cefdisablegpu) \ -ENTRYBOOL(BOX64_CEFDISABLEGPUCOMPOSITOR, box64_cefdisablegpucompositor)\ -ENTRYBOOL(BOX64_EXIT, want_exit) \ -ENTRYBOOL(BOX64_LIBCEF, box64_libcef) \ -ENTRYBOOL(BOX64_JVM, box64_jvm) \ -ENTRYBOOL(BOX64_UNITYPLAYER, box64_unityplayer) \ -ENTRYBOOL(BOX64_SDL2_JGUID, box64_sdl2_jguid) \ -ENTRYINT(BOX64_MALLOC_HACK, box64_malloc_hack, 0, 2, 2) \ -ENTRYINTPOS(BOX64_MAXCPU, new_maxcpu) \ -ENTRYSTRING_(BOX64_ADDLIBS, new_addlibs) \ -ENTRYSTRING_(BOX64_ENV, new_env) \ -ENTRYSTRING_(BOX64_ENV1, new_env1) \ -ENTRYSTRING_(BOX64_ENV2, new_env2) \ -ENTRYSTRING_(BOX64_ENV3, new_env3) \ -ENTRYSTRING_(BOX64_ENV4, new_env4) \ -ENTRYSTRING_(BOX64_ARGS, new_args) \ -ENTRYSTRING_(BOX64_INSERT_ARGS, insert_args) \ -ENTRYBOOL(BOX64_RESERVE_HIGH, new_reserve_high) \ -ENTRYINT(BOX64_CPUTYPE, box64_cputype, 0, 1, 1) \ - -#ifdef HAVE_TRACE -#define SUPER2() \ -ENTRYSTRING_(BOX64_TRACE, trace) \ -ENTRYULONG(BOX64_TRACE_START, start_cnt) \ -ENTRYSTRING_(BOX64_TRACE_INIT, trace_init) \ -ENTRYBOOL(BOX64_TRACE_XMM, trace_xmm) \ -ENTRYBOOL(BOX64_TRACE_EMM, trace_emm) \ -ENTRYBOOL(BOX64_TRACE_COLOR, trace_regsdiff) \ - -#else -#define SUPER2() \ -IGNORE(BOX64_TRACE) \ -IGNORE(BOX64_TRACE_START) \ -IGNORE(BOX64_TRACE_INIT) \ -IGNORE(BOX64_TRACE_XMM) \ -IGNORE(BOX64_TRACE_EMM) \ -IGNORE(BOX64_TRACE_COLOR) \ - -#endif - -#ifdef DYNAREC -#define SUPER3() \ -ENTRYBOOL(BOX64_DYNAREC, box64_dynarec) \ -ENTRYINT(BOX64_DYNAREC_DUMP, box64_dynarec_dump, 0, 2, 2) \ -ENTRYINT(BOX64_DYNAREC_LOG, box64_dynarec_log, 0, 3, 2) \ -ENTRYINT(BOX64_DYNAREC_BIGBLOCK, box64_dynarec_bigblock, 0, 3, 2) \ -ENTRYSTRING_(BOX64_DYNAREC_FORWARD, box64_dynarec_forward) \ -ENTRYINT(BOX64_DYNAREC_STRONGMEM, box64_dynarec_strongmem, 0, 3, 2) \ -ENTRYINT(BOX64_DYNAREC_WEAKBARRIER, box64_dynarec_weakbarrier, 0, 2, 2) \ -ENTRYINT(BOX64_DYNAREC_PAUSE, box64_dynarec_pause, 0, 3, 2) \ -ENTRYBOOL(BOX64_DYNAREC_X87DOUBLE, box64_dynarec_x87double) \ -ENTRYBOOL(BOX64_DYNAREC_DIV0, box64_dynarec_div0) \ -ENTRYBOOL(BOX64_DYNAREC_FASTNAN, box64_dynarec_fastnan) \ -ENTRYINT(BOX64_DYNAREC_FASTROUND, box64_dynarec_fastround, 0, 2, 2) \ -ENTRYINT(BOX64_DYNAREC_SAFEFLAGS, box64_dynarec_safeflags, 0, 2, 2) \ -ENTRYBOOL(BOX64_DYNAREC_CALLRET, box64_dynarec_callret) \ -ENTRYBOOL(BOX64_DYNAREC_BLEEDING_EDGE, box64_dynarec_bleeding_edge) \ -ENTRYBOOL(BOX64_DYNAREC_JVM, box64_dynarec_jvm) \ -ENTRYBOOL(BOX64_DYNAREC_TBB, box64_dynarec_tbb) \ -IGNORE(BOX64_DYNAREC_HOTPAGE) \ -IGNORE(BOX64_DYNAREC_FASTPAGE) \ -ENTRYBOOL(BOX64_DYNAREC_ALIGNED_ATOMICS, box64_dynarec_aligned_atomics) \ -ENTRYBOOL(BOX64_DYNAREC_NATIVEFLAGS, box64_dynarec_nativeflags) \ -ENTRYBOOL(BOX64_DYNAREC_WAIT, box64_dynarec_wait) \ -ENTRYSTRING_(BOX64_NODYNAREC, box64_nodynarec) \ -ENTRYSTRING_(BOX64_DYNAREC_TEST, box64_dynarec_test) \ -ENTRYBOOL(BOX64_DYNAREC_MISSING, box64_dynarec_missing) \ -ENTRYBOOL(BOX64_DYNAREC_DF, box64_dynarec_df) \ -ENTRYBOOL(BOX64_DYNAREC_DIRTY, box64_dynarec_dirty) \ - -#else -#define SUPER3() \ -IGNORE(BOX64_DYNAREC) \ -IGNORE(BOX64_DYNAREC_DUMP) \ -IGNORE(BOX64_DYNAREC_LOG) \ -IGNORE(BOX64_DYNAREC_BIGBLOCK) \ -IGNORE(BOX64_DYNAREC_FORWARD) \ -IGNORE(BOX64_DYNAREC_STRONGMEM) \ -IGNORE(BOX64_DYNAREC_WEAKBARRIER) \ -IGNORE(BOX64_DYNAREC_PAUSE) \ -IGNORE(BOX64_DYNAREC_X87DOUBLE) \ -IGNORE(BOX64_DYNAREC_DIV0) \ -IGNORE(BOX64_DYNAREC_FASTNAN) \ -IGNORE(BOX64_DYNAREC_FASTROUND) \ -IGNORE(BOX64_DYNAREC_SAFEFLAGS) \ -IGNORE(BOX64_DYNAREC_CALLRET) \ -IGNORE(BOX64_DYNAREC_BLEEDING_EDGE) \ -IGNORE(BOX64_DYNAREC_JVM) \ -IGNORE(BOX64_DYNAREC_TBB) \ -IGNORE(BOX64_DYNAREC_HOTPAGE) \ -IGNORE(BOX64_DYNAREC_FASTPAGE) \ -IGNORE(BOX64_DYNAREC_ALIGNED_ATOMICS) \ -IGNORE(BOX64_DYNAREC_NATIVEFLAGS) \ -IGNORE(BOX64_DYNAREC_WAIT) \ -IGNORE(BOX64_NODYNAREC) \ -IGNORE(BOX64_DYNAREC_TEST) \ -IGNORE(BOX64_DYNAREC_MISSING) \ -IGNORE(BOX64_DYNAREC_DF) \ -IGNORE(BOX64_DYNAREC_DIRTY) \ - -#endif - -#if defined(HAVE_TRACE) && defined(DYNAREC) -#define SUPER4() \ -ENTRYBOOL(BOX64_DYNAREC_TRACE, box64_dynarec_trace) \ - -#else -#define SUPER4() \ -IGNORE(BOX64_DYNAREC_TRACE) \ - -#endif - -#define SUPER() \ -SUPER1() \ -SUPER2() \ -SUPER3() \ -SUPER4() - -typedef struct my_params_s { -// is present part -#define ENTRYBOOL(NAME, name) uint8_t is_##name##_present:1; -#define CENTRYBOOL(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYINT(NAME, name, minval, maxval, bits) uint8_t is_##name##_present:1; -#define ENTRYINTPOS(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYSTRING(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYSTRING_(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYDSTRING(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYADDR(NAME, name) uint8_t is_##name##_present:1; -#define ENTRYULONG(NAME, name) uint8_t is_##name##_present:1; -#define IGNORE(NAME) -SUPER() -// done -#undef ENTRYBOOL -#undef CENTRYBOOL -#undef ENTRYINT -#undef ENTRYINTPOS -#undef ENTRYSTRING -#undef ENTRYSTRING_ -#undef ENTRYDSTRING -#undef ENTRYADDR -#undef ENTRYULONG -// the actual fields, in two steps to regroup bit fields together -#define ENTRYBOOL(NAME, name) uint8_t name:1; -#define CENTRYBOOL(NAME, name) uint8_t name:1; -#define ENTRYINT(NAME, name, minval, maxval, bits) uint8_t name:bits; -#define ENTRYINTPOS(NAME, name) -#define ENTRYSTRING(NAME, name) -#define ENTRYSTRING_(NAME, name) -#define ENTRYDSTRING(NAME, name) -#define ENTRYADDR(NAME, name) -#define ENTRYULONG(NAME, name) -SUPER() -// done -#undef ENTRYBOOL -#undef CENTRYBOOL -#undef ENTRYINT -#undef ENTRYINTPOS -#undef ENTRYSTRING -#undef ENTRYSTRING_ -#undef ENTRYDSTRING -#undef ENTRYADDR -#undef ENTRYULONG -#define ENTRYBOOL(NAME, name) -#define CENTRYBOOL(NAME, name) -#define ENTRYINT(NAME, name, minval, maxval, bits) -#define ENTRYINTPOS(NAME, name) uint32_t name; -#define ENTRYSTRING(NAME, name) char* name; -#define ENTRYSTRING_(NAME, name) char* name; -#define ENTRYDSTRING(NAME, name) char* name; -#define ENTRYADDR(NAME, name) uintptr_t name; -#define ENTRYULONG(NAME, name) uint64_t name; -SUPER() -// done -#undef ENTRYBOOL -#undef CENTRYBOOL -#undef ENTRYINT -#undef ENTRYINTPOS -#undef ENTRYSTRING -#undef ENTRYSTRING_ -#undef ENTRYDSTRING -#undef ENTRYADDR -#undef ENTRYULONG -} my_params_t; - -KHASH_MAP_INIT_STR(params, my_params_t) - -static kh_params_t *params = NULL; -static kh_params_t *params_gen = NULL; - -static void clearParam(my_params_t* param) -{ - #define ENTRYBOOL(NAME, name) - #define CENTRYBOOL(NAME, name) - #define ENTRYINT(NAME, name, minval, maxval, bits) - #define ENTRYINTPOS(NAME, name) - #define ENTRYSTRING(NAME, name) box_free(param->name); - #define ENTRYSTRING_(NAME, name) box_free(param->name); - #define ENTRYDSTRING(NAME, name) box_free(param->name); - #define ENTRYADDR(NAME, name) - #define ENTRYULONG(NAME, name) - SUPER() - #undef ENTRYBOOL - #undef CENTRYBOOL - #undef ENTRYINT - #undef ENTRYINTPOS - #undef ENTRYSTRING - #undef ENTRYSTRING_ - #undef ENTRYDSTRING - #undef ENTRYADDR - #undef ENTRYULONG -} - -static void addParam(const char* name, my_params_t* param, int gen) -{ - khint_t k; - kh_params_t* khp = gen?params_gen:params; - k = kh_get(params, khp, name); - if(k==kh_end(khp)) { - int ret; - k = kh_put(params, khp, box_strdup(name), &ret); - } else { - clearParam(&kh_value(khp, k)); - } - my_params_t *p = &kh_value(khp, k); - memcpy(p, param, sizeof(my_params_t)); -} - -static void trimString(char* s) -{ - if(!s) - return; - // trim right space/tab - size_t len = strlen(s); - while(len && (s[len-1]==' ' || s[len-1]=='\t' || s[len-1]=='\n')) - s[--len] = '\0'; - // trim left space/tab - while(s[0]==' ' || s[0]=='\t') - memmove(s, s+1, strlen(s)); -} - -#ifdef ANDROID -static int shm_open(const char *name, int oflag, mode_t mode) { - return -1; -} -static int shm_unlink(const char *name) { - return -1; -} -#endif - -void LoadRCFile(const char* filename) -{ - FILE *f = NULL; - if(filename) - f = fopen(filename, "r"); - else { - #define TMP_MEMRCFILE "/box64_rcfile" - int tmp = shm_open(TMP_MEMRCFILE, O_RDWR | O_CREAT, S_IRWXU); - if(tmp<0) return; // error, bye bye - shm_unlink(TMP_MEMRCFILE); // remove the shm file, but it will still exist because it's currently in use - int dummy = write(tmp, default_rcfile, sizeof(default_rcfile)); - (void)dummy; - lseek(tmp, 0, SEEK_SET); - f = fdopen(tmp, "r"); - } - if(!f) { - printf_log(LOG_INFO, "Cannot open RC file %s\n", filename); - return; - } - // init the hash table if needed - if(!params) - params = kh_init(params); - if(!params_gen) - params_gen = kh_init(params); - // prepare to parse the file - char* line = NULL; - size_t lsize = 0; - my_params_t current_param = {0}; - char* current_name = NULL; - int dummy; - size_t len; - char* p; - int decor = 1; - // parsing - while ((dummy = getline(&line, &lsize, f)) != -1) { - // remove comments - if((p=strchr(line, '#'))) - *p = '\0'; - trimString(line); - len = strlen(line); - // check the line content - if(line[0]=='[' && strchr(line, ']')) { - // new entry, will need to add current one - if(current_name) - addParam(current_name, ¤t_param, (decor==2)); - if(line[1]=='*' && line[(intptr_t)(strchr(line, ']')-line)-1]=='*') - decor = 2; - else - decor = 1; - // prepare a new entry - memset(¤t_param, 0, sizeof(current_param)); - box_free(current_name); - current_name = LowerCase(line+decor); - *(strchr(current_name, ']')+1-decor) = '\0'; - trimString(current_name); - } else if(strchr(line, '=')) { - // actual parameters - //get the key and val - char* key = line; - char* val = strchr(key, '=')+1; - *strchr(key, '=') = '\0'; - trimString(key); - trimString(val); - // extract, check and set arg - #define ENTRYINT(NAME, name, minval, maxval, bits) \ - else if(!strcmp(key, #NAME)) { \ - int v = strtol(val, &p, 0); \ - if(p!=val && v>=minval && v<=maxval) { \ - current_param.is_##name##_present = 1; \ - current_param.name = v; \ - } \ - } - #define ENTRYBOOL(NAME, name) ENTRYINT(NAME, name, 0, 1, 1) - #define CENTRYBOOL(NAME, name) ENTRYBOOL(NAME, name) - #define ENTRYINTPOS(NAME, name) \ - else if(!strcmp(key, #NAME)) { \ - int v = strtol(val, &p, 0); \ - if(p!=val) { \ - current_param.is_##name##_present = 1; \ - current_param.name = v; \ - } \ - } - #define ENTRYSTRING(NAME, name) \ - else if(!strcmp(key, #NAME)) { \ - current_param.is_##name##_present = 1; \ - if(current_param.name) box_free(current_param.name);\ - current_param.name = box_strdup(val); \ - } - #define ENTRYSTRING_(NAME, name) ENTRYSTRING(NAME, name) - #define ENTRYDSTRING(NAME, name) ENTRYSTRING(NAME, name) - #define ENTRYADDR(NAME, name) \ - else if(!strcmp(key, #NAME)) { \ - uintptr_t v = strtoul(val, &p, 0); \ - if(p!=val) { \ - current_param.is_##name##_present = 1; \ - current_param.name = v; \ - } \ - } - #define ENTRYULONG(NAME, name) \ - else if(!strcmp(key, #NAME)) { \ - uint64_t v = strtoull(val, &p, 0); \ - if(p!=val) { \ - current_param.is_##name##_present = 1; \ - current_param.name = v; \ - } \ - } - #undef IGNORE - #define IGNORE(NAME) else if(!strcmp(key, #NAME)) ; - if(0) ; - SUPER() - else if(len && current_name) { - printf_log(LOG_INFO, "Warning, unsupported %s=%s for [%s] in %s\n", key, val, current_name, filename); - } - #undef ENTRYBOOL - #undef CENTRYBOOL - #undef ENTRYINT - #undef ENTRYINTPOS - #undef ENTRYSTRING - #undef ENTRYSTRING_ - #undef ENTRYDSTRING - #undef ENTRYADDR - #undef ENTRYULONG - #undef IGNORE - #define IGNORE(NAME) - } - } - // last entry to be pushed too - if(current_name) { - addParam(current_name, ¤t_param, (decor==2)); - box_free(current_name); - } - box_free(line); - fclose(f); - printf_log(LOG_INFO, "Params database has %d entries\n", kh_size(params)); -} - -void DeleteParams() -{ - if(!params) - return; - - // free strings - my_params_t* p; - // need to free duplicated strings - kh_foreach_value_ref(params, p, clearParam(p)); - const char* key; - kh_foreach_key(params, key, box_free((void*)key)); - // free the hash itself - kh_destroy(params, params); - params = NULL; -} - -extern int ftrace_has_pid; -extern FILE* ftrace; -extern char* ftrace_name; -extern char* box64_new_args; -extern char* box64_insert_args; -void openFTrace(const char* newtrace, int reopen); -void addNewEnvVar(const char* s); -void AddNewLibs(const char* libs); -void computeRDTSC(); -void my_reserveHighMem(); -#ifdef DYNAREC -void GatherDynarecExtensions(); -#endif -#ifdef HAVE_TRACE -void setupTraceInit(); -void setupTrace(); -#endif -static char old_name[256] = ""; -const char* GetLastApplyName() -{ - return old_name; -} -void internal_ApplyParams(const char* name, const my_params_t* param); -void ApplyParams(const char* name) -{ - if(!name || !params) - return; - if(!strcasecmp(name, old_name)) { - return; - } - strncpy(old_name, name, 255); - khint_t k1; - { - char* lname = LowerCase(name); - k1 = kh_get(params, params, lname); - my_params_t* param; - const char* k2; - kh_foreach_ref(params_gen, k2, param, - if(strstr(lname, k2)) - internal_ApplyParams(name, param); - ) - box_free(lname); - } - if(k1 == kh_end(params)) - return; - my_params_t* param = &kh_value(params, k1); - internal_ApplyParams(name, param); -} - -void internal_ApplyParams(const char* name, const my_params_t* param) { - int new_cycle_log = cycle_log; - int new_maxcpu = box64_maxcpu; - int new_avx = box64_avx2?2:box64_avx; - int box64_dynarec_jvm = box64_jvm; - int new_reserve_high = 0; - int want_exit = 0; - #ifdef DYNAREC - int olddynarec = box64_dynarec; - #endif - printf_log(LOG_INFO, "Apply RC params for %s\n", name); - #define ENTRYINT(NAME, name, minval, maxval, bits) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%d\n", #NAME, param->name); name = param->name;} - #define ENTRYBOOL(NAME, name) ENTRYINT(NAME, name, 0, 1, 1) - #define CENTRYBOOL(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%d\n", #NAME, param->name); my_context->name = param->name;} - #define ENTRYINTPOS(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%d\n", #NAME, param->name); name = param->name;} - #define ENTRYSTRING(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%s\n", #NAME, param->name); name = param->name;} - #define ENTRYSTRING_(NAME, name) - #define ENTRYDSTRING(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%s\n", #NAME, param->name); if(name) box_free(name); name = box_strdup(param->name);} - #define ENTRYADDR(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%zd\n", #NAME, param->name); name = param->name;} - #define ENTRYULONG(NAME, name) if(param->is_##name##_present) {printf_log(LOG_INFO, "Applying %s=%lld\n", #NAME, param->name); name = param->name;} - SUPER() - #undef ENTRYBOOL - #undef CENTRYBOOL - #undef ENTRYINT - #undef ENTRYINTPOS - #undef ENTRYSTRING - #undef ENTRYSTRING_ - #undef ENTRYDSTRING - #undef ENTRYADDR - #undef ENTRYULONG - // now handle the manuel entry (the one with ending underscore) - if(want_exit) - exit(0); - if(new_cycle_log==1) - new_cycle_log = 16; - if(new_cycle_log!=cycle_log) { - freeCycleLog(my_context); - cycle_log = new_cycle_log; - initCycleLog(my_context); - } - if(new_reserve_high) - my_reserveHighMem(); - if(param->is_new_avx_present) { - if(!new_avx) { - printf_log(LOG_INFO, "Hiding AVX extension\n"); - box64_avx = 0; box64_avx2 = 0; - } else if(new_avx==1) { - printf_log(LOG_INFO, "Exposing AVX extension\n"); - box64_avx = 1; box64_avx2 = 0; - } else if(new_avx==2) { - printf_log(LOG_INFO, "Exposing AVX/AVX2 extensions\n"); - box64_avx = 1; box64_avx2 = 1; - } - } - if(param->is_box64_rdtsc_1ghz_present) - computeRDTSC(); - #ifdef DYNAREC - if(param->is_box64_dynarec_jvm_present && !param->is_box64_jvm_present) - box64_jvm = box64_dynarec_jvm; - #endif - if(!box64_maxcpu_immutable) { - if(new_maxcpu!=box64_maxcpu && box64_maxcpu && box64_maxcpu<new_maxcpu) { - printf_log(LOG_INFO, "Not applying BOX64_MAXCPU=%d because a lesser value is already active: %d\n", new_maxcpu, box64_maxcpu); - } else - box64_maxcpu = new_maxcpu; - } else if(new_maxcpu!=box64_maxcpu) - printf_log(LOG_INFO, "Not applying BOX64_MAXCPU=%d because it's too late\n", new_maxcpu); - if(param->is_ld_library_path_present) AppendList(&my_context->box64_ld_lib, param->ld_library_path, 1); - if(param->is_box64_path_present) AppendList(&my_context->box64_path, param->box64_path, 1); - if(param->is_trace_file_present) { - // open a new ftrace... - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_TRACE_FILE", param->trace_file); - if(ftrace_name) { - fclose(ftrace); - } - openFTrace(param->trace_file, 0); - } - if(param->is_emulated_libs_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_EMULATED_LIBS", param->emulated_libs); - AppendList(&my_context->box64_emulated_libs, param->emulated_libs, 0); - } - if(param->is_new_addlibs_present) { - AddNewLibs(param->new_addlibs); - } - if(param->is_new_env_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_ENV", param->new_env); - addNewEnvVar(param->new_env); - } - if(param->is_new_env1_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_ENV1", param->new_env1); - addNewEnvVar(param->new_env1); - } - if(param->is_new_env2_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_ENV2", param->new_env2); - addNewEnvVar(param->new_env2); - } - if(param->is_new_env3_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_ENV3", param->new_env3); - addNewEnvVar(param->new_env3); - } - if(param->is_new_env4_present) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_ENV4", param->new_env4); - addNewEnvVar(param->new_env4); - } - if(param->is_new_args_present) { - printf_log(LOG_INFO, "Adding \"%s\" arguments to command line\n", param->new_args); - if(box64_new_args) - box_free(box64_new_args); - box64_new_args = box_strdup(param->new_args); - } - if(param->is_insert_args_present) { - printf_log(LOG_INFO, "Adding \"%s\" arguments to command line\n", param->insert_args); - if(box64_insert_args) - box_free(box64_insert_args); - box64_insert_args = box_strdup(param->insert_args); - } - if(param->is_bash_present && FileIsX64ELF(param->bash)) { - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_BASH", param->bash); - if(my_context->bashpath) - box_free(my_context->bashpath); - my_context->bashpath = box_strdup(param->bash); - } - #ifdef HAVE_TRACE - int old_x64trace = my_context->x64trace; - if(param->is_trace_present) { - char*p = param->trace; - if (strcmp(p, "0")) { - my_context->x64trace = 1; - box64_trace = p; - } - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_TRACE", param->trace); - } - if(param->is_trace_init_present) { - char* p = param->trace_init; - if (strcmp(p, "0")) { - my_context->x64trace = 1; - trace_init = p; - } - printf_log(LOG_INFO, "Applying %s=%s\n", "BOX64_TRACE_INIT", param->trace_init); - } - if(my_context->x64trace && !old_x64trace) { - printf_log(LOG_INFO, "Initializing Zydis lib\n"); - if(InitX64Trace(my_context)) { - printf_log(LOG_INFO, "Zydis init failed, no x86 trace activated\n"); - my_context->x64trace = 0; - } - } - if(param->is_trace_init_present) - setupTraceInit(); - if(param->is_trace_present) - setupTrace(); - #endif - #ifdef DYNAREC - if(param->is_box64_nodynarec_present) { - uintptr_t no_start = 0, no_end = 0; - int ok = 0; - if(sscanf(param->box64_nodynarec, "0x%lX-0x%lX", &no_start, &no_end)==2) - ok = 1; - if(!ok && sscanf(param->box64_nodynarec, "%lx-%lx", &no_start, &no_end)==2) - ok = 1; - if(!ok && sscanf(param->box64_nodynarec, "%ld-%ld", &no_start, &no_end)==2) - ok = 1; - if(ok && no_end>no_start) { - box64_nodynarec_start = no_start; - box64_nodynarec_end = no_end; - printf_log(LOG_INFO, "Appling BOX64_NODYNAREC=%p-%p\n", (void*)box64_nodynarec_start, (void*)box64_nodynarec_end); - } else { - printf_log(LOG_INFO, "Ignoring BOX64_NODYNAREC=%s (%p-%p)\n", param->box64_nodynarec, (void*)box64_nodynarec_start, (void*)box64_nodynarec_end); - } - } - if(param->is_box64_dynarec_test_present) { - uintptr_t no_start = 0, no_end = 0; - if(strlen(param->box64_dynarec_test)==1) { - box64_dynarec_test = param->box64_dynarec_test[0]-'0'; - box64_dynarec_test_start = 0x0; - box64_dynarec_test_end = 0x0; - if(box64_dynarec_test>2) box64_dynarec_test = 0; - printf_log(LOG_INFO, "Appling BOX64_DYNAREC_TEST=%d\n", box64_dynarec_test); - } else { - int ok = 0; - if(sscanf(param->box64_dynarec_test, "0x%lX-0x%lX", &no_start, &no_end)==2) - ok = 1; - if(!ok && sscanf(param->box64_dynarec_test, "%lx-%lx", &no_start, &no_end)==2) - ok = 1; - if(!ok && sscanf(param->box64_dynarec_test, "%ld-%ld", &no_start, &no_end)==2) - ok = 1; - if(ok && no_end>no_start) { - box64_dynarec_test = 1; - box64_dynarec_test_start = no_start; - box64_dynarec_test_end = no_end; - printf_log(LOG_INFO, "Appling BOX64_DYNAREC_TEST=%p-%p\n", (void*)box64_dynarec_test_start, (void*)box64_dynarec_test_end); - } else { - box64_dynarec_test = 0; - printf_log(LOG_INFO, "Ignoring BOX64_DYNAREC_TEST=%s (%p-%p)\n", param->box64_dynarec_test, (void*)box64_dynarec_test_start, (void*)box64_dynarec_test_end); - } - } - } - if(param->is_box64_dynarec_forward_present) { - int forward = 0; - if(sscanf(param->box64_dynarec_forward, "%d", &forward)==1) { - printf_log(LOG_INFO, "Appling BOX64_DYNAREC_FORWARD=%d\n", box64_dynarec_forward); - box64_dynarec_forward = forward; - } - } - if(!olddynarec && box64_dynarec) - GatherDynarecExtensions(); - if(param->is_box64_dynarec_test_present && box64_dynarec_test) { - box64_dynarec_fastnan = 0; - box64_dynarec_fastround = 0; - box64_dynarec_x87double = 1; - box64_dynarec_div0 = 1; - box64_dynarec_callret = 0; - #if defined(RV64) || defined(LA64) - box64_dynarec_nativeflags = 0; - #endif - } - #endif - if(box64_log==3) { - box64_log = 2; - box64_dump = 1; - } -} |