diff options
-rw-r--r-- | include/linux/kvm_host.h | 2 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 20 |
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, | |||
381 | int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, | 381 | int kvm_read_guest_atomic(struct kvm *kvm, gpa_t gpa, void *data, |
382 | unsigned long len); | 382 | unsigned long len); |
383 | int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); | 383 | int kvm_read_guest(struct kvm *kvm, gpa_t gpa, void *data, unsigned long len); |
384 | int kvm_read_guest_cached(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
385 | void *data, unsigned long len); | ||
384 | int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, | 386 | int kvm_write_guest_page(struct kvm *kvm, gfn_t gfn, const void *data, |
385 | int offset, int len); | 387 | int offset, int len); |
386 | int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, | 388 | int 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 | } |
1419 | EXPORT_SYMBOL_GPL(kvm_write_guest_cached); | 1419 | EXPORT_SYMBOL_GPL(kvm_write_guest_cached); |
1420 | 1420 | ||
1421 | int 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 | } | ||
1439 | EXPORT_SYMBOL_GPL(kvm_read_guest_cached); | ||
1440 | |||
1421 | int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len) | 1441 | int 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, |