Opcodes 0F 01 /0 and 0F 01 /1

Signed-off-by: Avi Kivity <a...@redhat.com>
---
 arch/x86/kvm/emulate.c |   33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 0088e2d..46bbc9d 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -3017,6 +3017,35 @@ static int em_vmcall(struct x86_emulate_ctxt *ctxt)
        return X86EMUL_CONTINUE;
 }
 
+static int emulate_store_desc_ptr(struct x86_emulate_ctxt *ctxt,
+                                 void (*get)(struct x86_emulate_ctxt *ctxt,
+                                             struct desc_ptr *ptr))
+{
+       struct desc_ptr desc_ptr;
+
+       if (ctxt->mode == X86EMUL_MODE_PROT64)
+               ctxt->op_bytes = 8;
+       get(ctxt, &desc_ptr);
+       if (ctxt->op_bytes == 2) {
+               ctxt->op_bytes = 4;
+               desc_ptr.address &= 0x00ffffff;
+       }
+       /* Disable writeback. */
+       ctxt->dst.type = OP_NONE;
+       return segmented_write(ctxt, ctxt->dst.addr.mem,
+                              &desc_ptr, 2 + ctxt->op_bytes);
+}
+
+static int em_sgdt(struct x86_emulate_ctxt *ctxt)
+{
+       return emulate_store_desc_ptr(ctxt, ctxt->ops->get_gdt);
+}
+
+static int em_sidt(struct x86_emulate_ctxt *ctxt)
+{
+       return emulate_store_desc_ptr(ctxt, ctxt->ops->get_idt);
+}
+
 static int em_lgdt(struct x86_emulate_ctxt *ctxt)
 {
        struct desc_ptr desc_ptr;
@@ -3476,8 +3505,8 @@ static int check_perm_out(struct x86_emulate_ctxt *ctxt)
 };
 
 static struct group_dual group7 = { {
-       DI(Mov | DstMem | Priv,                 sgdt),
-       DI(Mov | DstMem | Priv,                 sidt),
+       II(Mov | DstMem | Priv,                 em_sgdt, sgdt),
+       II(Mov | DstMem | Priv,                 em_sidt, sidt),
        II(SrcMem | Priv,                       em_lgdt, lgdt),
        II(SrcMem | Priv,                       em_lidt, lidt),
        II(SrcNone | DstMem | Mov,              em_smsw, smsw), N,
-- 
1.7.10.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to