about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorYang Liu <liuyang22@iscas.ac.cn>2025-02-17 20:46:07 +0800
committerGitHub <noreply@github.com>2025-02-17 13:46:07 +0100
commit040f8d9a9f84a43bac88a7614711b442cc750519 (patch)
treeec7a2e4531864d4504f67ed23d16c1cb981ae48f /src
parentf107321d0678f94893f22f83aee582d50bfd90a9 (diff)
downloadbox64-040f8d9a9f84a43bac88a7614711b442cc750519.tar.gz
box64-040f8d9a9f84a43bac88a7614711b442cc750519.zip
[DYNAREC] Print decoded instruction mnemonics for missing opcodes if trace enabled (#2373)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h36
-rw-r--r--src/dynarec/la64/dynarec_la64_pass0.h31
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h31
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass3.h28
4 files changed, 65 insertions, 61 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index 37cc7a3f..a645762f 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -34,25 +34,27 @@
         if(dyn->insts[ninst].nat_flags_op==NAT_FLAG_OP_TOUCH && !dyn->insts[ninst].set_nat_flags)       \
                 dyn->insts[ninst].nat_flags_op=NAT_FLAG_OP_UNUSABLE;                                    \
         dyn->insts[ninst].x64.has_next = (ok>0)?1:0;
-#define INST_NAME(name) 
-#define DEFAULT                         \
-        --dyn->size;                    \
-        *ok = -1;                       \
-        if(ninst) {dyn->insts[ninst-1].x64.size = ip - dyn->insts[ninst-1].x64.addr;}   \
-        if(BOX64ENV(dynarec_log)>=LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing)==1) \
-        if(!dyn->size || BOX64ENV(dynarec_log)>LOG_INFO || BOX64ENV(dynarec_dump)) {\
-        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
-        (void*)ip, rex.is32bits?"x86 ":"x64 ",\
-        PKip(0),                        \
-        PKip(1), PKip(2), PKip(3),      \
-        PKip(4), PKip(5), PKip(6),      \
-        PKip(7), PKip(8), PKip(9),      \
-        PKip(10),PKip(11),PKip(12),     \
-        PKip(13),PKip(14));             \
-        printFunctionAddr(ip, " => ");  \
-        dynarec_log_prefix(0, LOG_NONE, "\n"); \
+#define INST_NAME(name)
+#define DEFAULT                                                                                                               \
+    --dyn->size;                                                                                                              \
+    *ok = -1;                                                                                                                 \
+    if (ninst) { dyn->insts[ninst - 1].x64.size = ip - dyn->insts[ninst - 1].x64.addr; }                                      \
+    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 1)                        \
+        if (!dyn->size || BOX64ENV(dynarec_log) > LOG_INFO || BOX64ENV(dynarec_dump)) {                                       \
+            dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64");      \
+            zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec;                                            \
+            if (dec) {                                                                                                        \
+                dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1));                    \
+            } else {                                                                                                          \
+                dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
+                    PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
+                    PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
+            }                                                                                                                 \
+            printFunctionAddr(ip, " => ");                                                                                    \
+            dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
         }
 
+
 #define FEMIT(A)        dyn->insts[ninst].nat_flags_op = dyn->insts[ninst].x64.set_flags?NAT_FLAG_OP_TOUCH:NAT_FLAG_OP_UNUSABLE
 #define IFNATIVE(A)     if(mark_natflag(dyn, ninst, A, 0))
 #define IFNATIVEN(A)    if(mark_natflag(dyn, ninst, A, 0))
diff --git a/src/dynarec/la64/dynarec_la64_pass0.h b/src/dynarec/la64/dynarec_la64_pass0.h
index 0cd07b84..0faffcaa 100644
--- a/src/dynarec/la64/dynarec_la64_pass0.h
+++ b/src/dynarec/la64/dynarec_la64_pass0.h
@@ -51,19 +51,20 @@
     dyn->insts[ninst].lsx = dyn->lsx;  \
     dyn->insts[ninst].x64.has_next = (ok > 0) ? 1 : 0;
 #define INST_NAME(name)
