about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c9
-rw-r--r--src/emu/x64trace.c17
-rw-r--r--src/include/x64trace.h1
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