diff options
Diffstat (limited to 'src/emu/x64run_private.c')
| -rw-r--r-- | src/emu/x64run_private.c | 62 |
1 files changed, 23 insertions, 39 deletions
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, "=> "); } } |