-#define DEFAULT                                                                                                                                     \
-    --dyn->size;                                                                                                                                    \
-    *ok = -1;                                                                                                                                       \
-    if(ninst) {dyn->insts[ninst-1].x64.size = ip - dyn->insts[ninst-1].x64.addr;}                                                                   \
-    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing)==1) {                                              \
-        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
-            (void*)ip, rex.is32bits ? "32bits " : "",                                                                                               \
-            PKip(0),                                                                                                                                \
-            PKip(1), PKip(2), PKip(3),                                                                                                              \
-            PKip(4), PKip(5), PKip(6),                                                                                                              \
-            PKip(7), PKip(8), PKip(9),                                                                                                              \
-            PKip(10), PKip(11), PKip(12),                                                                                                           \
-            PKip(13), PKip(14));                                                                                                                    \
-        printFunctionAddr(ip, " => ");                                                                                                              \
-        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                      \
+#define DEFAULT                                                                                                           \
+    --dyn->size;                                                                                                          \
+    *ok = -1;                                                                                                             \
+    if (ninst) { dyn->insts[ninst - 1].x64.size = ip - dyn->insts[ninst - 1].x64.addr; }                                  \
+    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 1) {                  \
+        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64");      \
+        zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec;                                            \
+        if (dec) {                                                                                                        \
+            dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1));                    \
+        } else {                                                                                                          \
+            dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
+                PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
+                PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
+        }                                                                                                                 \
+        printFunctionAddr(ip, " => ");                                                                                    \
+        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
     }
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index d4d7b67f..03ddc933 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -70,21 +70,22 @@
     dyn->insts[ninst].vector_sew_exit = dyn->vector_sew; \
     dyn->insts[ninst].x64.has_next = (ok > 0) ? 1 : 0;
 #define INST_NAME(name)
-#define DEFAULT                                                                                                                                     \
-    --dyn->size;                                                                                                                                    \
-    *ok = -1;                                                                                                                                       \
-    if(ninst) {dyn->insts[ninst-1].x64.size = ip - dyn->insts[ninst-1].x64.addr;}                                                                   \
-    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 1) {                                            \
-        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %sOpcode %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
-            (void*)ip, rex.is32bits ? "32bits " : "",                                                                                               \
-            PKip(0),                                                                                                                                \
-            PKip(1), PKip(2), PKip(3),                                                                                                              \
-            PKip(4), PKip(5), PKip(6),                                                                                                              \
-            PKip(7), PKip(8), PKip(9),                                                                                                              \
-            PKip(10), PKip(11), PKip(12),                                                                                                           \
-            PKip(13), PKip(14));                                                                                                                    \
-        printFunctionAddr(ip, " => ");                                                                                                              \
-        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                      \
+#define DEFAULT                                                                                                           \
+    --dyn->size;                                                                                                          \
+    *ok = -1;                                                                                                             \
+    if (ninst) { dyn->insts[ninst - 1].x64.size = ip - dyn->insts[ninst - 1].x64.addr; }                                  \
+    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 1) {                  \
+        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64");      \
+        zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec;                                            \
+        if (dec) {                                                                                                        \
+            dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1));                    \
+        } else {                                                                                                          \
+            dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
+                PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
+                PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
+        }                                                                                                                 \
+        printFunctionAddr(ip, " => ");                                                                                    \
+        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
     }
 
 #define SET_ELEMENT_WIDTH(s1, sew, set)                    \
diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h
index e0290d50..d3033d05 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass3.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass3.h
@@ -43,18 +43,18 @@
         FLD(A, x1, SPLIT12(val64offset));           \
     }
 
-#define DEFAULT_VECTOR                                                                                       \
-    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 2) {                 \
-        dynarec_log(LOG_NONE, "%p: Dynarec fallback to scalar version because of %sOpcode"                   \
-                              " %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
-            (void*)ip, rex.is32bits ? "x86 " : "x64 ",                                                       \
-            PKip(0),                                                                                         \
-            PKip(1), PKip(2), PKip(3),                                                                       \
-            PKip(4), PKip(5), PKip(6),                                                                       \
-            PKip(7), PKip(8), PKip(9),                                                                       \
-            PKip(10), PKip(11), PKip(12),                                                                    \
-            PKip(13), PKip(14));                                                                             \
-        printFunctionAddr(ip, " => ");                                                                       \
-        dynarec_log(LOG_NONE, "\n");                                                                         \
-    }                                                                                                        \
+#define DEFAULT_VECTOR                                                                                                    \
+    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 2) {                  \
+        dynarec_log(LOG_NONE, "%p: Dynarec stopped because of %s Opcode ", (void*)ip, rex.is32bits ? "x86" : "x64");      \
+        zydis_dec_t* dec = rex.is32bits ? my_context->dec32 : my_context->dec;                                            \
+        if (dec) {                                                                                                        \
+            dynarec_log_prefix(0, LOG_NONE, "%s", DecodeX64Trace(dec, dyn->insts[ninst].x64.addr, 1));                    \
+        } else {                                                                                                          \
+            dynarec_log_prefix(0, LOG_NONE, "%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", \
+                PKip(0), PKip(1), PKip(2), PKip(3), PKip(4), PKip(5), PKip(6), PKip(7), PKip(8), PKip(9),                 \
+                PKip(10), PKip(11), PKip(12), PKip(13), PKip(14));                                                        \
+        }                                                                                                                 \
+        printFunctionAddr(ip, " => ");                                                                                    \
+        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                            \
+    }                                                                                                                     \
     return 0