diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-10 20:09:23 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-10 14:09:23 +0200 |
| commit | 0bb41a73c27df807ba8fcaa205612be7b3a1ac95 (patch) | |
| tree | e789a5ff074bae6d492c6ea19f824cdecc7e3d37 /src | |
| parent | f9f082ee53ae0ab8e12b0c1bf1de339af8b92282 (diff) | |
| download | box64-0bb41a73c27df807ba8fcaa205612be7b3a1ac95.tar.gz box64-0bb41a73c27df807ba8fcaa205612be7b3a1ac95.zip | |
[WOW64] More tweaks towards PE build (#2519)
Diffstat (limited to 'src')
| -rw-r--r-- | src/box64context.c | 33 | ||||
| -rw-r--r-- | src/custommem.c | 38 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass0.h | 2 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 12 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native_functions.c | 6 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_pass0.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass3.h | 2 | ||||
| -rw-r--r-- | src/emu/x64run_private.c | 62 | ||||
| -rw-r--r-- | src/emu/x64run_private.h | 1 | ||||
| -rw-r--r-- | src/include/box64context.h | 2 | ||||
| -rw-r--r-- | src/include/custommem.h | 2 | ||||
| -rw-r--r-- | src/include/debug.h | 2 | ||||
| -rw-r--r-- | src/include/mysignal.h | 2 | ||||
| -rw-r--r-- | src/include/symbolfuncs.h | 8 | ||||
| -rw-r--r-- | src/include/x64emu.h | 1 | ||||
| -rw-r--r-- | src/libtools/signal32.c | 3 | ||||
| -rw-r--r-- | src/libtools/signals.c | 45 | ||||
| -rw-r--r-- | src/os/os_wine.c | 5 | ||||
| -rw-r--r-- | src/os/symbolfuncs_linux.c | 20 | ||||
| -rw-r--r-- | src/os/symbolfuncs_wine.c | 6 |
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; +} |