about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorrajdakin <rajdakin@gmail.com>2021-04-07 17:09:37 +0200
committerrajdakin <rajdakin@gmail.com>2021-04-07 17:09:37 +0200
commit79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398 (patch)
tree6e6bd1ec24c472810b2c789d0603a96321624d73
parent7e09961ee7ac6841883b68123ad700609d2fd955 (diff)
downloadbox64-79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398.tar.gz
box64-79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398.zip
[TRACE] Added a new trace option
-rwxr-xr-xUSAGE.md10
-rwxr-xr-xsrc/emu/x64emu.c21
-rwxr-xr-xsrc/emu/x64emu_private.h3
-rwxr-xr-xsrc/include/debug.h13
-rwxr-xr-xsrc/librarian/library.c4
-rwxr-xr-xsrc/libtools/signals.c8
-rwxr-xr-xsrc/main.c17
7 files changed, 61 insertions, 15 deletions
diff --git a/USAGE.md b/USAGE.md
index 9fccf749..52483d11 100755
--- a/USAGE.md
+++ b/USAGE.md
@@ -53,6 +53,16 @@ Only on builds with trace enabled.
  * 0 : The XMM (i.e. SSE/SSE2) register will not be logged with the general and x86 registers. (Default.)

  * 1 : Dump the XMM registers.

 

+#### BOX64_TRACE_EMM

+Only on builds with trace enabled.

+ * 0 : The EMM (i.e. XMM/x87) register will not be logged with the general and x86 registers. (Default.)

+ * 1 : Dump the EMM registers.

+

+#### BOX64_TRACE_COLOR

+Only on builds with trace enabled.

+ * 0 : The general registers will always be the default white color. (Default.)

+ * 1 : The general registers will change color in the dumps when they changed value.

+

 #### BOX64_LOAD_ADDR

 Try to load at 0xXXXXXX main binary (if binary is a PIE)

  * 0xXXXXXXXX : The load address . (Only active on PIE programs.)

diff --git a/src/emu/x64emu.c b/src/emu/x64emu.c
index ebf378cf..f97f4383 100755
--- a/src/emu/x64emu.c
+++ b/src/emu/x64emu.c
@@ -108,6 +108,7 @@ void SetupX64Emu(x64emu_t *emu)
     printf_log(LOG_DEBUG, "Setup X86_64 Emu\n");
 }
 
+#ifdef HAVE_TRACE
 void SetTraceEmu(uintptr_t start, uintptr_t end)
 {
     if(my_context->zydis) {
@@ -122,6 +123,7 @@ void SetTraceEmu(uintptr_t start, uintptr_t end)
     trace_start = start;
     trace_end = end;
 }
+#endif
 
 void AddCleanup(x64emu_t *emu, void *p)
 {
@@ -335,12 +337,13 @@ void ResetFlags(x64emu_t *emu)
 const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip)
 {
     static char buff[1000];
-    char* regname[] = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", 
+    char* regname[] = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI",
                        " R8", " R9", "R10", "R11", "R12", "R13", "R14", "R15"};
     char tmp[160];
     buff[0] = '\0';
+#ifdef HAVE_TRACE
     if(trace_emm) {
-        // do emm reg is needed
+        // do emm reg if needed
         for(int i=0; i<8; ++i) {
             sprintf(tmp, "mm%d:%016lx", i, emu->mmx87[i].q);
             strcat(buff, tmp);
@@ -348,13 +351,14 @@ const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip)
         }
     }
     if(trace_xmm) {
-        // do xmm reg is needed
+        // do xmm reg if needed
         for(int i=0; i<8; ++i) {
             sprintf(tmp, "%d:%016lx%016lx", i, emu->xmm[i].q[1], emu->xmm[i].q[0]);
             strcat(buff, tmp);
             if ((i&3)==3) strcat(buff, "\n"); else strcat(buff, " ");
         }
     }
