KVM: x86 emulator: Add vmmcall/vmcall to x86_emulate (v3)
authorAnthony Liguori <aliguori@us.ibm.com>
Mon, 17 Sep 2007 19:57:49 +0000 (14:57 -0500)
committerAvi Kivity <avi@qumranet.com>
Wed, 30 Jan 2008 15:52:46 +0000 (17:52 +0200)
Add vmmcall/vmcall to x86_emulate.  Future patch will implement functionality
for these instructions.

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
drivers/kvm/x86_emulate.c

index bd46de6..84af9cc 100644 (file)
@@ -1380,6 +1380,12 @@ twobyte_insn:
                        u16 size;
                        unsigned long address;
 
+               case 0: /* vmcall */
+                       if (modrm_mod != 3 || modrm_rm != 1)
+                               goto cannot_emulate;
+
+                       /* nop */
+                       break;
                case 2: /* lgdt */
                        rc = read_descriptor(ctxt, ops, src.ptr,
                                             &size, &address, op_bytes);
@@ -1387,12 +1393,17 @@ twobyte_insn:
                                goto done;
                        realmode_lgdt(ctxt->vcpu, size, address);
                        break;
-               case 3: /* lidt */
-                       rc = read_descriptor(ctxt, ops, src.ptr,
-                                            &size, &address, op_bytes);
-                       if (rc)
-                               goto done;
-                       realmode_lidt(ctxt->vcpu, size, address);
+               case 3: /* lidt/vmmcall */
+                       if (modrm_mod == 3 && modrm_rm == 1) {
+                               /* nop */
+                       } else {
+                               rc = read_descriptor(ctxt, ops, src.ptr,
+                                                    &size, &address,
+                                                    op_bytes);
+                               if (rc)
+                                       goto done;
+                               realmode_lidt(ctxt->vcpu, size, address);
+                       }
                        break;
                case 4: /* smsw */
                        if (modrm_mod != 3)