On 08.08.2012, at 06:55, Christoffer Dall wrote:
> 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
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-ppc" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html