diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-16 17:53:24 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-16 17:53:24 +0200 |
| commit | e8ecbbdc6ad15c41867a494800916bab3628d70a (patch) | |
| tree | 2a5fbcfcbe02e70add6d928f0f0a18a50dbf26fd /src/emu | |
| parent | 1f7c69e19e82ec8ddf87c7e4e6fca8160b50e818 (diff) | |
| download | box64-e8ecbbdc6ad15c41867a494800916bab3628d70a.tar.gz box64-e8ecbbdc6ad15c41867a494800916bab3628d70a.zip | |
[BOX32][TRACE] Improved some trace and function calls for 32bits process
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/x64run_private.c | 18 | ||||
| -rwxr-xr-x | src/emu/x86int3.c | 7 |
2 files changed, 22 insertions, 3 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index f36e6aed..717ce249 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -1257,13 +1257,17 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec) } else if((peek==0x55 /*|| peek==0x53*/) && !is32bits) { if(!printFunctionAddr(*(uintptr_t*)(R_RSP), " STACK_TOP: ")) printf_log(LOG_NONE, " STACK_TOP: %p ", (void*)*(uintptr_t*)(R_RSP)); - } else if((peek==0x55 || peek==0x56 || peek==0x53) && is32bits) { + } else if((peek==0x55 || peek==0x56 || peek==0x53 || peek==0x57) && 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) { uintptr_t nextaddr = *(uintptr_t*)(R_RSP); if(!printFunctionAddr(nextaddr, "=> ")) printf_log(LOG_NONE, " => %p", (void*)nextaddr); + } else if((peek==0x81 || peek==0x83) && PK(1)==0xEC && is32bits) { + uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_ESP); + if(!printFunctionAddr(nextaddr, "STACK_TOP: ")) + printf_log(LOG_NONE, " STACK_TOP: %p", (void*)nextaddr); } else if(peek==0xE8 || peek==0xE9) { // Call & Jmp uintptr_t nextaddr = ip + 5 + PK32(1); printFunctionAddr(nextaddr, "=> "); @@ -1293,11 +1297,19 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec) printf_log(LOG_NONE, " => %p", (void*)nextaddr); printFunctionAddr(nextaddr, "=> "); } else if(is32bits && PK(1)==0xA3) { - uintptr_t nextaddr = *(ptr_t*)(R_RBX + PK32(2)); + uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EBX + PK32(2)); + printf_log(LOG_NONE, " => %p", (void*)nextaddr); + printFunctionAddr(nextaddr, "=> "); + } else if(is32bits && PK(1)==0x50) { + uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EAX + PK(2)); printf_log(LOG_NONE, " => %p", (void*)nextaddr); printFunctionAddr(nextaddr, "=> "); } else if(is32bits && PK(1)==0x52) { - uintptr_t nextaddr = *(ptr_t*)(R_RDX + PK(2)); + uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EDX + PK(2)); + printf_log(LOG_NONE, " => %p", (void*)nextaddr); + printFunctionAddr(nextaddr, "=> "); + } else if(is32bits && PK(1)==0x10) { + uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EAX); printf_log(LOG_NONE, " => %p", (void*)nextaddr); printFunctionAddr(nextaddr, "=> "); } diff --git a/src/emu/x86int3.c b/src/emu/x86int3.c index 185750ef..f9f72a76 100755 --- a/src/emu/x86int3.c +++ b/src/emu/x86int3.c @@ -201,6 +201,9 @@ void x86Int3(x64emu_t* emu, uintptr_t* addr) } else if(strstr(s, "strcasecmp")==s || strstr(s, "__strcasecmp")==s) { snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\", \"%s\")", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+8))); ret_fmt = 1; + } else if(strstr(s, "wcsncasecmp")==s) { + snprintf(buff, 255, "%04d|%p: Calling %s(\"%S\", \"%S\", %d)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+8)), *(int*)from_ptr(R_ESP+12)); + ret_fmt = 1; } else if(strstr(s, "gtk_signal_connect_full")) { snprintf(buff, 255, "%04d|%p: Calling %s(%p, \"%s\", %p, %p, %p, %p, %d, %d)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), "gtk_signal_connect_full", from_ptrv(*(ptr_t*)from_ptr(R_ESP+4)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+8)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+12)), *(void**)from_ptr(R_ESP+16), *(void**)from_ptr(R_ESP+20), *(void**)from_ptr(R_ESP+24), *(int32_t*)from_ptr(R_ESP+28), *(int32_t*)from_ptr(R_ESP+32)); } else if(strstr(s, "strcmp")==s || strstr(s, "__strcmp")==s) { @@ -322,9 +325,13 @@ void x86Int3(x64emu_t* emu, uintptr_t* addr) post = 8; pu32 = (uint32_t*)from_ptr(*(ptr_t*)from_ptr(R_ESP+4)); snprintf(buff, 255, "%04d|%p: Calling %s(%p, 0x%x, 0x%x)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4)), *(uint32_t*)from_ptr(R_ESP+8), *(uint32_t*)from_ptr(R_ESP+12)); + } else if(strstr(s, "SDL_GL_LoadLibrary")==s) { + snprintf(buff, 255, "%04d|%p: Calling %s(\"%s\")", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4))); } else if(strstr(s, "SDL_GetWindowSurface")==s) { post = 5; snprintf(buff, 255, "%04d|%p: Calling %s(%p)", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4))); + } else if(strstr(s, "___tls_get_addr")) { + snprintf(buff, 255, "%04d|%p: Calling %s(%p[%d, %d])", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(R_EAX), ((int*)from_ptrv(R_EAX))[0], ((int*)from_ptrv(R_EAX))[1]); } else if(strstr(s, "udev_monitor_new_from_netlink")==s) { post = 5; snprintf(buff, 255, "%04d|%p: Calling %s(%p, \"%s\")", tid, from_ptrv(*(ptr_t*)from_ptr(R_ESP)), s, from_ptrv(*(ptr_t*)from_ptr(R_ESP+4)), from_ptrv(*(ptr_t*)from_ptr(R_ESP+8))); |