+#endif
     // start with FPU regs...
     if(emu->fpu_stack) {
         for (int i=0; i<emu->fpu_stack; i++) {
@@ -368,7 +372,16 @@ const char* DumpCPURegs(x64emu_t* emu, uintptr_t ip)
         strcat(buff, "\n");
     }
     for (int i=_AX; i<=_R15; ++i) {
+#ifdef HAVE_TRACE
+        if (trace_regsdiff && (emu->regs[i].q[0] != emu->oldregs[i].q[0])) {
+            sprintf(tmp, "\e[1;35m%s=%016lx\e[m ", regname[i], emu->regs[i].q[0]);
+            emu->oldregs[i].q[0] = emu->regs[i].q[0];
+        } else {
+            sprintf(tmp, "%s=%016lx ", regname[i], emu->regs[i].q[0]);
+        }
+#else
         sprintf(tmp, "%s=%016lx ", regname[i], emu->regs[i].q[0]);
+#endif
         strcat(buff, tmp);
 
         if (i%5==4) {
@@ -466,4 +479,4 @@ void ResetSegmentsCache(x64emu_t *emu)
     if(!emu)
         return;
     memset(emu->segs_serial, 0, sizeof(emu->segs_serial));
-}
\ No newline at end of file
+}
diff --git a/src/emu/x64emu_private.h b/src/emu/x64emu_private.h
index cf7d459b..70d9576b 100755
--- a/src/emu/x64emu_private.h
+++ b/src/emu/x64emu_private.h
@@ -52,6 +52,7 @@ typedef struct x64emu_s {
     multiuint_t res;
     uint32_t    *x64emu_parity_tab; // helper
     #ifdef HAVE_TRACE
+    reg64_t     oldregs[16];
     uintptr_t   prev2_ip;
     #endif
     // segments
@@ -91,4 +92,4 @@ typedef struct x64emu_s {
 //#define INTR_RAISE_DIV0(emu) {emu->error |= ERR_DIVBY0; emu->quit=1;}
 #define INTR_RAISE_DIV0(emu) {emu->error |= ERR_DIVBY0;} // should rise a SIGFPE and not quit
 
-#endif //__X86EMU_PRIVATE_H_
\ No newline at end of file
+#endif //__X86EMU_PRIVATE_H_
diff --git a/src/include/debug.h b/src/include/debug.h
index 0f2de170..b1ac8146 100755
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -14,16 +14,19 @@ extern int box64_dynarec_forced;
 extern int box64_dynarec_largest;
 extern uintptr_t box64_nodynarec_start, box64_nodynarec_end;
 #endif
-extern int dlsym_error;  // log dlsym error
-extern int trace_xmm;    // include XMM reg in trace?
-extern int trace_emm;    // include EMM reg in trace?
+extern int dlsym_error;    // log dlsym error
+#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;
+#endif
 extern int allow_missing_libs;
 extern int box64_steam;
 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 uintptr_t   trace_start, trace_end;
-extern char* trace_func;
 extern uintptr_t fmod_smc_start, fmod_smc_end; // to handle libfmod (from Unreal) SMC (self modifying code)
 extern uint32_t default_gs;
 extern int jit_gdb; // launch gdb when a segfault is trapped
diff --git a/src/librarian/library.c b/src/librarian/library.c
index bd85b8cf..edde1abb 100755
--- a/src/librarian/library.c
+++ b/src/librarian/library.c
@@ -303,6 +303,7 @@ int FinalizeLibrary(library_t* lib, lib_t* local_maplib, x64emu_t* emu)
             return 1;
         }
         RelocateElfPlt(my_context->maplib, local_maplib, elf_header);
+#ifdef HAVE_TRACE
         if(trace_func) {
             if (GetGlobalSymbolStartEnd(my_context->maplib, trace_func, &trace_start, &trace_end)) {
                 SetTraceEmu(trace_start, trace_end);
@@ -316,6 +317,7 @@ int FinalizeLibrary(library_t* lib, lib_t* local_maplib, x64emu_t* emu)
                 trace_func = NULL;
             }
         }
+#endif
         RunElfInit(elf_header, emu);
     }
     if(box64_dynarec && strcmp(lib->name, "libfmod.so")==0) {
@@ -702,4 +704,4 @@ lib_t* GetMaplib(library_t* lib)
     if(!lib)
         return NULL;
     return lib->maplib;
-}
\ No newline at end of file
+}
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index d6014c19..6b936f18 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -270,8 +270,12 @@ uint64_t RunFunctionHandler(int* exit, uintptr_t fnc, int nargs, ...)
         printf_log(LOG_NONE, "BOX86: Warning, calling Signal function handler %s\n", fnc?"SIG_DFL":"SIG_IGN");
         return 0;
     }
