about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-04-10 20:09:23 +0800
committerGitHub <noreply@github.com>2025-04-10 14:09:23 +0200
commit0bb41a73c27df807ba8fcaa205612be7b3a1ac95 (patch)
treee789a5ff074bae6d492c6ea19f824cdecc7e3d37 /src
parentf9f082ee53ae0ab8e12b0c1bf1de339af8b92282 (diff)
downloadbox64-0bb41a73c27df807ba8fcaa205612be7b3a1ac95.tar.gz
box64-0bb41a73c27df807ba8fcaa205612be7b3a1ac95.zip
[WOW64] More tweaks towards PE build (#2519)
Diffstat (limited to 'src')
-rw-r--r--src/box64context.c33
-rw-r--r--src/custommem.c38
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h2
-rw-r--r--src/dynarec/dynarec_native.c12
-rw-r--r--src/dynarec/dynarec_native_functions.c6
-rw-r--r--src/dynarec/la64/dynarec_la64_pass0.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass3.h2
-rw-r--r--src/emu/x64run_private.c62
-rw-r--r--src/emu/x64run_private.h1
-rw-r--r--src/include/box64context.h2
-rw-r--r--src/include/custommem.h2
-rw-r--r--src/include/debug.h2
-rw-r--r--src/include/mysignal.h2
-rw-r--r--src/include/symbolfuncs.h8
-rw-r--r--src/include/x64emu.h1
-rw-r--r--src/libtools/signal32.c3
-rw-r--r--src/libtools/signals.c45
-rw-r--r--src/os/os_wine.c5
-rw-r--r--src/os/symbolfuncs_linux.c20
-rw-r--r--src/os/symbolfuncs_wine.c6
21 files changed, 136 insertions, 120 deletions
diff --git a/src/box64context.c b/src/box64context.c
index 74e86c83..110873f6 100644
--- a/src/box64context.c
+++ b/src/box64context.c
@@ -86,39 +86,6 @@ void free_tlsdatasize(void* p)
 void x64Syscall(x64emu_t *emu);
 void x86Syscall(x64emu_t *emu);
 
-int unlockMutex()
-{
-    int ret = unlockCustommemMutex();
-    int i;
-    #ifdef USE_CUSTOM_MUTEX
-    uint32_t tid = (uint32_t)GetTID();
-    #define GO(A, B)                    \
-        i = (native_lock_storeifref2_d(&A, 0, tid)==tid); \
-        if(i) {                         \
-            ret|=(1<<B);                \
-        }
-    #else
-        #define GO(A, B)                \
-        i = checkUnlockMutex(&A);       \
-        if(i) {                         \
-            ret|=(1<<B);                \
-        }
-    #endif
-
-    GO(my_context->mutex_trace, 7)
-    #ifdef DYNAREC
-    GO(my_context->mutex_dyndump, 8)
-    #else
-    GO(my_context->mutex_lock, 8)
-    #endif
-    GO(my_context->mutex_tls, 9)
-    GO(my_context->mutex_thread, 10)
-    GO(my_context->mutex_bridge, 11)
-    #undef GO
-
-    return ret;
-}
-
 void relockMutex(int locks)
 {
     relockCustommemMutex(locks);
diff --git a/src/custommem.c b/src/custommem.c
index 0ff0142d..ef227b1b 100644
--- a/src/custommem.c
+++ b/src/custommem.c
@@ -45,15 +45,15 @@ static uintptr_t           box64_jmptbldefault0[1<<JMPTABL_SHIFT0];
 KHASH_SET_INIT_INT64(lockaddress)
 static kh_lockaddress_t    *lockaddress = NULL;
 #ifdef USE_CUSTOM_MUTEX
-static uint32_t            mutex_prot;
-static uint32_t            mutex_blocks;
+uint32_t            mutex_prot;
+uint32_t            mutex_blocks;
 #else
-static pthread_mutex_t     mutex_prot;
-static pthread_mutex_t     mutex_blocks;
+pthread_mutex_t     mutex_prot;
+pthread_mutex_t     mutex_blocks;
 #endif
 #else
-static pthread_mutex_t     mutex_prot;
-static pthread_mutex_t     mutex_blocks;
+pthread_mutex_t     mutex_prot;
+pthread_mutex_t     mutex_blocks;
 #endif
 //#define TRACE_MEMSTAT
 rbtree_t* memprot = NULL;
@@ -1859,6 +1859,7 @@ uintptr_t old_brk = 0;
 uintptr_t* cur_brk = NULL;
 void loadProtectionFromMap()
 {
+#ifndef _WIN32 // TODO: Should this be implemented on Win32?
     if(box64_mapclean)
         return;
     char buf[500];
@@ -1893,6 +1894,7 @@ void loadProtectionFromMap()
     }
     fclose(f);
     box64_mapclean = 1;
+#endif
 }
 
 void freeProtection(uintptr_t addr, size_t size)
@@ -2058,30 +2060,6 @@ int isBlockFree(void* hint, size_t size)
     return 0;
 }
 
