about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-30 11:35:14 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-30 11:35:14 +0100
commitb0db168fb57dd63e101c99b8c728aff9039a23bc (patch)
tree86039eb06fb3c43f14e78c3b32af6f09862386d8 /src
parent3b3338d132da30de2a930dd6851f7e124ebc18de (diff)
downloadbox64-b0db168fb57dd63e101c99b8c728aff9039a23bc.tar.gz
box64-b0db168fb57dd63e101c99b8c728aff9039a23bc.zip
[INTERPRETER] Added 0F 30 ocpode ([RM64_DYNAREC] too) (for #2090)
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_0f.c12
-rw-r--r--src/emu/x64run0f.c7
2 files changed, 17 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_0f.c b/src/dynarec/arm64/dynarec_arm64_0f.c
index 3d488876..ebe5c4e8 100644
--- a/src/dynarec/arm64/dynarec_arm64_0f.c
+++ b/src/dynarec/arm64/dynarec_arm64_0f.c
@@ -501,7 +501,17 @@ uintptr_t dynarec64_0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin
             FCMPS(v0, s0);

             FCOMI(x1, x2);

             break;

-

+        case 0x30:

+            INST_NAME("WRMSR");

+            SETFLAGS(X_ALL, SF_SET_NODF);    // Hack to set flags in "don't care" state

+            GETIP(ip);

+            STORE_XEMU_CALL(xRIP);

+            CALL(native_priv, -1);

+            LOAD_XEMU_CALL(xRIP);

+            jump_to_epilog(dyn, 0, xRIP, ninst);

+            *need_epilog = 0;

+            *ok = 0;

+            break;

         case 0x31:

             INST_NAME("RDTSC");

             NOTEST(x1);

diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index de5472e7..673f2d2b 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -378,7 +378,12 @@ uintptr_t Run0F(x64emu_t *emu, rex_t rex, uintptr_t addr, int *step)
             }

             CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); CLEAR_FLAG(F_SF);

             break;

-

+        case 0x30:                      /* WRMSR */

+            // this is a privilege opcode...

+            #ifndef TEST_INTERPRETER

+            emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);

+            #endif

+            break;

         case 0x31:                   /* RDTSC */

             tmp64u = ReadTSC(emu);

             if(box64_rdtsc_shift)