From b79ba11d95bdfdbcaa3edd636aec86a49c2113fc Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 5 Jan 2025 14:59:59 +0100 Subject: [DYNAREC] Imroved log on signal and flags/sse info gathering. [ARM64_DYNAREC] Fixed some case of nat flags being incorectly used --- src/libtools/signal32.c | 41 ------------ src/libtools/signals.c | 166 +++++++++++------------------------------------- 2 files changed, 36 insertions(+), 171 deletions(-) (limited to 'src/libtools') diff --git a/src/libtools/signal32.c b/src/libtools/signal32.c index fc07d8aa..c2d37b3e 100644 --- a/src/libtools/signal32.c +++ b/src/libtools/signal32.c @@ -562,47 +562,6 @@ void my_sigactionhandler_oldcode_32(x64emu_t* emu, int32_t sig, int simple, sigi sigcontext->uc_mcontext.gregs[I386_SS] = R_SS; sigcontext->uc_mcontext.gregs[I386_FS] = R_FS; sigcontext->uc_mcontext.gregs[I386_GS] = R_GS; -#if defined(DYNAREC) -#if defined(ARM64) - if(db && p) { - sigcontext->uc_mcontext.gregs[I386_EAX] = p->uc_mcontext.regs[10]; - sigcontext->uc_mcontext.gregs[I386_ECX] = p->uc_mcontext.regs[11]; - sigcontext->uc_mcontext.gregs[I386_EDX] = p->uc_mcontext.regs[12]; - sigcontext->uc_mcontext.gregs[I386_EBX] = p->uc_mcontext.regs[13]; - sigcontext->uc_mcontext.gregs[I386_ESP] = p->uc_mcontext.regs[14]; - sigcontext->uc_mcontext.gregs[I386_EBP] = p->uc_mcontext.regs[15]; - sigcontext->uc_mcontext.gregs[I386_ESI] = p->uc_mcontext.regs[16]; - sigcontext->uc_mcontext.gregs[I386_EDI] = p->uc_mcontext.regs[17]; - sigcontext->uc_mcontext.gregs[I386_EIP] = getX64Address(db, (uintptr_t)pc); - } -#elif defined(LA64) - if(db && p) { - sigcontext->uc_mcontext.gregs[I386_EAX] = p->uc_mcontext.__gregs[12]; - sigcontext->uc_mcontext.gregs[I386_ECX] = p->uc_mcontext.__gregs[13]; - sigcontext->uc_mcontext.gregs[I386_EDX] = p->uc_mcontext.__gregs[14]; - sigcontext->uc_mcontext.gregs[I386_EBX] = p->uc_mcontext.__gregs[15]; - sigcontext->uc_mcontext.gregs[I386_ESP] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[I386_EBP] = p->uc_mcontext.__gregs[17]; - sigcontext->uc_mcontext.gregs[I386_ESI] = p->uc_mcontext.__gregs[18]; - sigcontext->uc_mcontext.gregs[I386_EDI] = p->uc_mcontext.__gregs[19]; - sigcontext->uc_mcontext.gregs[I386_EIP] = getX64Address(db, (uintptr_t)pc); - } -#elif defined(RV64) - if(db && p) { - sigcontext->uc_mcontext.gregs[I386_EAX] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[I386_ECX] = p->uc_mcontext.__gregs[13]; - sigcontext->uc_mcontext.gregs[I386_EDX] = p->uc_mcontext.__gregs[12]; - sigcontext->uc_mcontext.gregs[I386_EBX] = p->uc_mcontext.__gregs[24]; - sigcontext->uc_mcontext.gregs[I386_ESP] = p->uc_mcontext.__gregs[9]; - sigcontext->uc_mcontext.gregs[I386_EBP] = p->uc_mcontext.__gregs[8]; - sigcontext->uc_mcontext.gregs[I386_ESI] = p->uc_mcontext.__gregs[11]; - sigcontext->uc_mcontext.gregs[I386_EDI] = p->uc_mcontext.__gregs[10]; - sigcontext->uc_mcontext.gregs[I386_EIP] = getX64Address(db, (uintptr_t)pc); - } -#else -#error Unsupported architecture -#endif -#endif // get FloatPoint status sigcontext->uc_mcontext.fpregs = to_ptrv(xstate);//(struct x64_libc_fpstate*)&sigcontext->xstate; fpu_xsave_mask(emu, xstate, 1, 0b111); diff --git a/src/libtools/signals.c b/src/libtools/signals.c index a61ef4b6..b5da1833 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -611,41 +611,41 @@ void copyUCTXreg2Emu(x64emu_t* emu, ucontext_t* p, uintptr_t ip) { emu->ip.q[0] = ip; emu->eflags.x64 = p->uc_mcontext.regs[26]; #elif defined(LA64) - emu->regs[_AX].q[0] = p->uc_mcontext.__gregs[12]; - emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[13]; - emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[14]; - emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[15]; - emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[16]; - emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[17]; - emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[18]; - emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[19]; - emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[23]; - emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[24]; - emu->regs[_R10].q[0] = p->uc_mcontext.__gregs[25]; - emu->regs[_R11].q[0] = p->uc_mcontext.__gregs[26]; - emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[27]; - emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[28]; - emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[29]; - emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[30]; - emu->ip.q[0] = ip; - emu->eflags.x64 = p->uc_mcontext.__gregs[31]; + emu->regs[_AX].q[0] = p->uc_mcontext.__gregs[12]; + emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[13]; + emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[14]; + emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[15]; + emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[16]; + emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[17]; + emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[18]; + emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[19]; + emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[23]; + emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[24]; + emu->regs[_R10].q[0] = p->uc_mcontext.__gregs[25]; + emu->regs[_R11].q[0] = p->uc_mcontext.__gregs[26]; + emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[27]; + emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[28]; + emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[29]; + emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[30]; + emu->ip.q[0] = ip; + emu->eflags.x64 = p->uc_mcontext.__gregs[31]; #elif defined(RV64) - emu->regs[_AX].q[0] = p->uc_mcontext.__gregs[16]; - emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[13]; - emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[12]; - emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[24]; - emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[9]; - emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[8]; - emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[11]; - emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[10]; - emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[14]; - emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[15]; - emu->regs[_R10].q[0] = p->uc_mcontext.__gregs[26]; - emu->regs[_R11].q[0] = p->uc_mcontext.__gregs[27]; - emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[18]; - emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[19]; - emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[20]; - emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[21]; + emu->regs[_AX].q[0] = p->uc_mcontext.__gregs[16]; + emu->regs[_CX].q[0] = p->uc_mcontext.__gregs[13]; + emu->regs[_DX].q[0] = p->uc_mcontext.__gregs[12]; + emu->regs[_BX].q[0] = p->uc_mcontext.__gregs[24]; + emu->regs[_SP].q[0] = p->uc_mcontext.__gregs[9]; + emu->regs[_BP].q[0] = p->uc_mcontext.__gregs[8]; + emu->regs[_SI].q[0] = p->uc_mcontext.__gregs[11]; + emu->regs[_DI].q[0] = p->uc_mcontext.__gregs[10]; + emu->regs[_R8].q[0] = p->uc_mcontext.__gregs[14]; + emu->regs[_R9].q[0] = p->uc_mcontext.__gregs[15]; + emu->regs[_R10].q[0] = p->uc_mcontext.__gregs[26]; + emu->regs[_R11].q[0] = p->uc_mcontext.__gregs[27]; + emu->regs[_R12].q[0] = p->uc_mcontext.__gregs[18]; + emu->regs[_R13].q[0] = p->uc_mcontext.__gregs[19]; + emu->regs[_R14].q[0] = p->uc_mcontext.__gregs[20]; + emu->regs[_R15].q[0] = p->uc_mcontext.__gregs[21]; emu->ip.q[0] = ip; emu->eflags.x64 = p->uc_mcontext.__gregs[23]; #else @@ -1047,76 +1047,11 @@ void my_sigactionhandler_oldcode_64(x64emu_t* emu, int32_t sig, int simple, sigi sigcontext->uc_mcontext.gregs[X64_RBP] = R_RBP; sigcontext->uc_mcontext.gregs[X64_RSP] = R_RSP; sigcontext->uc_mcontext.gregs[X64_RBX] = R_RBX; - sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP;//emu->old_ip; // old_ip should be more accurate as the "current" IP, but it's not always up-to-date + sigcontext->uc_mcontext.gregs[X64_RIP] = R_RIP; // flags sigcontext->uc_mcontext.gregs[X64_EFL] = emu->eflags.x64; // get segments sigcontext->uc_mcontext.gregs[X64_CSGSFS] = ((uint64_t)(R_CS)) | (((uint64_t)(R_GS))<<16) | (((uint64_t)(R_FS))<<32); -#if defined(DYNAREC) -#if defined(ARM64) - if(db && p) { - sigcontext->uc_mcontext.gregs[X64_RAX] = p->uc_mcontext.regs[10]; - sigcontext->uc_mcontext.gregs[X64_RCX] = p->uc_mcontext.regs[11]; - sigcontext->uc_mcontext.gregs[X64_RDX] = p->uc_mcontext.regs[12]; - sigcontext->uc_mcontext.gregs[X64_RBX] = p->uc_mcontext.regs[13]; - sigcontext->uc_mcontext.gregs[X64_RSP] = p->uc_mcontext.regs[14]; - sigcontext->uc_mcontext.gregs[X64_RBP] = p->uc_mcontext.regs[15]; - sigcontext->uc_mcontext.gregs[X64_RSI] = p->uc_mcontext.regs[16]; - sigcontext->uc_mcontext.gregs[X64_RDI] = p->uc_mcontext.regs[17]; - sigcontext->uc_mcontext.gregs[X64_R8] = p->uc_mcontext.regs[18]; - sigcontext->uc_mcontext.gregs[X64_R9] = p->uc_mcontext.regs[19]; - sigcontext->uc_mcontext.gregs[X64_R10] = p->uc_mcontext.regs[20]; - sigcontext->uc_mcontext.gregs[X64_R11] = p->uc_mcontext.regs[21]; - sigcontext->uc_mcontext.gregs[X64_R12] = p->uc_mcontext.regs[22]; - sigcontext->uc_mcontext.gregs[X64_R13] = p->uc_mcontext.regs[23]; - sigcontext->uc_mcontext.gregs[X64_R14] = p->uc_mcontext.regs[24]; - sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.regs[25]; - sigcontext->uc_mcontext.gregs[X64_RIP] = getX64Address(db, (uintptr_t)pc); - } -#elif defined(LA64) - if(db && p) { - sigcontext->uc_mcontext.gregs[X64_RAX] = p->uc_mcontext.__gregs[12]; - sigcontext->uc_mcontext.gregs[X64_RCX] = p->uc_mcontext.__gregs[13]; - sigcontext->uc_mcontext.gregs[X64_RDX] = p->uc_mcontext.__gregs[14]; - sigcontext->uc_mcontext.gregs[X64_RBX] = p->uc_mcontext.__gregs[15]; - sigcontext->uc_mcontext.gregs[X64_RSP] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[X64_RBP] = p->uc_mcontext.__gregs[17]; - sigcontext->uc_mcontext.gregs[X64_RSI] = p->uc_mcontext.__gregs[18]; - sigcontext->uc_mcontext.gregs[X64_RDI] = p->uc_mcontext.__gregs[19]; - sigcontext->uc_mcontext.gregs[X64_R8] = p->uc_mcontext.__gregs[23]; - sigcontext->uc_mcontext.gregs[X64_R9] = p->uc_mcontext.__gregs[24]; - sigcontext->uc_mcontext.gregs[X64_R10] = p->uc_mcontext.__gregs[25]; - sigcontext->uc_mcontext.gregs[X64_R11] = p->uc_mcontext.__gregs[26]; - sigcontext->uc_mcontext.gregs[X64_R12] = p->uc_mcontext.__gregs[27]; - sigcontext->uc_mcontext.gregs[X64_R13] = p->uc_mcontext.__gregs[28]; - sigcontext->uc_mcontext.gregs[X64_R14] = p->uc_mcontext.__gregs[29]; - sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.__gregs[30]; - sigcontext->uc_mcontext.gregs[X64_RIP] = getX64Address(db, (uintptr_t)pc); - } -#elif defined(RV64) - if(db && p) { - sigcontext->uc_mcontext.gregs[X64_RAX] = p->uc_mcontext.__gregs[16]; - sigcontext->uc_mcontext.gregs[X64_RCX] = p->uc_mcontext.__gregs[13]; - sigcontext->uc_mcontext.gregs[X64_RDX] = p->uc_mcontext.__gregs[12]; - sigcontext->uc_mcontext.gregs[X64_RBX] = p->uc_mcontext.__gregs[24]; - sigcontext->uc_mcontext.gregs[X64_RSP] = p->uc_mcontext.__gregs[9]; - sigcontext->uc_mcontext.gregs[X64_RBP] = p->uc_mcontext.__gregs[8]; - sigcontext->uc_mcontext.gregs[X64_RSI] = p->uc_mcontext.__gregs[11]; - sigcontext->uc_mcontext.gregs[X64_RDI] = p->uc_mcontext.__gregs[10]; - sigcontext->uc_mcontext.gregs[X64_R8] = p->uc_mcontext.__gregs[14]; - sigcontext->uc_mcontext.gregs[X64_R9] = p->uc_mcontext.__gregs[15]; - sigcontext->uc_mcontext.gregs[X64_R10] = p->uc_mcontext.__gregs[26]; - sigcontext->uc_mcontext.gregs[X64_R11] = p->uc_mcontext.__gregs[27]; - sigcontext->uc_mcontext.gregs[X64_R12] = p->uc_mcontext.__gregs[18]; - sigcontext->uc_mcontext.gregs[X64_R13] = p->uc_mcontext.__gregs[19]; - sigcontext->uc_mcontext.gregs[X64_R14] = p->uc_mcontext.__gregs[20]; - sigcontext->uc_mcontext.gregs[X64_R15] = p->uc_mcontext.__gregs[21]; - sigcontext->uc_mcontext.gregs[X64_RIP] = getX64Address(db, (uintptr_t)pc); - } -#else -#error Unsupported architecture -#endif -#endif if(R_CS==0x23) { // trucate regs to 32bits, just in case #define GO(R) sigcontext->uc_mcontext.gregs[X64_R##R]&=0xFFFFFFFF @@ -1571,36 +1506,7 @@ void my_box64signalhandler(int32_t sig, siginfo_t* info, void * ucntx) adjustregs(emu); if(db && db->arch_size) ARCH_ADJUST(db, emu, p, x64pc); -#ifdef ARM64 - //TODO: Need proper SIMD/x87 register traking! - /*if(fpsimd) { - emu->xmm[0].u128 = fpsimd->vregs[0]; - emu->xmm[1].u128 = fpsimd->vregs[1]; - emu->xmm[2].u128 = fpsimd->vregs[2]; - emu->xmm[3].u128 = fpsimd->vregs[3]; - }*/ -#elif defined(LA64) - /*if(fpsimd) { - emu->xmm[0].u128 = fpsimd->vregs[0]; - emu->xmm[1].u128 = fpsimd->vregs[1]; - emu->xmm[2].u128 = fpsimd->vregs[2]; - emu->xmm[3].u128 = fpsimd->vregs[3]; - }*/ -#elif defined(RV64) - /*if(fpsimd) { - emu->xmm[0].u128 = fpsimd->vregs[0]; - emu->xmm[1].u128 = fpsimd->vregs[1]; - emu->xmm[2].u128 = fpsimd->vregs[2]; - emu->xmm[3].u128 = fpsimd->vregs[3]; - }*/ -#else -#error Unsupported architecture -#endif - if(addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size)) { - dynarec_log(LOG_INFO, "Auto-SMC detected, getting out of current Dynablock (%p, x64addr=%p, need_test=%d/%d/%d)!\n", db, db->x64_addr, db_need_test, db->dirty, db->always_test); - } else { - dynarec_log(LOG_INFO, "Dynablock (%p, x64addr=%p, need_test=%d/%d/%d) unprotected, getting out at %p (%p)!\n", db, db->x64_addr, db_need_test, db->dirty, db->always_test, (void*)R_RIP, (void*)addr); - } + dynarec_log(LOG_INFO, "Dynablock (%p, x64addr=%p, need_test=%d/%d/%d) %s, getting out at %p (%p)!\n", db, db->x64_addr, db_need_test, db->dirty, db->always_test, (addr>=db->x64_addr && addr<(db->x64_addr+db->x64_size))?"Auto-SMC":"unprotected", (void*)R_RIP, (void*)addr); //relockMutex(Locks); unlock_signal(); if(Locks & is_dyndump_locked) -- cgit 1.4.1