From 9ca5e13d7f03d76bf06ad1baafb99e12cf053694 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 18 Jun 2023 16:36:11 +0200 Subject: [TRACE] Improve trace for 32bits part --- src/emu/x64run_private.c | 20 ++++++++++++++------ src/include/x64emu.h | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 1aa02b2f..d191fd02 100755 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -1010,7 +1010,7 @@ const char* getAddrFunctionName(uintptr_t addr) return ret; } -void printFunctionAddr(uintptr_t nextaddr, const char* text) +int printFunctionAddr(uintptr_t nextaddr, const char* text) { uint64_t sz = 0; uintptr_t start = 0; @@ -1021,7 +1021,9 @@ void printFunctionAddr(uintptr_t nextaddr, const char* text) printf_log(LOG_NONE, " (%s%s:%s)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname); else printf_log(LOG_NONE, " (%s%s:%s + %ld)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname, nextaddr - start); + return 1; } + return 0; } #ifdef HAVE_TRACE @@ -1076,20 +1078,26 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec) } if(peek==0xC3 || peek==0xC2 || (peek==0xF3 && PK(1)==0xC3)) { printf_log(LOG_NONE, " => %p", *(void**)(R_RSP)); - printFunctionAddr(*(uintptr_t*)(R_RSP), "=> "); + if(is32bits) + printFunctionAddr(*(uint32_t*)(R_RSP), "=> "); + else + printFunctionAddr(*(uintptr_t*)(R_RSP), "=> "); } else if(peek==0x57 && rex.b) { printf_log(LOG_NONE, " => STACK_TOP: %p", *(void**)(R_RSP)); printFunctionAddr(ip, "here: "); - } else if(peek==0x55 || peek==0x53) { + } else if((peek==0x55 || peek==0x53) && !is32bits) { printFunctionAddr(*(uintptr_t*)(R_RSP), " STACK_TOP: "); - } else if(peek==0xF3 && PK(1)==0x0F && PK(2)==0x1E && PK(3)==0xFA) { + } else if((peek==0x55 || peek==0x56) && is32bits) { + if(!printFunctionAddr(*(uint32_t*)(R_RSP), " STACK_TOP: ")) + printf_log(LOG_NONE, " STACK_TOP: %p ", (void*)(uintptr_t)*(uint32_t*)(R_RSP)); + } else if(peek==0xF3 && PK(1)==0x0F && PK(2)==0x1E && PK(3)==0xFA && !is32bits) { printFunctionAddr(*(uintptr_t*)(R_RSP), " STACK_TOP: "); } else if(peek==0xE8) { // Call - uintptr_t nextaddr = ip + 5 + PK64(1); + uintptr_t nextaddr = ip + 5 + PK32(1); printFunctionAddr(nextaddr, "=> "); } else if(peek==0xFF) { if(PK(1)==0x25) { - uintptr_t nextaddr = ip + 6 + PK64(2); + uintptr_t nextaddr = ip + 6 + PK32(2); printFunctionAddr(nextaddr, "=> "); } } diff --git a/src/include/x64emu.h b/src/include/x64emu.h index e9ad201c..355c7fa1 100755 --- a/src/include/x64emu.h +++ b/src/include/x64emu.h @@ -58,7 +58,7 @@ long double LD2localLD(void* ld); // long double (80bits pointer) -> long void LD2D(void* ld, void* d); // long double (80bits) -> double (64bits) void D2LD(void* d, void* ld); // double (64bits) -> long double (64bits) -void printFunctionAddr(uintptr_t nextaddr, const char* text); +int printFunctionAddr(uintptr_t nextaddr, const char* text); // 0 if nothing was found const char* getAddrFunctionName(uintptr_t addr); #endif //__X86EMU_H_ \ No newline at end of file -- cgit 1.4.1