diff options
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_functions.c | 9 | ||||
| -rw-r--r-- | src/emu/x64trace.c | 17 | ||||
| -rw-r--r-- | src/include/x64trace.h | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c index 763d1812..b6501690 100644 --- a/src/dynarec/arm64/dynarec_arm64_functions.c +++ b/src/dynarec/arm64/dynarec_arm64_functions.c @@ -770,7 +770,14 @@ static register_mapping_t register_mappings[] = { void printf_x64_instruction(dynarec_native_t* dyn, zydis_dec_t* dec, instruction_x64_t* inst, const char* name); void inst_name_pass3(dynarec_native_t* dyn, int ninst, const char* name, rex_t rex) { - if (!dyn->need_dump && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) return; + if (!dyn->need_dump && !BOX64ENV(dynarec_gdbjit) && !BOX64ENV(dynarec_perf_map)) { + /*zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec; + if(dec && !OpcodeOK(dec, dyn->insts[ninst].x64.addr) && !strstr(name, "Illegal")) { + uint8_t* p = (uint8_t*)dyn->insts[ninst].x64.addr; + printf_log(LOG_INFO, "Warning: %p invalid opcode %02x %02x %02x %02x %02x %02x treated as valid\n", p, p[0], p[1], p[2], p[3], p[4], p[5]); + }*/ + return; + } static char buf[4096]; int length = sprintf(buf, "barrier=%d state=%d/%d/%d(%d:%d->%d:%d), %s=%X/%X, use=%X, need=%X/%X, sm=%d(%d/%d/%d)", diff --git a/src/emu/x64trace.c b/src/emu/x64trace.c index 891867f8..65157958 100644 --- a/src/emu/x64trace.c +++ b/src/emu/x64trace.c @@ -238,3 +238,20 @@ const char* DecodeX64Trace(zydis_dec_t* dec, uintptr_t p, int withhex) return buff; #endif } + +int OpcodeOK(zydis_dec_t* dec, uintptr_t p) +{ +#ifndef HAVE_TRACE + return 1; +#else +#ifndef ZYDIS3 + if (ZYAN_SUCCESS(dec->ZydisDecoderDecodeFull(&dec->decoder, (char*)p, 15, + &dec->instruction, dec->operands))) +#else + if (ZYAN_SUCCESS(dec->ZydisDecoderDecodeBuffer(&dec->decoder, (char*)p, 15, + &dec->instruction))) +#endif + return 1; + return 0; +#endif +} diff --git a/src/include/x64trace.h b/src/include/x64trace.h index 9a1f20a2..74e092dc 100644 --- a/src/include/x64trace.h +++ b/src/include/x64trace.h @@ -14,5 +14,6 @@ zydis_dec_t* InitX64TraceDecoder(box64context_t *context); void DeleteX64TraceDecoder(zydis_dec_t **dec); const char* DecodeX64Trace(zydis_dec_t* dec, uintptr_t p, int withhex); +int OpcodeOK(zydis_dec_t* dec, uintptr_t p); #endif //__X64TRACE_H_ \ No newline at end of file |