On Tue, Aug 7, 2012 at 6:57 AM, Alexander Graf <[email protected]> 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 <[email protected]>
> ---
> 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
> [email protected]
> https://lists.cs.columbia.edu/cucslists/listinfo/kvmarm
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html