-int unlockCustommemMutex()
-{
-    int ret = 0;
-    int i = 0;
-    #ifdef USE_CUSTOM_MUTEX
-    uint32_t tid = (uint32_t)GetTID();
-    #define GO(A, B)                    \
-        i = (native_lock_storeifref2_d(&A, 0, tid)==tid); \
-        if(i) {                         \
-            ret|=(1<<B);                \
-        }
-    #else
-    #define GO(A, B)                    \
-        i = checkUnlockMutex(&A);       \
-        if(i) {                         \
-            ret|=(1<<B);                \
-        }
-    #endif
-    GO(mutex_blocks, 0)
-    GO(mutex_prot, 1) // See also signals.c
-    #undef GO
-    return ret;
-}
-
 void relockCustommemMutex(int locks)
 {
     #define GO(A, B)                    \
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index 64dfd500..ec792acb 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -50,7 +50,7 @@
                     PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
                     PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
             }                                                                                                                 \
-            printFunctionAddr(ip, " => ");                                                                                    \
+            PrintFunctionAddr(ip, " => ");                                                                                    \
             dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
         }
 
diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c
index 197a163e..5478fc43 100644
--- a/src/dynarec/dynarec_native.c
+++ b/src/dynarec/dynarec_native.c
@@ -46,11 +46,11 @@ void printf_x64_instruction(dynarec_native_t* dyn, zydis_dec_t* dec, instruction
         // print Call function name if possible
         if(ip[0]==0xE8 || ip[0]==0xE9) { // Call / Jmp
             uintptr_t nextaddr = (uintptr_t)ip + 5 + *((int32_t*)(ip+1));
-            printFunctionAddr(nextaddr, "=> ");
+            PrintFunctionAddr(nextaddr, "=> ");
         } else if(ip[0]==0xFF) {
             if(ip[1]==0x25) {
                 uintptr_t nextaddr = (uintptr_t)ip + 6 + *((int32_t*)(ip+2));
-                printFunctionAddr(nextaddr, "=> ");
+                PrintFunctionAddr(nextaddr, "=> ");
             }
         }
         // end of line and colors
@@ -235,7 +235,7 @@ int next_instruction(dynarec_native_t *dyn, uintptr_t addr)
         case 0xF3:
             nextop = PK(1);
             switch(nextop) {
-                case 0x90: 
+                case 0x90:
                     return 2;
                 default: break;
             }
@@ -279,7 +279,7 @@ void addInst(instsize_t* insts, size_t* size, int x64_size, int native_size)
         toadd = 1 + native_size/15;
     while(toadd) {
         if(x64_size>15)
-            insts[*size].x64 = 15;    
+            insts[*size].x64 = 15;
         else
             insts[*size].x64 = x64_size;
         x64_size -= insts[*size].x64;
@@ -764,7 +764,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
         CancelBlock64(0);
         return NULL;
     }
-    
+
     // pass 2, instruction size
     helper.callrets = static_callrets;
     native_pass2(&helper, addr, alternate, is32bits, inst_max);
@@ -824,7 +824,7 @@ void* FillBlock64(dynablock_t* block, uintptr_t addr, int alternate, int is32bit
     // pass 3, emit (log emit native opcode)
     if(BOX64DRENV(dynarec_dump)) {
         dynarec_log(LOG_NONE, "%s%04d|Emitting %zu bytes for %u %s bytes (native=%zu, table64=%zu, instsize=%zu, arch=%zu, callrets=%zu)", (BOX64DRENV(dynarec_dump)>1)?"\e[01;36m":"", GetTID(), helper.native_size, helper.isize, is32bits?"x86":"x64", native_size, helper.table64size*sizeof(uint64_t), insts_rsize, arch_size, callret_size);
-        printFunctionAddr(helper.start, " => ");
+        PrintFunctionAddr(helper.start, " => ");
         dynarec_log(LOG_NONE, "%s\n", (BOX64DRENV(dynarec_dump)>1)?"\e[m":"");
     }
     if (BOX64ENV(dynarec_gdbjit) && (!BOX64ENV(dynarec_gdbjit_end) || (addr >= BOX64ENV(dynarec_gdbjit_start) && addr < BOX64ENV(dynarec_gdbjit_end)))) {
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index e3813ff4..015058ad 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -20,7 +20,7 @@
 #include "emu/x64run_private.h"
 #include "emu/x87emu_private.h"
 #include "x64trace.h"
-#include "signals.h"
+#include "mysignal.h"
 #include "emit_signals.h"
 #include "dynarec_native.h"
 #include "custommem.h"
@@ -629,7 +629,7 @@ int is_avx_zero_unset(dynarec_native_t* dyn, int ninst, int reg)
 {
     if((dyn->ymm_zero>>reg)&1) {
         dyn->ymm_zero &= ~(1<<reg);
-        return 1;    
+        return 1;
     }
     return 0;
 }
@@ -651,7 +651,7 @@ void propagate_nodf(dynarec_native_t* dyn, int ninst)
         if(dyn->insts[ninst].x64.gen_flags || dyn->insts[ninst].x64.use_flags)
             return; // flags are use, so maybe it's needed
         dyn->insts[ninst].df_notneeded = 1;
-        --ninst;       
+        --ninst;
     }
 }
 
diff --git a/src/dynarec/la64/dynarec_la64_pass0.h b/src/dynarec/la64/dynarec_la64_pass0.h
index 12ebe225..3193aca1 100644
--- a/src/dynarec/la64/dynarec_la64_pass0.h
+++ b/src/dynarec/la64/dynarec_la64_pass0.h
@@ -65,6 +65,6 @@
                 PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
                 PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
         }                                                                                                                 \
