On 08.08.2012, at 06:55, Christoffer Dall wrote: > On Tue, Aug 7, 2012 at 6:57 AM, Alexander Graf <agraf@xxxxxxx> wrote: >> Architecture code might want to figure out if an hva that it gets for example >> via the mmu notifier callbacks actually is in guest mapped memory, and if so, >> in which memory slot. >> >> This patch introduces a helper function to enable it to do so. It is a >> prerequisite for the e500 mmu notifier implementation. >> >> Signed-off-by: Alexander Graf <agraf@xxxxxxx> >> --- >> include/linux/kvm_host.h | 1 + >> virt/kvm/kvm_main.c | 14 ++++++++++++++ >> 2 files changed, 15 insertions(+), 0 deletions(-) >> >> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h >> index dbc65f9..2b92928 100644 >> --- a/include/linux/kvm_host.h >> +++ b/include/linux/kvm_host.h >> @@ -464,6 +464,7 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, >> int kvm_clear_guest_page(struct kvm *kvm, gfn_t gfn, int offset, int len); >> int kvm_clear_guest(struct kvm *kvm, gpa_t gpa, unsigned long len); >> struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn); >> +struct kvm_memory_slot *hva_to_memslot(struct kvm *kvm, hva_t hva); >> int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn); >> unsigned long kvm_host_page_size(struct kvm *kvm, gfn_t gfn); >> void mark_page_dirty(struct kvm *kvm, gfn_t gfn); >> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c >> index bcf973e..d42591d 100644 >> --- a/virt/kvm/kvm_main.c >> +++ b/virt/kvm/kvm_main.c >> @@ -999,6 +999,20 @@ struct kvm_memory_slot *gfn_to_memslot(struct kvm *kvm, gfn_t gfn) >> } >> EXPORT_SYMBOL_GPL(gfn_to_memslot); >> >> +struct kvm_memory_slot *hva_to_memslot(struct kvm *kvm, hva_t hva) >> +{ >> + struct kvm_memslots *slots = kvm_memslots(kvm); >> + struct kvm_memory_slot *memslot; >> + >> + kvm_for_each_memslot(memslot, slots) >> + if (hva >= memslot->userspace_addr && >> + hva < memslot->userspace_addr + memslot->npages) > > addr + npages, this doesn't look right Thanks a lot for spotting that one! > >> + return memslot; >> + >> + return NULL; >> +} >> +EXPORT_SYMBOL_GPL(hva_to_memslot); > > consider also adding a hva_to_gpa wrapper now when you're add it, then > ARM code will be so happy: > > bool hva_to_gpa(struct kvm *kvm, unsigned long hva, gpa_t *gpa) > { > struct kvm_memory_slot *memslot; > > memslot = hva_to_memslot(kvm, hva); > if (!memslot) > return false; > > gpa_t gpa_offset = hva - memslot->userspace_addr; > *gpa = (memslot->base_gfn << PAGE_SHIFT) + gpa_offset; > return true; > } What do you need this for? I usually don't like to add framework code that has no users (yet). Alex -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html