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 > + 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; } > + > int kvm_is_visible_gfn(struct kvm *kvm, gfn_t gfn) > { > struct kvm_memory_slot *memslot = gfn_to_memslot(kvm, gfn); > -- > 1.6.0.2 > > _______________________________________________ > kvmarm mailing list > kvmarm@xxxxxxxxxxxxxxxxxxxxx > https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm -- 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