-        printFunctionAddr(ip, " => ");                                                                                    \
+        PrintFunctionAddr(ip, " => ");                                                                                    \
         dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
     }
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index 8dc5d8a0..2f77b610 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -85,7 +85,7 @@
                     PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
                     PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
             }                                                                                                                 \
-            printFunctionAddr(ip, " => ");                                                                                    \
+            PrintFunctionAddr(ip, " => ");                                                                                    \
             dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
         }
 
diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h
index 1fec3dcb..5176c5c4 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass3.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass3.h
@@ -54,7 +54,7 @@
                 PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                               \
                 PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                                      \
         }                                                                                                                               \
-        printFunctionAddr(ip, " => ");                                                                                                  \
+        PrintFunctionAddr(ip, " => ");                                                                                                  \
         dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                          \
     }                                                                                                                                   \
     return 0
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 74070784..f9eec5c6 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -414,7 +414,7 @@ void UpdateFlags(x64emu_t *emu)
                 CLEAR_FLAG(F_OF);
             } else {
                 SET_FLAG(F_CF);
-                SET_FLAG(F_OF); 
+                SET_FLAG(F_OF);
             }
             if (!BOX64ENV(cputype)) {
                 CONDITIONAL_SET_FLAG((emu->res.u32>>31)&1, F_SF);
@@ -1208,22 +1208,6 @@ const char* getAddrFunctionName(uintptr_t addr)
     return ret;
 }
 
