about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-16 17:53:24 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-16 17:53:24 +0200
commite8ecbbdc6ad15c41867a494800916bab3628d70a (patch)
tree2a5fbcfcbe02e70add6d928f0f0a18a50dbf26fd /src/emu
parent1f7c69e19e82ec8ddf87c7e4e6fca8160b50e818 (diff)
downloadbox64-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.c18
-rwxr-xr-xsrc/emu/x86int3.c7
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)));