diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-05 14:59:59 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-05 14:59:59 +0100 |
| commit | b79ba11d95bdfdbcaa3edd636aec86a49c2113fc (patch) | |
| tree | bcb0a5ec134107e5236a633db3ecdabb70541d68 /src/dynarec | |
| parent | 5a35184ba7d01636323eee763717db9f2781ff5a (diff) | |
| download | box64-b79ba11d95bdfdbcaa3edd636aec86a49c2113fc.tar.gz box64-b79ba11d95bdfdbcaa3edd636aec86a49c2113fc.zip | |
[DYNAREC] Imroved log on signal and flags/sse info gathering. [ARM64_DYNAREC] Fixed some case of nat flags being incorectly used
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_arch.c | 14 | ||||
| -rw-r--r-- | src/dynarec/dynarec.c | 7 | ||||
| -rw-r--r-- | src/dynarec/dynarec_arch.h | 3 | ||||
| -rw-r--r-- | src/dynarec/dynarec_native.c | 3 |
4 files changed, 18 insertions, 9 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_arch.c b/src/dynarec/arm64/dynarec_arm64_arch.c index f9a45425..fae233ce 100644 --- a/src/dynarec/arm64/dynarec_arm64_arch.c +++ b/src/dynarec/arm64/dynarec_arm64_arch.c @@ -157,13 +157,13 @@ void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc) if(!db->arch_size || !db->arch) return; int ninst = getX64AddressInst(db, x64pc); -//printf_log(LOG_INFO, "adjust_arch(...), db=%p, x64pc=%p, nints=%d", db, (void*)x64pc, ninst); + dynarec_log(LOG_INFO, "adjust_arch(...), db=%p, x64pc=%p, nints=%d", db, (void*)x64pc, ninst); if(ninst<0) { -//printf_log(LOG_INFO, "\n"); + dynarec_log(LOG_INFO, "\n"); return; } if(ninst==0) { -//printf_log(LOG_INFO, "\n"); + dynarec_log(LOG_INFO, "\n"); CHECK_FLAGS(emu); return; } @@ -174,14 +174,14 @@ void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc) while(i<ninst-1) { arch = next; i += 1+arch->seq; -//printf_log(LOG_INFO, "[ seq=%d%s%s%s%s%s ] ", arch->seq, arch->flags?" Flags":"", arch->x87?" x87":"", arch->mmx?" MMX":"", arch->sse?" SSE":"", arch->ymm?" YMM":""); + dynarec_log(LOG_INFO, "[ seq=%d%s%s%s%s%s ] ", arch->seq, arch->flags?" Flags":"", arch->x87?" x87":"", arch->mmx?" MMX":"", arch->sse?" SSE":"", arch->ymm?" YMM":""); next = (arch_arch_t*)((uintptr_t)next + sizeof_arch(arch)); } int sz = sizeof(arch_arch_t); if(arch->flags) { arch_flags_t* flags = (arch_flags_t*)((uintptr_t)arch + sz); sz += sizeof(arch_flags_t); -//printf_log(LOG_INFO, " flags[%s-%s%s%s%s] ", flags->defered?"defered":"", flags->nf?"S":"", flags->vf?"O":"", flags->eq?"Z":"", flags->cf?(flags->inv_cf?"C(inv)":"C"):""); + dynarec_log(LOG_INFO, " flags[%s-%s%s%s%s] ", flags->defered?"defered":"", flags->nf?"S":"", flags->vf?"O":"", flags->eq?"Z":"", flags->cf?(flags->inv_cf?"C(inv)":"C"):""); if(flags->defered) { CHECK_FLAGS(emu); //return; @@ -216,7 +216,7 @@ void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc) } if(arch->sse) { arch_sse_t* sse = (arch_sse_t*)((uintptr_t)arch + sz); -//printf_log(LOG_INFO, " sse[%x (fpsimd=%p)] ", sse->sse, fpsimd); + dynarec_log(LOG_INFO, " sse[%x (fpsimd=%p)] ", sse->sse, fpsimd); sz += sizeof(arch_sse_t); for(int i=0; i<16; ++i) if(fpsimd && (sse->sse>>i)&1) { @@ -229,5 +229,5 @@ void adjust_arch(dynablock_t* db, x64emu_t* emu, ucontext_t* p, uintptr_t x64pc) emu->xmm[i].u128 = fpsimd->vregs[idx]; } } -//printf_log(LOG_INFO, "\n"); + dynarec_log(LOG_INFO, "\n"); } \ No newline at end of file diff --git a/src/dynarec/dynarec.c b/src/dynarec/dynarec.c index 1e744b8f..f6e61db8 100644 --- a/src/dynarec/dynarec.c +++ b/src/dynarec/dynarec.c @@ -210,7 +210,12 @@ void DynaRun(x64emu_t* emu) skip = 0; // no block, of block doesn't have DynaRec content (yet, temp is not null) // Use interpreter (should use single instruction step...) - dynarec_log(LOG_DEBUG, "%04d|Running Interpreter @%p, emu=%p\n", GetTID(), (void*)R_RIP, emu); + if(box64_dynarec_log) { + if(ACCESS_FLAG(F_TF)) + dynarec_log(LOG_INFO, "%04d|Running Interpreter @%p, emu=%p because TF is on\n", GetTID(), (void*)R_RIP, emu); + else + dynarec_log(LOG_DEBUG, "%04d|Running Interpreter @%p, emu=%p\n", GetTID(), (void*)R_RIP, emu); + } if(box64_dynarec_test) emu->test.clean = 0; Run(emu, 1); diff --git a/src/dynarec/dynarec_arch.h b/src/dynarec/dynarec_arch.h index edc09650..1b619e1a 100644 --- a/src/dynarec/dynarec_arch.h +++ b/src/dynarec/dynarec_arch.h @@ -28,6 +28,7 @@ #define ARCH_SIZE(A) get_size_arch(A) #define ARCH_FILL(A, B) populate_arch(A, B) #define ARCH_ADJUST(A, B, C, D) adjust_arch(A, B, C, D) +#define STOP_NATIVE_FLAGS(A, B) A->insts[B].nat_flags_op = NAT_FLAG_OP_UNUSABLE #elif defined(LA64) #define instruction_native_t instruction_la64_t @@ -53,6 +54,7 @@ #define ARCH_SIZE(A) 0 #define ARCH_FILL(A, B) {} #define ARCH_ADJUST(A, B, C, D) {} +#define STOP_NATIVE_FLAGS(A, B) {} #elif defined(RV64) #define instruction_native_t instruction_rv64_t @@ -80,6 +82,7 @@ #define ARCH_SIZE(A) 0 #define ARCH_FILL(A, B) {} #define ARCH_ADJUST(A, B, C, D) {} +#define STOP_NATIVE_FLAGS(A, B) {} #else #error Unsupported platform #endif diff --git a/src/dynarec/dynarec_native.c b/src/dynarec/dynarec_native.c index 4ffd1048..36670bf0 100644 --- a/src/dynarec/dynarec_native.c +++ b/src/dynarec/dynarec_native.c @@ -379,9 +379,10 @@ static int updateNeed(dynarec_native_t* dyn, int ninst, uint8_t need) { while (ninst>=0) { // need pending but instruction is only a subset: remove pend and use an X_ALL instead need |= dyn->insts[ninst].x64.need_after; - if((need&X_PEND) && (dyn->insts[ninst].x64.state_flags==SF_SUBSET || dyn->insts[ninst].x64.state_flags==SF_SET || dyn->insts[ninst].x64.state_flags==SF_SET_NODF)) { + if((need&X_PEND) && ((dyn->insts[ninst].x64.state_flags==SF_SUBSET) || (dyn->insts[ninst].x64.state_flags==SF_SET) || (dyn->insts[ninst].x64.state_flags==SF_SET_NODF))) { need &=~X_PEND; need |= X_ALL; + STOP_NATIVE_FLAGS(dyn, ninst); } if((need&X_PEND) && dyn->insts[ninst].x64.state_flags==SF_SUBSET_PENDING) { need |= X_ALL&~(dyn->insts[ninst].x64.set_flags); |