aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/kvm_host.h2
-rw-r--r--virt/kvm/kvm_main.c20
2 files changed, 22 insertions, 0 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 31ebb59cbd2f..f7df0a3b031d 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -381,6 +381,8 @@ int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset,
381int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, 381int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data,
382 unsigned long len); 382 unsigned long len);
383int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); 383int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len);
384int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
385 void *data, unsigned long len);
384int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, 386int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data,
385 int offset, int len); 387 int offset, int len);
386int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, 388int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 11d2783eb9df..d5ef9ebcaff7 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1418,6 +1418,26 @@ int kvm_write_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
1418} 1418}
1419EXPORT_SYMBOL_GPL(kvm_write_guest_cached); 1419EXPORT_SYMBOL_GPL(kvm_write_guest_cached);
1420 1420
1421int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc,
1422 void *data, unsigned long len)
1423{
1424 struct kvm_memslots *slots = kvm_memslots(kvm);
1425 int r;
1426
1427 if (slots->generation != ghc->generation)
1428 kvm_gfn_to_hva_cache_init(kvm, ghc, ghc->gpa);
1429
1430 if (kvm_is_error_hva(ghc->hva))
1431 return -EFAULT;
1432
1433 r = __copy_from_user(data, (void __user *)ghc->hva, len);
1434 if (r)
1435 return -EFAULT;
1436
1437 return 0;
1438}
1439EXPORT_SYMBOL_GPL(kvm_read_guest_cached);
1440
1421int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len) 1441int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len)
1422{ 1442{
1423 return kvm_write_guest_page(kvm, gfn, (const void *) empty_zero_page, 1443 return kvm_write_guest_page(kvm, gfn, (const void *) empty_zero_page,