]> git.hungrycats.org Git - linux/commitdiff
KVM: x86: add read_phys to x86_emulate_ops
authorRadim Krčmář <rkrcmar@redhat.com>
Fri, 30 Oct 2015 15:36:24 +0000 (16:36 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 9 Dec 2015 19:31:11 +0000 (14:31 -0500)
commit 7a036a6f670f63b32c5ee126425f9109271ca13f upstream.

We want to read the physical memory when emulating RSM.

X86EMUL_IO_NEEDED is returned on all errors for consistency with other
helpers.

Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/include/asm/kvm_emulate.h
arch/x86/kvm/x86.c

index e16466ec473cbffe77f0d1d49ae50f509506938e..e9cd7befcb76af6e4052c193b879b5f869420754 100644 (file)
@@ -111,6 +111,16 @@ struct x86_emulate_ops {
                        unsigned int bytes,
                        struct x86_exception *fault);
 
+       /*
+        * read_phys: Read bytes of standard (non-emulated/special) memory.
+        *            Used for descriptor reading.
+        *  @addr:  [IN ] Physical address from which to read.
+        *  @val:   [OUT] Value read from memory.
+        *  @bytes: [IN ] Number of bytes to read from memory.
+        */
+       int (*read_phys)(struct x86_emulate_ctxt *ctxt, unsigned long addr,
+                       void *val, unsigned int bytes);
+
        /*
         * write_std: Write bytes of standard (non-emulated/special) memory.
         *            Used for descriptor writing.
index 373328b71599d5e097b0a4b75abea8ebf73ce8f9..e7bab940de8648e130d156120fe71406ee8bdd1b 100644 (file)
@@ -4260,6 +4260,15 @@ static int kvm_read_guest_virt_system(struct x86_emulate_ctxt *ctxt,
        return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, 0, exception);
 }
 
+static int kvm_read_guest_phys_system(struct x86_emulate_ctxt *ctxt,
+               unsigned long addr, void *val, unsigned int bytes)
+{
+       struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
+       int r = kvm_vcpu_read_guest(vcpu, addr, val, bytes);
+
+       return r < 0 ? X86EMUL_IO_NEEDED : X86EMUL_CONTINUE;
+}
+
 int kvm_write_guest_virt_system(struct x86_emulate_ctxt *ctxt,
                                       gva_t addr, void *val,
                                       unsigned int bytes,
@@ -4995,6 +5004,7 @@ static const struct x86_emulate_ops emulate_ops = {
        .write_gpr           = emulator_write_gpr,
        .read_std            = kvm_read_guest_virt_system,
        .write_std           = kvm_write_guest_virt_system,
+       .read_phys           = kvm_read_guest_phys_system,
        .fetch               = kvm_fetch_guest_virt,
        .read_emulated       = emulator_read_emulated,
        .write_emulated      = emulator_write_emulated,