about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-02-09 20:46:46 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-02-09 20:46:46 +0100
commitd0039c65b47f3c7b0ca28b44b9124e8b19fc9bf3 (patch)
tree3c8a2c1666b7176c82951cfb11b3f606c4526763 /src
parent099bd148cbb4b8ad11fe8f099701d9f4056ccd2a (diff)
downloadbox64-d0039c65b47f3c7b0ca28b44b9124e8b19fc9bf3.tar.gz
box64-d0039c65b47f3c7b0ca28b44b9124e8b19fc9bf3.zip
[DYNAREC] Fixed inst_size building that could be wrong when dynablock was stopped for unknown opcode or other various reason
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass0.h1
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass2.h2
-rw-r--r--src/dynarec/arm64/dynarec_arm64_pass3.h2
-rw-r--r--src/dynarec/la64/dynarec_la64_pass0.h5
-rw-r--r--src/dynarec/la64/dynarec_la64_pass2.h2
-rw-r--r--src/dynarec/la64/dynarec_la64_pass3.h6
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass0.h5
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass2.h2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_pass3.h6
9 files changed, 17 insertions, 14 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_pass0.h b/src/dynarec/arm64/dynarec_arm64_pass0.h
index a88fbfa2..391405ef 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass0.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass0.h
@@ -39,6 +39,7 @@
 #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", \
diff --git a/src/dynarec/arm64/dynarec_arm64_pass2.h b/src/dynarec/arm64/dynarec_arm64_pass2.h
index dbb129ff..0975908e 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass2.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass2.h
@@ -2,7 +2,7 @@
 #define FINI                                                                                            \
         if(ninst) {                                                                                     \
                 dyn->insts[ninst].address = (dyn->insts[ninst-1].address+dyn->insts[ninst-1].size);     \
-                dyn->insts_size += 1+((dyn->insts[ninst].x64.size>(dyn->insts[ninst].size/4))?dyn->insts[ninst].x64.size:(dyn->insts[ninst].size/4))/15; \
+                dyn->insts_size += 1+((dyn->insts[ninst-1].x64.size>(dyn->insts[ninst-1].size/4))?dyn->insts[ninst-1].x64.size:(dyn->insts[ninst-1].size/4))/15; \
         }
 
 #define MESSAGE(A, ...) do {} while (0)
diff --git a/src/dynarec/arm64/dynarec_arm64_pass3.h b/src/dynarec/arm64/dynarec_arm64_pass3.h
index 6bfad31c..a152241c 100644
--- a/src/dynarec/arm64/dynarec_arm64_pass3.h
+++ b/src/dynarec/arm64/dynarec_arm64_pass3.h
@@ -1,7 +1,7 @@
 #define INIT    
 #define FINI        \
     if(ninst)       \
-        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst].x64.size, dyn->insts[ninst].size/4); \
+        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \
     addInst(dyn->instsize, &dyn->insts_size, 0, 0);
 #define EMIT(A)                                         \
     do{                                                 \
diff --git a/src/dynarec/la64/dynarec_la64_pass0.h b/src/dynarec/la64/dynarec_la64_pass0.h
index 8c188226..0cd07b84 100644
--- a/src/dynarec/la64/dynarec_la64_pass0.h
+++ b/src/dynarec/la64/dynarec_la64_pass0.h
@@ -54,7 +54,8 @@
 #define DEFAULT                                                                                                                                     \
     --dyn->size;                                                                                                                                    \
     *ok = -1;                                                                                                                                       \
-    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing)==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),                                                                                                                                \
@@ -64,5 +65,5 @@
             PKip(10), PKip(11), PKip(12),                                                                                                           \
             PKip(13), PKip(14));                                                                                                                    \
         printFunctionAddr(ip, " => ");                                                                                                              \
-        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                                \
+        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                      \
     }
