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)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 4 Nov 2015 15:24:31 +0000 (16:24 +0100)
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>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
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 57b5f79aad083c5a7ad7cf710514304fe05aa337..a24bae0a83a205beaa98f4f4cb47e3b75936128c 100644 (file)
@@ -4089,6 +4089,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,
@@ -4824,6 +4833,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,