|
@@ -369,6 +369,29 @@ bool kvm_require_cpl(struct kvm_vcpu *vcpu, int required_cpl)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kvm_require_cpl);
|
|
|
|
|
|
+/*
|
|
|
+ * This function will be used to read from the physical memory of the currently
|
|
|
+ * running guest. The difference to kvm_read_guest_page is that this function
|
|
|
+ * can read from guest physical or from the guest's guest physical memory.
|
|
|
+ */
|
|
|
+int kvm_read_guest_page_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
|
|
|
+ gfn_t ngfn, void *data, int offset, int len,
|
|
|
+ u32 access)
|
|
|
+{
|
|
|
+ gfn_t real_gfn;
|
|
|
+ gpa_t ngpa;
|
|
|
+
|
|
|
+ ngpa = gfn_to_gpa(ngfn);
|
|
|
+ real_gfn = mmu->translate_gpa(vcpu, ngpa, access);
|
|
|
+ if (real_gfn == UNMAPPED_GVA)
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ real_gfn = gpa_to_gfn(real_gfn);
|
|
|
+
|
|
|
+ return kvm_read_guest_page(vcpu->kvm, real_gfn, data, offset, len);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(kvm_read_guest_page_mmu);
|
|
|
+
|
|
|
/*
|
|
|
* Load the pae pdptrs. Return true is they are all valid.
|
|
|
*/
|