about summary refs log tree commit diff stats
path: root/src/libtools
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/libtools
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/libtools')
-rw-r--r--src/libtools/signal32.c8
-rw-r--r--src/libtools/signals.c70
-rw-r--r--src/libtools/threads.c4
-rwxr-xr-xsrc/libtools/threads32.c4
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);