diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-03-08 18:01:33 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-03-08 18:01:33 +0100 |
| commit | 3737abe081c8de2ffb8d4fd10fea01c046c4787b (patch) | |
| tree | 2e01ad5060ebd97aadcb4b9f6654dbc079616cba /src/dynarec | |
| parent | d0013c07007e8aa6e243443961ec2fab9daac624 (diff) | |
| download | box64-3737abe081c8de2ffb8d4fd10fea01c046c4787b.tar.gz box64-3737abe081c8de2ffb8d4fd10fea01c046c4787b.zip | |
[ARM64_DYNAREC][RV64_DYNAREC] Fixed some case where MOVS/B/W/D/Q is used on a protected page of code, and SI gets wrongly incremented (for #1347)
Diffstat (limited to 'src/dynarec')
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_6764_32.c | 3 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_00_2.c | 4 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_66.c | 4 |
3 files changed, 6 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_6764_32.c b/src/dynarec/arm64/dynarec_arm64_6764_32.c index 12f74409..58abbf4b 100644 --- a/src/dynarec/arm64/dynarec_arm64_6764_32.c +++ b/src/dynarec/arm64/dynarec_arm64_6764_32.c @@ -90,11 +90,12 @@ uintptr_t dynarec64_6764_32(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, in case 0x8F: INST_NAME("POP Seg:Ed"); nextop=F8; - POP1_32(x1); if(MODREG) { // reg <= reg + POP1_32(x1); MOVxw_REG(xRAX+(nextop&7)+(rex.b<<3), x1); } else { // mem <= reg grab_segdata(dyn, addr, ninst, x4, seg); + POP1_32(x1); addr = geted16(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, NULL, 0, 0, 0); STRw_REG(x1, ed, x4); } diff --git a/src/dynarec/rv64/dynarec_rv64_00_2.c b/src/dynarec/rv64/dynarec_rv64_00_2.c index e75e56d5..6dc4f3c5 100644 --- a/src/dynarec/rv64/dynarec_rv64_00_2.c +++ b/src/dynarec/rv64/dynarec_rv64_00_2.c @@ -590,16 +590,16 @@ uintptr_t dynarec64_00_2(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int BNEZ_MARK2(x1); MARK; // Part with DF==0 LDxw(x1, xRSI, 0); - ADDI(xRSI, xRSI, rex.w?8:4); SDxw(x1, xRDI, 0); + ADDI(xRSI, xRSI, rex.w?8:4); ADDI(xRDI, xRDI, rex.w?8:4); SUBI(xRCX, xRCX, 1); BNEZ_MARK(xRCX); B_NEXT_nocond; MARK2; // Part with DF==1 LDxw(x1, xRSI, 0); - SUBI(xRSI, xRSI, rex.w?8:4); SDxw(x1, xRDI, 0); + SUBI(xRSI, xRSI, rex.w?8:4); SUBI(xRDI, xRDI, rex.w?8:4); SUBI(xRCX, xRCX, 1); BNEZ_MARK2(xRCX); diff --git a/src/dynarec/rv64/dynarec_rv64_66.c b/src/dynarec/rv64/dynarec_rv64_66.c index 24b3bfb0..06ac0fe1 100644 --- a/src/dynarec/rv64/dynarec_rv64_66.c +++ b/src/dynarec/rv64/dynarec_rv64_66.c @@ -752,8 +752,8 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BNEZ_MARK2(x1); MARK; // Part with DF==0 LH(x1, xRSI, 0); - ADDI(xRSI, xRSI, 2); SH(x1, xRDI, 0); + ADDI(xRSI, xRSI, 2); ADDI(xRDI, xRDI, 2); SUBI(xRCX, xRCX, 1); BNEZ_MARK(xRCX); @@ -767,7 +767,7 @@ uintptr_t dynarec64_66(dynarec_rv64_t* dyn, uintptr_t addr, uintptr_t ip, int ni BNEZ_MARK2(xRCX); // done } else { - INST_NAME("MOVSD"); + INST_NAME("MOVSW"); GETDIR(x3, x1, 2); LH(x1, xRSI, 0); SH(x1, xRDI, 0); |