+#ifdef HAVE_TRACE
     uintptr_t old_start = trace_start, old_end = trace_end;
-    //trace_start = 0; trace_end = 1; // disabling trace, globably for now...
+#if 0
+    trace_start = 0; trace_end = 1; // disabling trace, globably for now...
+#endif
+#endif
 
     x64emu_t *emu = thread_get_emu();
 
@@ -308,7 +312,9 @@ uint64_t RunFunctionHandler(int* exit, uintptr_t fnc, int nargs, ...)
 
     uint64_t ret = R_RAX;
 
+#ifdef HAVE_TRACE
     trace_start = old_start; trace_end = old_end;
+#endif
 
     return ret;
 }
diff --git a/src/main.c b/src/main.c
index 60961327..100ea8a9 100755
--- a/src/main.c
+++ b/src/main.c
@@ -40,10 +40,13 @@ uintptr_t box64_nodynarec_end = 0;
 int box64_dynarec = 0;
 #endif
 int dlsym_error = 0;
+#ifdef HAVE_TRACE
 int trace_xmm = 0;
 int trace_emm = 0;
-#ifdef HAVE_TRACE
+int trace_regsdiff = 0;
 uint64_t start_cnt = 0;
+uintptr_t trace_start = 0, trace_end = 0;
+char* trace_func = NULL;
 #ifdef DYNAREC
 int box64_dynarec_trace = 0;
 #endif
@@ -58,8 +61,6 @@ int box64_nopulse = 0;
 int box64_nogtk = 0;
 int box64_novulkan = 0;
 char* libGL = NULL;
-uintptr_t   trace_start = 0, trace_end = 0;
-char* trace_func = NULL;
 uintptr_t fmod_smc_start = 0;
 uintptr_t fmod_smc_end = 0;
 uint32_t default_gs = 0;
@@ -207,6 +208,13 @@ void LoadLogEnv()
                 trace_emm = p[0]-'0';
         }
     }
+    p = getenv("BOX64_TRACE_COLOR");
+    if(p) {
+        if(strlen(p)==1) {
+            if(p[0]>='0' && p[1]<='0'+1)
+                trace_regsdiff = p[0]-'0';
+        }
+    }
     p = getenv("BOX64_TRACE_START");
     if(p) {
         char* p2;
@@ -432,6 +440,7 @@ void PrintHelp() {
     printf("  use BOX64_TRACE_INIT instead of BOX_TRACE to start trace before init of Libs and main program\n\t (function name will probably not work then)\n");
     printf(" BOX64_TRACE_EMM with 1 to enable dump of MMX registers along with regular registers\n");
     printf(" BOX64_TRACE_XMM with 1 to enable dump of SSE registers along with regular registers\n");
+    printf(" BOX64_TRACE_COLOR with 1 to enable detection of changed general register values\n");
     printf(" BOX64_TRACE_START with N to enable trace after N instructions\n");
 #ifdef DYNAREC
     printf(" BOX64_DYNAREC_TRACE with 0/1 to disable or enable Trace on generated code too\n");
@@ -1035,10 +1044,12 @@ int main(int argc, const char **argv, const char **env) {
     int ret = GetEAX(emu);
     printf_log(LOG_DEBUG, "Emulation finished, EAX=%d\n", ret);
 
+#ifdef HAVE_TRACE
     if(trace_func)  {
         free(trace_func);
         trace_func = NULL;
     }
+#endif
 
     return ret;
 }