diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-02-09 20:46:46 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-02-09 20:46:46 +0100 |
| commit | d0039c65b47f3c7b0ca28b44b9124e8b19fc9bf3 (patch) | |
| tree | 3c8a2c1666b7176c82951cfb11b3f606c4526763 /src | |
| parent | 099bd148cbb4b8ad11fe8f099701d9f4056ccd2a (diff) | |
| download | box64-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.h | 1 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass2.h | 2 | ||||
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_pass3.h | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_pass0.h | 5 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_pass2.h | 2 | ||||
| -rw-r--r-- | src/dynarec/la64/dynarec_la64_pass3.h | 6 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass0.h | 5 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass2.h | 2 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_pass3.h | 6 |
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 { \ |