diff options
author | Izik Eidus <izike@qumranet.com> | 2007-11-11 22:05:04 +0200 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-01-30 17:53:01 +0200 |
commit | 539cb6608ca804e7805d8e88c83377d991a552b1 (patch) | |
tree | eb91c4f86c84237a81e669e0f9279aa5d33a4da5 /drivers | |
parent | f9d46eb0e4a5b5e0926ca61c19f8c8bbb9496b28 (diff) |
KVM: introduce gfn_to_hva()
Convert a guest frame number to the corresponding host virtual address.
Signed-off-by: Izik Eidus <izike@qumranet.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/kvm/kvm_main.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index dfb65e2f87ee..04544aecf22f 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c @@ -559,28 +559,37 @@ int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) } EXPORT_SYMBOL_GPL(kvm_is_visible_gfn); +static unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn) +{ + struct kvm_memory_slot *slot; + + gfn = unalias_gfn(kvm, gfn); + slot = __gfn_to_memslot(kvm, gfn); + if (!slot) + return bad_hva(); + return (slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE); +} + /* * Requires current->mm->mmap_sem to be held */ static struct page *__gfn_to_page(struct kvm *kvm, gfn_t gfn) { - struct kvm_memory_slot *slot; struct page *page[1]; + unsigned long addr; int npages; might_sleep(); - gfn = unalias_gfn(kvm, gfn); - slot = __gfn_to_memslot(kvm, gfn); - if (!slot) { + addr = gfn_to_hva(kvm, gfn); + if (kvm_is_error_hva(addr)) { get_page(bad_page); return bad_page; } - npages = get_user_pages(current, current->mm, - slot->userspace_addr - + (gfn - slot->base_gfn) * PAGE_SIZE, 1, - 1, 1, page, NULL); + npages = get_user_pages(current, current->mm, addr, 1, 1, 1, page, + NULL); + if (npages != 1) { get_page(bad_page); return bad_page; |