-int 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_prefix(0, LOG_NONE, " (%s%s:%s)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname);
-        else
-            printf_log_prefix(0, LOG_NONE, " (%s%s:%s + 0x%lx)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname, nextaddr - start);
-        return 1;
-    }
-    return 0;
-}
-
 #ifdef HAVE_TRACE
 #define PK(a)     (*(uint8_t*)(ip+a))
 #define PKS(a)    (*(int8_t*)(ip+a))
@@ -1235,14 +1219,14 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec)
     int is32bits = (emu->segs[_CS]==0x23);
     if(BOX64ENV(start_cnt)) SET_BOX64ENV(start_cnt, BOX64ENV(start_cnt)-1);
     if(!BOX64ENV(start_cnt) && my_context->dec && (
-            (trace_end == 0) 
+            (trace_end == 0)
             || ((ip >= trace_start) && (ip < trace_end))) ) {
         int tid = syscall(SYS_gettid);
         mutex_lock(&my_context->mutex_trace);
 #ifdef DYNAREC
         if((my_context->trace_tid != tid) || (my_context->trace_dynarec!=dynarec)) {
             printf_log(LOG_NONE, "Thread %04d| (%s) ", tid, dynarec?"dyn":"int");
-            printFunctionAddr(ip, "here: ");
+            PrintFunctionAddr(ip, "here: ");
             printf_log_prefix(0, LOG_NONE, "\n");
             my_context->trace_tid = tid;
             my_context->trace_dynarec = dynarec;
@@ -1279,81 +1263,81 @@ void PrintTrace(x64emu_t* emu, uintptr_t ip, int dynarec)
             if(peek==0xC3 || peek==0xC2 || (peek==0xF3 && PK(1)==0xC3)) {
                 if(is32bits) {
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)(uintptr_t)*(uint32_t*)(R_RSP));
-                    printFunctionAddr(*(uint32_t*)(R_RSP), "=> ");
+                    PrintFunctionAddr(*(uint32_t*)(R_RSP), "=> ");
                 } else {
                     printf_log_prefix(0, LOG_NONE, " => %p", *(void**)(R_RSP));
-                    printFunctionAddr(*(uintptr_t*)(R_RSP), "=> ");
+                    PrintFunctionAddr(*(uintptr_t*)(R_RSP), "=> ");
                 }
             } else if(peek==0x57 && rex.b) {
                 printf_log_prefix(0, LOG_NONE, " => STACK_TOP: %p", *(void**)(R_RSP));
-                printFunctionAddr(ip, "here: ");
+                PrintFunctionAddr(ip, "here: ");
             } else if((peek==0x55 /*|| peek==0x53*/) && !is32bits) {
-                if(!printFunctionAddr(*(uintptr_t*)(R_RSP), " STACK_TOP: "))
+                if(!PrintFunctionAddr(*(uintptr_t*)(R_RSP), " STACK_TOP: "))
                     printf_log_prefix(0, LOG_NONE, " STACK_TOP: %p ", (void*)*(uintptr_t*)(R_RSP));
             } else if((peek==0x55 || peek==0x56 || peek==0x53 || peek==0x57) && is32bits) {
-                if(!printFunctionAddr(*(uint32_t*)(R_RSP), " STACK_TOP: "))
+                if(!PrintFunctionAddr(*(uint32_t*)(R_RSP), " STACK_TOP: "))
                     printf_log_prefix(0, 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, "=> "))