diff --git a/src/dynarec/la64/dynarec_la64_pass2.h b/src/dynarec/la64/dynarec_la64_pass2.h
index 38c16466..0d09b87d 100644
--- a/src/dynarec/la64/dynarec_la64_pass2.h
+++ b/src/dynarec/la64/dynarec_la64_pass2.h
@@ -2,7 +2,7 @@
 #define FINI                                                                                                                                                   \
     if (ninst) {                                                                                                                                               \
         dyn->insts[ninst].address = (dyn->insts[ninst - 1].address + dyn->insts[ninst - 1].size);                                                              \
-        dyn->insts_size += 1 + ((dyn->insts[ninst].x64.size > (dyn->insts[ninst].size / 4)) ? dyn->insts[ninst].x64.size : (dyn->insts[ninst].size / 4)) / 15; \
+        dyn->insts_size += 1+((dyn->insts[ninst-1].x64.size>(dyn->insts[ninst-1].size/4))?dyn->insts[ninst-1].x64.size:(dyn->insts[ninst-1].size/4))/15;       \
     }
 
 #define MESSAGE(A, ...) do {} while (0)
diff --git a/src/dynarec/la64/dynarec_la64_pass3.h b/src/dynarec/la64/dynarec_la64_pass3.h
index 193f33be..622aad75 100644
--- a/src/dynarec/la64/dynarec_la64_pass3.h
+++ b/src/dynarec/la64/dynarec_la64_pass3.h
@@ -1,7 +1,7 @@
 #define INIT
-#define FINI                                                                                              \
-    if (ninst)                                                                                            \
-        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst].x64.size, dyn->insts[ninst].size / 4); \
+#define FINI                                                                                                \
+    if (ninst)                                                                                              \
+        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \
     addInst(dyn->instsize, &dyn->insts_size, 0, 0);
 #define EMIT(A)                                                          \
     do {                                                                 \
diff --git a/src/dynarec/rv64/dynarec_rv64_pass0.h b/src/dynarec/rv64/dynarec_rv64_pass0.h
index beb9a7c4..d4d7b67f 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass0.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass0.h
@@ -73,7 +73,8 @@
 #define DEFAULT                                                                                                                                     \
     --dyn->size;                                                                                                                                    \
     *ok = -1;                                                                                                                                       \
-    if (BOX64ENV(dynarec_log) >= LOG_INFO || BOX64ENV(dynarec_dump) || BOX64ENV(dynarec_missing) == 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),                                                                                                                                \
@@ -83,7 +84,7 @@
             PKip(10), PKip(11), PKip(12),                                                                                                           \
             PKip(13), PKip(14));                                                                                                                    \
         printFunctionAddr(ip, " => ");                                                                                                              \
-        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                                \
+        dynarec_log_prefix(0, LOG_NONE, "\n");                                                                                                      \
     }
 
 #define SET_ELEMENT_WIDTH(s1, sew, set)                    \
diff --git a/src/dynarec/rv64/dynarec_rv64_pass2.h b/src/dynarec/rv64/dynarec_rv64_pass2.h
index 5a5665bc..2a535598 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass2.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass2.h
@@ -2,7 +2,7 @@
 #define FINI                                                                                                                                                   \
     if (ninst) {                                                                                                                                               \
         dyn->insts[ninst].address = (dyn->insts[ninst - 1].address + dyn->insts[ninst - 1].size);                                                              \
-        dyn->insts_size += 1 + ((dyn->insts[ninst].x64.size > (dyn->insts[ninst].size / 4)) ? dyn->insts[ninst].x64.size : (dyn->insts[ninst].size / 4)) / 15; \
+        dyn->insts_size += 1+((dyn->insts[ninst-1].x64.size>(dyn->insts[ninst-1].size/4))?dyn->insts[ninst-1].x64.size:(dyn->insts[ninst-1].size/4))/15;       \
     }
 
 #define MESSAGE(A, ...) \
diff --git a/src/dynarec/rv64/dynarec_rv64_pass3.h b/src/dynarec/rv64/dynarec_rv64_pass3.h
index 781c69e9..e0290d50 100644
--- a/src/dynarec/rv64/dynarec_rv64_pass3.h
+++ b/src/dynarec/rv64/dynarec_rv64_pass3.h
@@ -1,7 +1,7 @@
 #define INIT
-#define FINI                                                                                              \
-    if (ninst)                                                                                            \
-        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst].x64.size, dyn->insts[ninst].size / 4); \
+#define FINI                                                                                                \
+    if (ninst)                                                                                              \
+        addInst(dyn->instsize, &dyn->insts_size, dyn->insts[ninst-1].x64.size, dyn->insts[ninst-1].size/4); \
     addInst(dyn->instsize, &dyn->insts_size, 0, 0);
 #define EMIT(A)                                                        \
     do {                                                               \