[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] guest physical to xen machine copy?



On 28/9/08 21:19, "Dan Magenheimer" <dan.magenheimer@xxxxxxxxxx> wrote:

>> You can try gfn_to_mfn.
> 
> Thanks!  Then if I have a page_info pointer and a gpfn, will
> this code work for copying?  Or can it be made simpler?

Use p2m_is_ram() instead of checking individual p2m ram type enumerations.
Use [un]map_domain_page instead of [un]map_domain_page_global.

 -- Keir

> Thanks,
> Dan
> 
> #include <asm/p2m.h>
> static int
> copy_page_from_guest(struct page_info *dst_pi, XEN_GUEST_HANDLE(void) gpfn)
> {
>     int i;
>     unsigned long dst_mfn, guest_mfn;
>     void *dst_va, *guest_va;
>     p2m_type_t t;
> 
>     if (is_pv_32on64_vcpu(current))
>         gpfn.p = (void *)((unsigned long)gpfn.p & 0xfffffUL);
>     dst_mfn = page_to_mfn(dst_pi);
>     guest_mfn = gfn_to_mfn(current->domain,(unsigned long)gpfn.p,&t);
>     if (t != p2m_ram_rw && t != p2m_ram_ro)
>         return(0);  /* do I need to worry about p2m_ram_logdirty? */
>     dst_va = map_domain_page_global(dst_mfn);
>     guest_va = map_domain_page_global(guest_mfn);
> /*  i = __copy_from_guest(dst_va, guest_va, PAGE_SIZE); */
>     i = __copy_from_user(dst_va, guest_va, PAGE_SIZE);
>     unmap_domain_page_global(guest_va);
>     unmap_domain_page_global(dst_va);
>     return (!i);
> }
> 
> 
>> -----Original Message-----
>> From:
>> Sent: Saturday, September 27, 2008 8:38 PM
>> To: Dan Magenheimer; Xen-Devel (E-mail)
>> Subject: RE: [Xen-devel] guest physical to xen machine copy?
>> 
>> 
>> You can try gfn_to_mfn...
>> 
>> Thanks,
>> Kevin
>> 
>>> From: Dan Magenheimer
>>> Sent: 2008年9月28日 5:33
>>> 
>>> Sorry for my poor x86 memory model knowlege...
>>> 
>>> In some code I am working on, I currently pass the
>>> address of a guest page from a domain via a hypercall
>>> and in Xen either copy to or from the guest page
>>> using:
>>> 
>>> __copy_from_guest(xen_va, guest_va, PAGE_SIZE)
>>> 
>>> or
>>> 
>>> __copy_to_guest(guest_va, xen_va, PAGE_SIZE)
>>> 
>>> where guest_va is declared as a XEN_GUEST_HANDLE(void)
>>> 
>>> Now I'd like to switch the hypercall interface so
>>> that the domain passes a guest physical address
>>> (or guest physical frame number) instead of a guest
>>> virtual address.
>>> 
>>> I see code that does get_gpfn_from_mfn() but not
>>> the opposite.  What do I need to do to copy a
>>> page of data from a guest pfn to a Xen mfn (or
>>> vice versa)?  And is a guest physical address
>>> still referenced as a XEN_GUEST_HANDLE?
>>> 
>>> It's probably very simple but I can't find it...
>>> 
>>> Thanks,
>>> Dan
>>> 
>>> P.S. This has to work on 32- or 64-bit guests to
>>> both 32- and 64-bit hypervisors.
>>> 
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@xxxxxxxxxxxxxxxxxxx
>>> http://lists.xensource.com/xen-devel
>>> 
>> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.