diff options
| author | rajdakin <rajdakin@gmail.com> | 2021-04-07 17:09:37 +0200 |
|---|---|---|
| committer | rajdakin <rajdakin@gmail.com> | 2021-04-07 17:09:37 +0200 |
| commit | 79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398 (patch) | |
| tree | 6e6bd1ec24c472810b2c789d0603a96321624d73 /src | |
| parent | 7e09961ee7ac6841883b68123ad700609d2fd955 (diff) | |
| download | box64-79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398.tar.gz box64-79f2b8448a7eeea5f5e182e7ce2ceb15e8e29398.zip | |
[TRACE] Added a new trace option
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64emu.c | 21 | ||||
| -rwxr-xr-x | src/emu/x64emu_private.h | 3 | ||||
| -rwxr-xr-x | src/include/debug.h | 13 | ||||
| -rwxr-xr-x | src/librarian/library.c | 4 | ||||
| -rwxr-xr-x | src/libtools/signals.c | 8 | ||||
| -rwxr-xr-x | src/main.c | 17 |
6 files changed, 51 insertions, 15 deletions
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; } |