diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-06-18 10:52:28 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-06-18 10:52:28 +0200 |
| commit | 59dd97cb72b1a4142ddd61eea36170de4ffff926 (patch) | |
| tree | abf8bfef31819995ce5631bd5d3d869fa1fb79b4 /src/dynarec | |
| parent | a0a98419f072f22479360670a35080ee9113d24f (diff) | |
| download | box64-59dd97cb72b1a4142ddd61eea36170de4ffff926.tar.gz box64-59dd97cb72b1a4142ddd61eea36170de4ffff926.zip | |
Added some support for 32bits code (doesn't seems enough for wow64 yet)
Diffstat (limited to 'src/dynarec')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 21 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_helper.c | 29 |
2 files changed, 32 insertions, 18 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 2d621ef6..11888786 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -1048,12 +1048,13 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x8C: INST_NAME("MOV Ed, Seg"); nextop=F8; + u8 = (nextop&0x38)>>3; + LDRw_U12(x3, xEmu, offsetof(x64emu_t, segs[u8])); if((nextop&0xC0)==0xC0) { // reg <= seg - LDRH_U12(xRAX+(nextop&7)+(rex.b<<3), xEmu, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); + UXTHw(xRAX+(nextop&7)+(rex.b<<3), x1); } else { // mem <= seg - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 0); - LDRH_U12(x3, xEmu, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); - STH(x3, ed, fixedaddress); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 0); + STH(x3, wback, fixedaddress); SMWRITE2(); } break; @@ -1076,16 +1077,17 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin case 0x8E: INST_NAME("MOV Seg,Ew"); nextop = F8; + u8 = (nextop&0x38)>>3; if((nextop&0xC0)==0xC0) { ed = xRAX+(nextop&7)+(rex.b<<3); } else { SMREAD(); - addr = geted(dyn, addr, ninst, nextop, &ed, x2, &fixedaddress, &unscaled, 0xfff<<2, 1, rex, NULL, 0, 0); - LDH(x1, ed, fixedaddress); + addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, &unscaled, 0xfff<<1, 1, rex, NULL, 0, 0); + LDH(x1, wback, fixedaddress); ed = x1; } - STRw_U12(ed, xEmu, offsetof(x64emu_t, segs[(nextop&0x38)>>3])); - STRw_U12(wZR, xEmu, offsetof(x64emu_t, segs_serial[(nextop&0x38)>>3])); + STRw_U12(ed, xEmu, offsetof(x64emu_t, segs[u8])); + STRw_U12(wZR, xEmu, offsetof(x64emu_t, segs_serial[u8])); break; case 0x8F: INST_NAME("POP Ed"); @@ -1811,9 +1813,9 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin } break; case 0xCD: - INST_NAME("INT n"); u8 = F8; if(box64_wine && u8==0x2D) { + INST_NAME("INT 2D"); // lets do nothing MESSAGE(LOG_INFO, "INT 2D Windows anti-debug hack\n"); } else if (u8==0x80) { @@ -1833,6 +1835,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin LOAD_XEMU_REM(); jump_to_epilog(dyn, 0, xRIP, ninst); } else { + INST_NAME("INT n"); SETFLAGS(X_ALL, SF_SET); // Hack to set flags in "don't care" state GETIP(ip); STORE_XEMU_CALL(xRIP); diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c index e141655a..f2dc26d8 100755 --- a/src/dynarec/arm64/dynarec_arm64_helper.c +++ b/src/dynarec/arm64/dynarec_arm64_helper.c @@ -541,23 +541,34 @@ void iret_to_epilog(dynarec_arm_t* dyn, int ninst, int is64bits) MESSAGE(LOG_DUMP, "IRet to epilog\n"); // POP IP NOTEST(x2); - POP1(xRIP); - // POP CS - POP1(x2); + if(is64bits) { + POP1(xRIP); + POP1(x2); + POP1(xFlags); + } else { + LDRw_S9_postindex(xRIP, xRSP, 4); + LDRw_S9_postindex(x2, xRSP, 4); + LDRw_S9_postindex(xFlags, xRSP, 4); + } + // x2 is CS STRH_U12(x2, xEmu, offsetof(x64emu_t, segs[_CS])); - STRx_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_CS])); - STRx_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_SS])); - // POP EFLAGS - POP1(xFlags); + STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_CS])); + // clean EFLAGS MOV32w(x1, 0x3F7FD7); ANDx_REG(xFlags, xFlags, x1); ORRx_mask(xFlags, xFlags, 1, 0b111111, 0); SET_DFNONE(x1); // POP RSP - POP1(x3); + if(is64bits) { + POP1(x3); //rsp + POP1(x2); //ss + } else { + LDRw_S9_postindex(x3, xRSP, 4); + LDRw_S9_postindex(x2, xRSP, 4); + } // POP SS - POP1(x2); STRH_U12(x2, xEmu, offsetof(x64emu_t, segs[_SS])); + STRw_U12(xZR, xEmu, offsetof(x64emu_t, segs_serial[_SS])); // set new RSP MOVx_REG(xRSP, x3); // Ret.... |