diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2007-09-17 23:57:49 +0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 18:52:46 +0300 |
commit | aca7f96600b170e470b3056aba0ed8d7df8d330d (patch) | |
tree | bab4af6e6a0d013dbc74d1b772d55da287192d59 | |
parent | dd430ca20c40ecccd6954a7efd13d4398f507728 (diff) | |
download | linux-aca7f96600b170e470b3056aba0ed8d7df8d330d.tar.xz |
KVM: x86 emulator: Add vmmcall/vmcall to x86_emulate (v3)
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>
-rw-r--r-- | drivers/kvm/x86_emulate.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index bd46de6bf891..84af9cc737fa 100644 --- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c @@ -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) |