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/libtools | |
| 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/libtools')
| -rw-r--r-- | src/libtools/signal32.c | 8 | ||||
| -rw-r--r-- | src/libtools/signals.c | 70 | ||||
| -rw-r--r-- | src/libtools/threads.c | 4 | ||||
| -rwxr-xr-x | src/libtools/threads32.c | 4 |
4 files changed, 41 insertions, 45 deletions
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index c2d37b3e..bebb4f2e 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -359,7 +359,7 @@ uint32_t RunFunctionHandler32(int* exit, int dynarec, i386_ucontext_t* sigcontex x64emu_t *emu = thread_get_emu(); #ifdef DYNAREC - if(box64_dynarec_test) + if (BOX64ENV(dynarec_test)) emu->test.test = 0; #endif @@ -405,11 +405,11 @@ uint32_t RunFunctionHandler32(int* exit, int dynarec, i386_ucontext_t* sigcontex emu->flags.quitonlongjmp = oldquitonlongjmp; #ifdef DYNAREC - if(box64_dynarec_test) { + if (BOX64ENV(dynarec_test)) { emu->test.test = 0; emu->test.clean = 0; } - #endif +#endif if(emu->flags.longjmp) { // longjmp inside signal handler, lets grab all relevent value and do the actual longjmp in the signal handler @@ -471,7 +471,7 @@ int write_opcode(uintptr_t rip, uintptr_t native_ip, int is32bits); void my_sigactionhandler_oldcode_32(x64emu_t* emu, int32_t sig, int simple, siginfo_t* info, void * ucntx, int* old_code, void* cur_db) { int Locks = unlockMutex(); - int log_minimum = (box64_showsegv)?LOG_NONE:((sig==SIGSEGV && my_context->is_sigaction[sig])?LOG_DEBUG:LOG_INFO); + int log_minimum = (BOX64ENV(showsegv))?LOG_NONE:((sig==SIGSEGV && my_context->is_sigaction[sig])?LOG_DEBUG:LOG_INFO); printf_log(LOG_DEBUG, "Sigactionhanlder32 for signal #%d called (jump to %p/%s)\n", sig, (void*)my_context->signals[sig], GetNativeName((void*)my_context->signals[sig])); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index c1c45ba4..819d89d7 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -323,7 +323,7 @@ uint64_t RunFunctionHandler(x64emu_t* emu, int* exit, int dynarec, x64_ucontext_ if(!emu) emu = thread_get_emu(); #ifdef DYNAREC - if(box64_dynarec_test) + if (BOX64ENV(dynarec_test)) emu->test.test = 0; #endif @@ -374,11 +374,11 @@ uint64_t RunFunctionHandler(x64emu_t* emu, int* exit, int dynarec, x64_ucontext_ emu->flags.quitonlongjmp = oldquitonlongjmp; #ifdef DYNAREC - if(box64_dynarec_test) { + if (BOX64ENV(dynarec_test)) { emu->test.test = 0; emu->test.clean = 0; } - #endif +#endif if(emu->flags.longjmp) { // longjmp inside signal handler, lets grab all relevent value and do the actual longjmp in the signal handler @@ -688,7 +688,7 @@ int mark_db_unaligned(dynablock_t* db, uintptr_t x64pc) add_unaligned_address(x64pc); db->hash++; // dirty the block MarkDynablock(db); // and mark it -if(box64_showsegv) printf_log(LOG_INFO, "Marked db %p as dirty, and address %p as needing unaligned handling\n", db, (void*)x64pc); +if(BOX64ENV(showsegv)) printf_log(LOG_INFO, "Marked db %p as dirty, and address %p as needing unaligned handling\n", db, (void*)x64pc); return 2; // marked, exit handling... } #endif @@ -1029,7 +1029,7 @@ void my_sigactionhandler_oldcode_32(x64emu_t* emu, int32_t sig, int simple, sigi void my_sigactionhandler_oldcode_64(x64emu_t* emu, int32_t sig, int simple, siginfo_t* info, void * ucntx, int* old_code, void* cur_db) { int Locks = unlockMutex(); - int log_minimum = (box64_showsegv)?LOG_NONE:LOG_DEBUG; + int log_minimum = (BOX64ENV(showsegv))?LOG_NONE:LOG_DEBUG; printf_log(LOG_DEBUG, "Sigactionhanlder for signal #%d called (jump to %p/%s)\n", sig, (void*)my_context->signals[sig], GetNativeName((void*)my_context->signals[sig])); @@ -1494,7 +1494,7 @@ extern int box64_exit_code; void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) { // sig==SIGSEGV || sig==SIGBUS || sig==SIGILL || sig==SIGABRT here! - int log_minimum = (box64_showsegv)?LOG_NONE:((sig==SIGSEGV && my_context->is_sigaction[sig])?LOG_DEBUG:LOG_INFO); + int log_minimum = (BOX64ENV(showsegv))?LOG_NONE:((sig==SIGSEGV && my_context->is_sigaction[sig])?LOG_DEBUG:LOG_INFO); if(signal_jmpbuf_active) { signal_jmpbuf_active = 0; longjmp(SIG_JMPBUF, 1); @@ -1549,7 +1549,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) int fixed = 0; if((fixed=sigbus_specialcases(info, ucntx, pc, fpsimd, db, x64pc))) { // special case fixed, restore everything and just continues - if(box64_log>=LOG_DEBUG || box64_showsegv) { + if (BOX64ENV(log)>=LOG_DEBUG || BOX64ENV(showsegv)) { static void* old_pc[2] = {0}; static int old_pc_i = 0; if(old_pc[0]!=pc && old_pc[1]!=pc) { @@ -1587,7 +1587,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) int fixed = 0; if((fixed = sigbus_specialcases(info, ucntx, pc, fpsimd, db, x64pc))) { // special case fixed, restore everything and just continues - if(box64_log >= LOG_DEBUG || box64_showsegv) { + if (BOX64ENV(log) >= LOG_DEBUG || BOX64ENV(showsegv)) { static void* old_pc[2] = {0}; static int old_pc_i = 0; if(old_pc[0]!=pc && old_pc[1]!=pc) { @@ -1623,7 +1623,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) unprotectDB((uintptr_t)addr, 1, 1); // unprotect 1 byte... But then, the whole page will be unprotected if(db) CheckHotPage((uintptr_t)addr); int db_need_test = db?getNeedTest((uintptr_t)db->x64_addr):0; - if(db && ((addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) || (db_need_test && !box64_dynarec_dirty))) { + if(db && ((addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) || (db_need_test && !BOX64ENV(dynarec_dirty)))) { emu = getEmuSignal(emu, p, db); // dynablock got auto-dirty! need to get out of it!!! if(emu->jmpbuf) { @@ -1666,7 +1666,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) dynarec_log(LOG_INFO, "Warning, addr inside current dynablock!\n"); } // mark stuff as unclean - if(box64_dynarec) + if(BOX64ENV(dynarec)) cleanDBFromAddressRange(((uintptr_t)addr)&~(box64_pagesize-1), box64_pagesize, 0); static void* glitch_pc = NULL; static void* glitch_addr = NULL; @@ -1790,19 +1790,19 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % old_prot = prot; const char* name = NULL; const char* x64name = NULL; - if(log_minimum<=box64_log) { - signal_jmpbuf_active = 1; - if(sigsetjmp(SIG_JMPBUF, 1)) { - // segfault while gathering function name... - name = "???"; - } else - name = GetNativeName(pc); - signal_jmpbuf_active = 0; + if (log_minimum<=BOX64ENV(log)) { + signal_jmpbuf_active = 1; + if(sigsetjmp(SIG_JMPBUF, 1)) { + // segfault while gathering function name... + name = "???"; + } else + name = GetNativeName(pc); + signal_jmpbuf_active = 0; } // Adjust RIP for special case of NULL function run if(sig==SIGSEGV && R_RIP==0x1 && (uintptr_t)info->si_addr==0x0) R_RIP = 0x0; - if(log_minimum<=box64_log) { + if(log_minimum<=BOX64ENV(log)) { elfheader_t* elf = FindElfAddress(my_context, x64pc); if(elf) { signal_jmpbuf_active = 1; @@ -1814,7 +1814,7 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % signal_jmpbuf_active = 0; } } - if(jit_gdb) { + if(BOX64ENV(jitgdb)) { pid_t pid = getpid(); int v = vfork(); // is this ok in a signal handler??? if(v<0) { @@ -1822,7 +1822,7 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % } else if(v) { // parent process, the one that have the segfault volatile int waiting = 1; - printf("Waiting for %s (pid %d)...\n", (jit_gdb==2)?"gdbserver":"gdb", pid); + printf("Waiting for %s (pid %d)...\n", (BOX64ENV(jitgdb)==2)?"gdbserver":"gdb", pid); while(waiting) { // using gdb, use "set waiting=0" to stop waiting... usleep(1000); @@ -1830,18 +1830,18 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % } else { char myarg[50] = {0}; sprintf(myarg, "%d", pid); - if(jit_gdb==2) + if(BOX64ENV(jitgdb)==2) execlp("gdbserver", "gdbserver", "127.0.0.1:1234", "--attach", myarg, (char*)NULL); - else if(jit_gdb==3) + else if(BOX64ENV(jitgdb)==3) execlp("lldb", "lldb", "-p", myarg, (char*)NULL); else execlp("gdb", "gdb", "-pid", myarg, (char*)NULL); exit(-1); } } - print_cycle_log(log_minimum); + print_rolling_log(log_minimum); - if((box64_showbt || sig==SIGABRT) && log_minimum<=box64_log) { + if((BOX64ENV(showbt) || sig==SIGABRT) && log_minimum<=BOX64ENV(log)) { // show native bt #define BT_BUF_SIZE 100 int nptrs; @@ -1913,7 +1913,7 @@ dynarec_log(/*LOG_DEBUG*/LOG_INFO, "%04d|Repeated SIGSEGV with Access error on % #undef GO } - if(log_minimum<=box64_log) { + if(log_minimum<=BOX64ENV(log)) { static const char* reg_name[] = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", " R8", " R9","R10","R11", "R12","R13","R14","R15"}; static const char* seg_name[] = {"ES", "CS", "SS", "DS", "FS", "GS"}; int shown_regs = 0; @@ -2031,14 +2031,10 @@ void my_sigactionhandler(int32_t sig, siginfo_t* info, void * ucntx) uintptr_t x64pc = R_RIP; if(db) x64pc = getX64Address(db, (uintptr_t)pc); - if(box64_showsegv) printf_log(LOG_INFO, "sigaction handler for sig %d, pc=%p, x64pc=%p, db=%p\n", sig, pc, x64pc, db); + if(BOX64ENV(showsegv)) printf_log(LOG_INFO, "sigaction handler for sig %d, pc=%p, x64pc=%p, db=%p\n", sig, pc, x64pc, db); my_sigactionhandler_oldcode(emu, sig, 0, info, ucntx, NULL, db, x64pc); } -#ifndef DYNAREC -#define box64_dynarec_dump 0 -#endif - void emit_signal(x64emu_t* emu, int sig, void* addr, int code) { siginfo_t info = {0}; @@ -2055,15 +2051,15 @@ void emit_signal(x64emu_t* emu, int sig, void* addr, int code) info.si_addr = addr; const char* x64name = NULL; const char* elfname = NULL; - if(box64_log>LOG_INFO || box64_dynarec_dump || box64_showsegv) { + if(BOX64ENV(log)>LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(showsegv)) { x64name = getAddrFunctionName(R_RIP); elfheader_t* elf = FindElfAddress(my_context, R_RIP); if(elf) elfname = ElfName(elf); printf_log(LOG_NONE, "Emit Signal %d at IP=%p(%s / %s) / addr=%p, code=0x%x\n", sig, (void*)R_RIP, x64name?x64name:"???", elfname?elfname:"?", addr, code); -print_cycle_log(LOG_INFO); + print_rolling_log(LOG_INFO); - if((box64_showbt || sig==SIGABRT) && box64_log>=LOG_INFO) { + if((BOX64ENV(showbt) || sig==SIGABRT) && BOX64ENV(log)>=LOG_INFO) { // show native bt #define BT_BUF_SIZE 100 int nptrs; @@ -2132,7 +2128,7 @@ void emit_interruption(x64emu_t* emu, int num, void* addr) info.si_addr = NULL;//addr; const char* x64name = NULL; const char* elfname = NULL; - if(box64_log>LOG_INFO || box64_dynarec_dump || box64_showsegv) { + if(BOX64ENV(log)>LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(showsegv)) { x64name = getAddrFunctionName(R_RIP); elfheader_t* elf = FindElfAddress(my_context, R_RIP); if(elf) @@ -2151,7 +2147,7 @@ void emit_div0(x64emu_t* emu, void* addr, int code) info.si_addr = addr; const char* x64name = NULL; const char* elfname = NULL; - if(box64_log>LOG_INFO || box64_dynarec_dump || box64_showsegv) { + if(BOX64ENV(log)>LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(showsegv)) { x64name = getAddrFunctionName(R_RIP); elfheader_t* elf = FindElfAddress(my_context, R_RIP); if(elf) @@ -2503,7 +2499,7 @@ EXPORT void my_makecontext(x64emu_t* emu, void* ucp, void* fnc, int32_t argc, in } void box64_abort() { - if(box64_showbt && LOG_INFO<=box64_log) { + if(BOX64ENV(showbt) && LOG_INFO<=BOX64ENV(log)) { // show native bt #define BT_BUF_SIZE 100 int nptrs; diff --git a/src/libtools/threads.c b/src/libtools/threads.c index a630a7c0..046365d2 100644 --- a/src/libtools/threads.c +++ b/src/libtools/threads.c @@ -535,7 +535,7 @@ EXPORT int my_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_rou et->fnc = (uintptr_t)start_routine; et->arg = arg; #ifdef DYNAREC - if(box64_dynarec) { + if(BOX64ENV(dynarec)) { // pre-creation of the JIT code for the entry point of the thread DBGetBlock(emu, (uintptr_t)start_routine, 1, 0); // function wrapping are 64bits only on box64 } @@ -561,7 +561,7 @@ void* my_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** pet et->fnc = (uintptr_t)f; et->arg = arg; #ifdef DYNAREC - if(box64_dynarec) { + if(BOX64ENV(dynarec)) { // pre-creation of the JIT code for the entry point of the thread DBGetBlock(emu, (uintptr_t)f, 1, 0); // function wrapping are 64bits only on box64 } diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c index 32e81799..ac75e4c3 100755 --- a/src/libtools/threads32.c +++ b/src/libtools/threads32.c @@ -229,7 +229,7 @@ EXPORT int my32_pthread_create(x64emu_t *emu, void* t, void* attr, void* start_r et->join = 0; } #ifdef DYNAREC - if(box64_dynarec) { + if(BOX64ENV(dynarec)) { // pre-creation of the JIT code for the entry point of the thread DBGetBlock(emu, (uintptr_t)start_routine, 1, 1); } @@ -261,7 +261,7 @@ void* my32_prepare_thread(x64emu_t *emu, void* f, void* arg, int ssize, void** p et->fnc = (uintptr_t)f; et->arg = arg; #ifdef DYNAREC - if(box64_dynarec) { + if(BOX64ENV(dynarec)) { // pre-creation of the JIT code for the entry point of the thread dynablock_t *current = NULL; DBGetBlock(emu, (uintptr_t)f, 1, 1); |