about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-07-28 11:13:59 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-07-28 11:13:59 +0200
commit58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7 (patch)
treeaa3ceae38996f60db0433f86ec40d46741aefbb7 /src
parentecc07a235cc4c106af81ed1f99f306351305c36c (diff)
downloadbox64-58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7.tar.gz
box64-58b5c6ded9792a1e79a1b3bc2a6e82a1d3108cc7.zip
Handled privilieged instruction (as handled by wine64) as privilegde and generate a SIGSEGV (should help #27 and some other Wine64 games/programs)
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64run.c36
-rw-r--r--src/emu/x64run0f.c17
2 files changed, 51 insertions, 2 deletions
diff --git a/src/emu/x64run.c b/src/emu/x64run.c
index 1c14d1c0..34384d68 100755
--- a/src/emu/x64run.c
+++ b/src/emu/x64run.c
@@ -307,6 +307,15 @@ x64emurun:
             else
                 GD->q[0] = imul32(emu, ED->dword[0], (uint32_t)tmp64s);
             break;
+        case 0x6C:                      /* INSB DX */
+        case 0x6D:                      /* INSL DX */
+        case 0x6E:                      /* OUTSB DX */
+        case 0x6F:                      /* OUTSL DX */
+            // this is a privilege opcode...
+            --R_RIP;
+            emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);
+            STEP;
+            break;
 
         GOCOND(0x70
             ,   tmp8s = F8S; CHECK_FLAGS(emu);
@@ -1066,6 +1075,13 @@ x64emurun:
             x64Int3(emu);
             if(emu->quit) goto fini;
             break;
+        case 0xCD:                      /* INT n */
+            // this is a privilege opcode...
+            --R_RIP;
+            emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);
+            STEP;
+            break;
+
 
         case 0xCF:                      /* IRET */
             R_RIP = Pop(emu);
@@ -1233,7 +1249,15 @@ x64emurun:
                 R_RIP += tmp8s;
             STEP
             break;
-
+        case 0xE4:                      /* IN AL, XX */
+        case 0xE5:                      /* IN EAX, XX */
+        case 0xE6:                      /* OUT XX, AL */
+        case 0xE7:                      /* OUT XX, EAX */
+            // this is a privilege opcode...
+            --R_RIP;
+            emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);
+            STEP;
+            break;
         case 0xE8:                      /* CALL Id */
             tmp32s = F32S; // call is relative
             Push(emu, R_RIP);
@@ -1251,7 +1275,15 @@ x64emurun:
             R_RIP += tmp32s;
             STEP
             break;
-
+        case 0xEC:                      /* IN AL, DX */
+        case 0xED:                      /* IN EAX, DX */
+        case 0xEE:                      /* OUT DX, AL */
+        case 0xEF:                      /* OUT DX, EAX */
+            // this is a privilege opcode...
+            --R_RIP;
+            emit_signal(emu, SIGSEGV, (void*)R_RIP, 0);
+            STEP;
+            break;
         case 0xF0:                      /* LOCK prefix */
             if(RunF0(emu, rex)) {
                 unimp = 1;
diff --git a/src/emu/x64run0f.c b/src/emu/x64run0f.c
index 0e430904..977e6c73 100644
--- a/src/emu/x64run0f.c
+++ b/src/emu/x64run0f.c
@@ -48,8 +48,17 @@ int Run0F(x64emu_t *emu, rex_t rex)
         case 0x05:                      /* SYSCALL */

             x64Syscall(emu);

             break;

+        case 0x06:                      /* CLTS */

+            // this is a privilege opcode...

+            R_RIP-=2;

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

+            break;

 

+        case 0x08:                      /* INVD */

         case 0x09:                      /* WBINVD */

+            // this is a privilege opcode...

+            R_RIP-=2;

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

             break;

 

         case 0x0B:                      /* UD2 */

@@ -145,6 +154,14 @@ int Run0F(x64emu_t *emu, rex_t rex)
             nextop = F8;

             GETED(0);

             break;

+        case 0x20:                      /* MOV REG, crX */

+        case 0x21:                      /* MOV REG, drX */

+        case 0x22:                      /* MOV cxR, REG */

+        case 0x23:                      /* MOV drX, REG */

+            // this is a privilege opcode...

+            R_RIP-=2;

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

+            break;

 

         case 0x28:                      /* MOVAPS Gx,Ex */

             nextop = F8;