return 0;
 }
 
-static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
-                                 unsigned long addr,
-                                 void *val,
-                                 unsigned int bytes,
-                                 struct x86_exception *exception)
+static int emulator_read_emulated_onepage(unsigned long addr,
+                                         void *val,
+                                         unsigned int bytes,
+                                         struct x86_exception *exception,
+                                         struct kvm_vcpu *vcpu)
 {
-       struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
        gpa_t gpa;
        int handled, ret;
 
        if (ret)
                goto mmio;
 
-       if (kvm_read_guest_virt(ctxt, addr, val, bytes, exception)
-           == X86EMUL_CONTINUE)
+       if (!kvm_read_guest(vcpu->kvm, gpa, val, bytes))
                return X86EMUL_CONTINUE;
 
 mmio:
        return X86EMUL_IO_NEEDED;
 }
 
+static int emulator_read_emulated(struct x86_emulate_ctxt *ctxt,
+                                 unsigned long addr,
+                                 void *val,
+                                 unsigned int bytes,
+                                 struct x86_exception *exception)
+{
+       struct kvm_vcpu *vcpu = emul_to_vcpu(ctxt);
+
+       /* Crossing a page boundary? */
+       if (((addr + bytes - 1) ^ addr) & PAGE_MASK) {
+               int rc, now;
+
+               now = -addr & ~PAGE_MASK;
+               rc = emulator_read_emulated_onepage(addr, val, now, exception,
+                                                       vcpu);
+               if (rc != X86EMUL_CONTINUE)
+                       return rc;
+               addr += now;
+               val += now;
+               bytes -= now;
+       }
+       return emulator_read_emulated_onepage(addr, val, bytes, exception,
+                                               vcpu);
+}
+
 int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
                        const void *val, int bytes)
 {