about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
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;