about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-06-19 21:18:05 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-06-19 21:18:05 +0200
commit962c3c25b657ef7ad117aa5f19040b3430480b30 (patch)
tree25b3778e63045b40fbb14f10af0ab6bf332a81ba /src
parentae6d6d753a1206655f7afae707d6cc759de85ec2 (diff)
downloadbox64-962c3c25b657ef7ad117aa5f19040b3430480b30.tar.gz
box64-962c3c25b657ef7ad117aa5f19040b3430480b30.zip
Various small debugging improvments
Diffstat (limited to 'src')
-rwxr-xr-xsrc/elfs/elfloader.c11
-rwxr-xr-xsrc/emu/x64int3.c2
-rwxr-xr-xsrc/emu/x64run_private.c2
-rwxr-xr-xsrc/libtools/signals.c13
-rwxr-xr-xsrc/wrapped/wrappedlibc.c18
5 files changed, 26 insertions, 20 deletions
diff --git a/src/elfs/elfloader.c b/src/elfs/elfloader.c
index fc58a502..8b46ad3c 100755
--- a/src/elfs/elfloader.c
+++ b/src/elfs/elfloader.c
@@ -156,12 +156,10 @@ const char* ElfPath(elfheader_t* head)
 int AllocElfMemory(box64context_t* context, elfheader_t* head, int mainbin)
 {
     uintptr_t offs = 0;
-    if((mainbin && head->vaddr==0) || (!mainbin && !head->vaddr && box64_load_addr)) {
-        if(box64_load_addr) {
-            offs = box64_load_addr;
-            box64_load_addr += head->memsz;
-            box64_load_addr = (box64_load_addr+0xffffffLL)&~0xffffffLL;
-        }
+    if(!head->vaddr && box64_load_addr) {
+        offs = box64_load_addr;
+        box64_load_addr += head->memsz;
+        box64_load_addr = (box64_load_addr+0xffffffLL)&~0xffffffLL;
     }
     int log_level = box64_load_addr?LOG_INFO:LOG_DEBUG;
     if(!offs)
@@ -567,7 +565,6 @@ uintptr_t tlsdescUndefweak = 0;
 uintptr_t GetSegmentBaseEmu(x64emu_t* emu, int seg);
 EXPORT uintptr_t _dl_tlsdesc_undefweak(x64emu_t* emu)
 {
-    printf_log(LOG_DEBUG, "_dl_tlsdesc_undefweak, rax=%p\n", (void*)R_RAX);
     struct tlsdesc *td = (struct tlsdesc *)R_RAX;
     return td->arg;
 }
diff --git a/src/emu/x64int3.c b/src/emu/x64int3.c
index c382734e..07113eed 100755
--- a/src/emu/x64int3.c
+++ b/src/emu/x64int3.c
@@ -181,6 +181,8 @@ void x64Int3(x64emu_t* emu)
                 } else if (!strcmp(s, "glGetStringi")) {
                     post = 2;
                     snprintf(buff, 255, "%04d|%p: Calling %s(0x%x, %d)", tid, *(void**)(R_RSP), s, R_EDI, R_ESI);
+                } else if (!strcmp(s, "_dl_tlsdesc_undefweak")) {
+                    snprintf(buff, 255, "%04d|%p: Calling %s(RAX=%p)", tid, *(void**)(R_RSP), s, (void*)R_RAX);
                 } else if (!strcmp(s, "glFramebufferTexture2D")) {
                     snprintf(buff, 255, "%04d|%p: Calling %s(0x%x, 0x%x, 0x%x, %u, %d)", tid, *(void**)(R_RSP), s, R_EDI, R_ESI, R_EDX, R_ECX, R_R8d);
                 } else if (!strcmp(s, "glTexSubImage2D")) {
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index ae306d83..16a9235e 100755
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -961,6 +961,7 @@ const char* getAddrFunctionName(uintptr_t addr)
     uintptr_t start = 0;
     elfheader_t* elf = FindElfAddress(my_context, addr);
     const char* symbname = FindNearestSymbolName(elf, (void*)addr, &start, &sz);
+    if(!sz) sz=0x100;   // arbitrary value...
     if(symbname && addr>=start && (addr<(start+sz) || !sz)) {
         if(symbname[0]=='\0')
             sprintf(ret, "%s + 0x%lx", ElfName(elf), addr - (uintptr_t)GetBaseAddress(elf));
@@ -982,6 +983,7 @@ void printFunctionAddr(uintptr_t nextaddr, const char* text)
     uint64_t sz = 0;
     uintptr_t start = 0;
     const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, nextaddr), (void*)nextaddr, &start, &sz);
+    if(!sz) sz=0x100;   // arbitrary value...
     if(symbname && nextaddr>=start && (nextaddr<(start+sz) || !sz)) {
         if(nextaddr==start)
             printf_log(LOG_NONE, " (%s%s:%s)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname);
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 92f973b4..7563b855 100755
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -265,7 +265,7 @@ static void sigstack_key_alloc() {
 	pthread_key_create(&sigstack_key, sigstack_destroy);
 }
 
-uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...)
+uint64_t RunFunctionHandler(int* exit, int* lj, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...)
 {
     if(fnc==0 || fnc==1) {
         printf_log(LOG_NONE, "BOX64: Warning, calling Signal function handler %s\n", fnc?"SIG_IGN":"SIG_DFL");
@@ -319,6 +319,8 @@ uint64_t RunFunctionHandler(int* exit, x64_ucontext_t* sigcontext, uintptr_t fnc
     emu->quitonlongjmp = oldquitonlongjmp;
 
     if(emu->longjmp) {
+        if(lj)
+            *lj = 1;
         // longjmp inside signal handler, lets grab all relevent value and do the actual longjmp in the signal handler
         emu->longjmp = 0;
         if(sigcontext) {
@@ -632,11 +634,12 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
     R_RBP = sigcontext->uc_mcontext.gregs[X64_RBP];
 
     int exits = 0;
+    int lj = box64_wine?0:1;
     int ret;
     if (simple)
-        ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 1, sig);
+        ret = RunFunctionHandler(&exits, &lj, sigcontext, my_context->signals[sig], 1, sig);
     else
-        ret = RunFunctionHandler(&exits, sigcontext, my_context->signals[sig], 3, sig, info, sigcontext);
+        ret = RunFunctionHandler(&exits, &lj, sigcontext, my_context->signals[sig], 3, sig, info, sigcontext);
     // restore old value from emu
     #define GO(A) R_##A = old_##A
     GO(RAX);
@@ -649,7 +652,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
     GO(RBP);
     #undef GO
 
-    if(memcmp(sigcontext, &sigcontext_copy, sizeof(x64_ucontext_t))) {
+    if(lj && memcmp(sigcontext, &sigcontext_copy, sizeof(x64_ucontext_t))) {
         emu_jmpbuf_t* ejb = GetJmpBuf();
         if(ejb->jmpbuf_ok) {
             #define GO(R)   ejb->emu->regs[_##R].q[0]=sigcontext->uc_mcontext.gregs[X64_R##R]
@@ -735,7 +738,7 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, siginfo_t* info, void
         exit(ret);
     }
     if(restorer)
-        RunFunctionHandler(&exits, NULL, restorer, 0);
+        RunFunctionHandler(&exits, NULL, NULL, restorer, 0);
     if(used_stack)  // release stack
         new_ss->ss_flags = 0;
     relockMutex(Locks);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index 675963d6..f46da308 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -2611,22 +2611,23 @@ EXPORT int my_backtrace(x64emu_t* emu, void** buffer, int size)
 EXPORT char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size)
 {
     (void)emu;
-    char** ret = (char**)calloc(1, size*sizeof(char*) + size*100);  // capping each strings to 100 chars
+    char** ret = (char**)calloc(1, size*sizeof(char*) + size*200);  // capping each strings to 200 chars
     char* s = (char*)(ret+size);
     for (int i=0; i<size; ++i) {
         uintptr_t start = 0;
         uint64_t sz = 0;
         elfheader_t *hdr = FindElfAddress(my_context, buffer[i]);
         const char* symbname = FindNearestSymbolName(hdr, (void*)buffer[i], &start, &sz);
+        if(!sz) sz=0x100;   // arbitrary value...
         if (symbname && buffer[i]>=start && (buffer[i]<(start+sz) || !sz)) {
-            snprintf(s, 100, "%s(%s+%lx) [%p]", ElfName(hdr), symbname, buffer[i] - start, (void*)buffer[i]);
+            snprintf(s, 200, "%s(%s+%lx) [%p]", ElfName(hdr), symbname, buffer[i] - start, (void*)buffer[i]);
         } else if (hdr) {
-            snprintf(s, 100, "%s+%lx [%p]", ElfName(hdr), buffer[i] - (uintptr_t)GetBaseAddress(hdr), (void*)buffer[i]);
+            snprintf(s, 200, "%s+%lx [%p]", ElfName(hdr), buffer[i] - (uintptr_t)GetBaseAddress(hdr), (void*)buffer[i]);
         } else {
-            snprintf(s, 100, "??? [%p]", (void*)buffer[i]);
+            snprintf(s, 200, "??? [%p]", (void*)buffer[i]);
         }
         ret[i] = s;
-        s += 100;
+        s += 200;
     }
     return ret;
 }
@@ -2634,15 +2635,16 @@ EXPORT char** my_backtrace_symbols(x64emu_t* emu, uintptr_t* buffer, int size)
 EXPORT void my_backtrace_symbols_fd(x64emu_t* emu, uintptr_t* buffer, int size, int fd)
 {
     (void)emu;
-    char s[100];
+    char s[200];
     for (int i=0; i<size; ++i) {
         uintptr_t start = 0;
         uint64_t sz = 0;
         const char* symbname = FindNearestSymbolName(FindElfAddress(my_context, buffer[i]), (void*)buffer[i], &start, &sz);
+        if(!sz) sz=0x100;   // arbitrary value...
         if(symbname && buffer[i]>=start && (buffer[i]<(start+sz) || !sz))
-            snprintf(s, 100, "%s+%ld [%p]\n", symbname, buffer[i] - start, (void*)buffer[i]);
+            snprintf(s, 200, "%s+%ld [%p]\n", symbname, buffer[i] - start, (void*)buffer[i]);
         else 
-            snprintf(s, 100, "??? [%p]\n", (void*)buffer[i]);
+            snprintf(s, 200, "??? [%p]\n", (void*)buffer[i]);
         int dummy = write(fd, s, strlen(s));
         (void)dummy;
     }