about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-02-06 14:42:51 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-02-06 14:42:51 +0100
commitf8fa53aa3bb5a15072000cf0ef10333a5383871a (patch)
tree7e7f2f771bb191f00ef89b09d1495de053974e1b
parent16423270154ab75987b05723ae45f30cdd8a0e3d (diff)
downloadbox64-f8fa53aa3bb5a15072000cf0ef10333a5383871a.tar.gz
box64-f8fa53aa3bb5a15072000cf0ef10333a5383871a.zip
Changed a bit how SGDT/SIDT are faked ([ARM64_DYNAREC] too)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c18
-rw-r--r--src/emu/x64run0f.c14
2 files changed, 23 insertions, 9 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index e3ac683e..813ea8be 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -87,17 +87,25 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

                         MOV32w(x1, 0x7f);

                         STURH_I9(x1, wback, 0);

-                        MOV32w(x1, 0x000c);

-                        STURH_I9(x1, wback, 2);

-                        MOV32w(x1, 0xd000);

-                        STURH_I9(x1, wback, 4);

+                        if(rex.is32bits) {

+                            MOV32w(x1, 0x3000);

+                            STURw_I9(x1, wback, 2);

+                        } else {

+                            MOV64x(x1, 0xfffffe0000077000LL);

+                            STURx_I9(x1, wback, 2);

+                        }

                         break;

                     case 1:

                         INST_NAME("SIDT Ed");

                         addr = geted(dyn, addr, ninst, nextop, &wback, x2, &fixedaddress, NULL, 0, 0, rex, NULL, 0, 0);

                         MOV32w(x1, 0xfff);

                         STURH_I9(x1, wback, 0);

-                        STURw_I9(xZR, wback, 2);

+                        if(rex.is32bits) {

+                            STURw_I9(xZR, wback, 2);

+                        } else {

+                            MOV64x(x1, 0xfffffe0000000000LL);

+                            STURx_I9(x1, wback, 2);

+                        }

                         break;

                     case 4:

                         INST_NAME("SMSW Ew");

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 83b60043..d0b5900f 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -101,13 +101,19 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
                 switch((nextop>>3)&7) {

                     case 0:                 /* SGDT Ed */

                         ED->word[0] = 0x7f;    // dummy return...

-                        ED->word[1] = 0x000c;

-                        ED->word[2] = 0xd000;

+                        if(rex.is32bits) {

+                            *(uint32_t*)(&ED->word[1]) = 0x3000;

+                        } else {

+                            *(uint64_t*)(&ED->word[1]) = 0xfffffe0000077000LL;

+                        }

                         break;

                     case 1:                 /* SIDT Ed */

                         ED->word[0] = 0xfff;    // dummy return, like "disabled"

-                        ED->word[1] = 0;

-                        ED->word[2] = 0;

+                        if(rex.is32bits) {

+                            *(uint32_t*)(&ED->word[1]) = 0x0000;

+                        } else {

+                            *(uint64_t*)(&ED->word[1]) = 0xfffffe0000000000LL;

+                        }

                         break;

                     case 4:                 /* SMSW Ew */

                         // dummy for now... Do I need to track CR0 state?