+                if(!PrintFunctionAddr(nextaddr, "=> "))
                     printf_log_prefix(0, 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: "))
+                if(!PrintFunctionAddr(nextaddr, "STACK_TOP: "))
                     printf_log_prefix(0, LOG_NONE, " STACK_TOP: %p", (void*)nextaddr);
             } else if(peek==0xE8 || peek==0xE9) { // Call & Jmp
                 uintptr_t nextaddr = ip + 5 + PK32(1);
-                printFunctionAddr(nextaddr, "=> ");
+                PrintFunctionAddr(nextaddr, "=> ");
             } else if(peek==0xFF) {
                 if(PK(1)==0x25) {
                     uintptr_t nextaddr = is32bits?(*(uint32_t*)(uintptr_t)PK32(2)):(*(uintptr_t*)(ip + 6 + PK32(2)));
-                    if(!printFunctionAddr(nextaddr, "=> "))
+                    if(!PrintFunctionAddr(nextaddr, "=> "))
                         printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
                 } else if(PK(1)==0x15) {
                     uintptr_t nextaddr = is32bits?(*(uint32_t*)(uintptr_t)PK32(2)):(*(uintptr_t*)(ip + 6 + PK32(2)));
-                    if(!printFunctionAddr(nextaddr, "=> "))
+                    if(!PrintFunctionAddr(nextaddr, "=> "))
                         printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
                 } else if(PK(1)==0x60) {
                     uintptr_t nextaddr = *(uintptr_t*)(R_RAX+PK(2));
-                    if(!printFunctionAddr(nextaddr, "=> "))
+                    if(!PrintFunctionAddr(nextaddr, "=> "))
                         printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
                 } else if(PK(1)==0xE0) {
                     uintptr_t nextaddr = R_RAX;
                     if(is32bits) nextaddr &= 0xffffffff;
-                    if(!printFunctionAddr(nextaddr, "=> "))
+                    if(!PrintFunctionAddr(nextaddr, "=> "))
                         printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
                 } else if((PK(1)==0x14) && (PK(2)==0x25)) {
                     uintptr_t nextaddr = is32bits?(*(uint32_t*)(uintptr_t)PK32(3)):(*(uintptr_t*)(uintptr_t)PK32(3));
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if((PK(1)==0x14) && (PK(2)==0xC2) && rex.rex==0x41) {
                     uintptr_t nextaddr = *(uintptr_t*)(R_R10 + R_RAX*8);
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(PK(1)==0xE1 && rex.rex==0x41) {
                     uintptr_t nextaddr = R_R9;
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(is32bits && PK(1)==0xA3) {
                     uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EBX + PK32(2));
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(PK(1)==0x92) {
                     uintptr_t nextaddr = is32bits?(*(ptr_t*)from_ptrv(R_EDX + PK32(2))):(*(uintptr_t*)(R_RDX + PK32(2)));
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(PK(1)==0x50) {
                     uintptr_t nextaddr = is32bits?(*(ptr_t*)from_ptrv(R_EAX + PK(2))):(*(uintptr_t*)(R_RAX + PK(2)));
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(PK(1)==0x52) {
                     uintptr_t nextaddr = is32bits?(*(ptr_t*)from_ptrv(R_EDX + PK(2))):(*(uintptr_t*)(R_RDX + PK(2)));
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 } else if(is32bits && PK(1)==0x10) {
                     uintptr_t nextaddr = *(ptr_t*)from_ptrv(R_EAX);
                     printf_log_prefix(0, LOG_NONE, " => %p", (void*)nextaddr);
-                    printFunctionAddr(nextaddr, "=> ");
+                    PrintFunctionAddr(nextaddr, "=> ");
                 }
 
             }
diff --git a/src/emu/x64run_private.h b/src/emu/x64run_private.h
index e7645a87..d4ff67c5 100644
--- a/src/emu/x64run_private.h
+++ b/src/emu/x64run_private.h
@@ -5,6 +5,7 @@
 #include "regs.h"
 #include "x64emu_private.h"
 #include "box64context.h"
+#include "symbolfuncs.h"
 
 typedef struct rex_s {
     union {
diff --git a/src/include/box64context.h b/src/include/box64context.h
index 97c410ad..a3d651d2 100644
--- a/src/include/box64context.h
+++ b/src/include/box64context.h
@@ -278,8 +278,6 @@ void thread_set_emu(x64emu_t* emu);
 void thread_forget_emu();
 x64emu_t* thread_get_emu(void);
 
-// unlock mutex that are locked by current thread (for signal handling). Return a mask of unlock mutex
-int unlockMutex(void);
 // relock the muxtex that were unlocked
 void relockMutex(int locks);
 
diff --git a/src/include/custommem.h b/src/include/custommem.h
index 5e883570..c9db05dc 100644
--- a/src/include/custommem.h
+++ b/src/include/custommem.h
@@ -118,8 +118,6 @@ void* find47bitBlockElf(size_t size, int mainbin, uintptr_t mask);
 void* find31bitBlockElf(size_t size, int mainbin, uintptr_t mask);
 int isBlockFree(void* hint, size_t size);
 
-// unlock mutex that are locked by current thread (for signal handling). Return a mask of unlock mutex
-int unlockCustommemMutex(void);
 // relock the muxtex that were unlocked
 void relockCustommemMutex(int locks);
 
diff --git a/src/include/debug.h b/src/include/debug.h
index 93268420..be216bd1 100644
--- a/src/include/debug.h
+++ b/src/include/debug.h
@@ -3,6 +3,8 @@
 #include <stdint.h>
 #include <env.h>
 
+#include "os.h"
+
 typedef struct box64context_s box64context_t;
 extern box64env_t box64env;
 extern box64env_t* cur_box64env;
diff --git a/src/include/mysignal.h b/src/include/mysignal.h
index 8d4f84a6..22861634 100644
--- a/src/include/mysignal.h
+++ b/src/include/mysignal.h
@@ -11,6 +11,8 @@ typedef struct {
 typedef sigset_t __sigset_t;
 
 #define sigfillset(x)
+
+#define SIGTRAP 5
 #endif
 
 #endif // __MYSIGNAL_H_
\ No newline at end of file
diff --git a/src/include/symbolfuncs.h b/src/include/symbolfuncs.h
new file mode 100644
index 00000000..ba99f923
--- /dev/null
+++ b/src/include/symbolfuncs.h
@@ -0,0 +1,8 @@
+#ifndef __SYMBOLFUNCS_H__
+#define __SYMBOLFUNCS_H__
+
+#include <stdint.h>
+
+int PrintFunctionAddr(uintptr_t nextaddr, const char* text); // 0 if nothing was found
+
+#endif // __SYMBOLFUNCS_H__
\ No newline at end of file
diff --git a/src/include/x64emu.h b/src/include/x64emu.h
index e06620af..4b88f6ae 100644
--- a/src/include/x64emu.h
+++ b/src/include/x64emu.h
@@ -34,7 +34,6 @@ 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)
 
-int printFunctionAddr(uintptr_t nextaddr, const char* text); // 0 if nothing was found
 const char* getAddrFunctionName(uintptr_t addr);
 
 #endif //__X86EMU_H_
diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c
index b8f8b37d..84010c23 100644
--- a/src/libtools/signal32.c
+++ b/src/libtools/signal32.c
@@ -465,6 +465,9 @@ void convert_siginfo_to_32(void* d, void* s, int sig)
         dst->_sifields._sigchld.__si_utime = src->si_utime;
     }
 }
+
+void relockMutex(int locks);
+
 int write_opcode(uintptr_t rip, uintptr_t native_ip, int is32bits);
 #define is_memprot_locked (1<<1)
 #define is_dyndump_locked (1<<8)
diff --git a/src/libtools/signals.c b/src/libtools/signals.c
index 99ddd41e..c85c4401 100644
--- a/src/libtools/signals.c
+++ b/src/libtools/signals.c
@@ -1069,6 +1069,51 @@ int sigbus_specialcases(siginfo_t* info, void * ucntx, void* pc, void* _fpsimd,
 #undef CHECK
 }
 
+#ifdef USE_CUSTOM_MUTEX
+extern uint32_t mutex_prot;
+extern uint32_t mutex_blocks;
+#else
+extern pthread_mutex_t mutex_prot;
+extern pthread_mutex_t mutex_blocks;
+#endif
+
+// unlock mutex that are locked by current thread (for signal handling). Return a mask of unlock mutex
+int unlockMutex()
+{
+    int ret = 0;
+    int i;
+    #ifdef USE_CUSTOM_MUTEX
+    uint32_t tid = (uint32_t)GetTID();
+    #define GO(A, B)                                    \
+    i = (native_lock_storeifref2_d(&A, 0, tid) == tid); \
+    if (i) {                                            \
+        ret |= (1 << B);                                \
+    }
+    #else
+    #define GO(A, B)          \
+    i = checkUnlockMutex(&A); \
+    if (i) {                  \
+        ret |= (1 << B);      \
+    }
+    #endif
+
+    GO(mutex_blocks, 0)
+    GO(mutex_prot, 1)
+
+    GO(my_context->mutex_trace, 7)
+    #ifdef DYNAREC
+    GO(my_context->mutex_dyndump, 8)
+    #else
+    GO(my_context->mutex_lock, 8)
+    #endif
+    GO(my_context->mutex_tls, 9)
+    GO(my_context->mutex_thread, 10)
+    GO(my_context->mutex_bridge, 11)
+    #undef GO
+
+    return ret;
+}
+
 #ifdef BOX32
 void my_sigactionhandler_oldcode_32(x64emu_t* emu, int32_t sig, int simple, siginfo_t* info, void * ucntx, int* old_code, void* cur_db);
 #endif
diff --git a/src/os/os_wine.c b/src/os/os_wine.c
index 6f6eaf38..baafc669 100644
--- a/src/os/os_wine.c
+++ b/src/os/os_wine.c
@@ -12,6 +12,11 @@ int SchedYield(void)
     return SwitchToThread();
 }
 
+int IsBridgeSignature(char s, char c)
+{
+    return FALSE;
+}
+
 void PersonalityAddrLimit32Bit(void) { }
 
 ULONG_PTR default_zero_bits32 = 0x7fffffff;
diff --git a/src/os/symbolfuncs_linux.c b/src/os/symbolfuncs_linux.c
new file mode 100644
index 00000000..7fa11705
--- /dev/null
+++ b/src/os/symbolfuncs_linux.c
@@ -0,0 +1,20 @@
+#include "symbolfuncs.h"
+#include "elfloader.h"
+#include "debug.h"
+#include "box64context.h"
+
+int 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_prefix(0, LOG_NONE, " (%s%s:%s)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname);
+        else
+            printf_log_prefix(0, LOG_NONE, " (%s%s:%s + 0x%lx)", text, ElfName(FindElfAddress(my_context, nextaddr)), symbname, nextaddr - start);
+        return 1;
+    }
+    return 0;
+}
diff --git a/src/os/symbolfuncs_wine.c b/src/os/symbolfuncs_wine.c
new file mode 100644
index 00000000..69533e00
--- /dev/null
+++ b/src/os/symbolfuncs_wine.c
@@ -0,0 +1,6 @@
+#include "symbolfuncs.h"
+
+int PrintFunctionAddr(uintptr_t nextaddr, const char* text)
+{
+    return 0;
+}