qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] Get host virtual address corresponding to guest physical address?
@ 2012-08-24  3:14 陳韋任 (Wei-Ren Chen)
  2012-08-25  8:02 ` Blue Swirl
  2012-08-25 10:56 ` Peter Maydell
  0 siblings, 2 replies; 6+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-08-24  3:14 UTC (permalink / raw)
  To: qemu-devel

Hi all,

  I would like to know if there is a function in QEMU which converts
a guest physical address into corresponding host virtual address. I
guess cpu_physical_memory_map (exec.c) can do the job, but I have a
few questions.

  1. I am running x86 guest on a x86_64 host and using the cod below
     to get the host virtual address, I am not sure what value of len
     should be.

        static inline void *gpa2hva(target_phys_addr_t addr)
        {
            target_phys_addr_t len = 4;
            return cpu_physical_memory_map(addr, &len, 0);
        }

  2. There is a function "cpu_physical_memory_unmap", the comment
     of it says,

       Unmaps a memory region previously mapped by cpu_physical_memory_map().

     That makes me not sure if I use cpu_physical_memory_map correctly,
     does it do what I want to do?

Regards,
chenwj

-- 
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Get host virtual address corresponding to guest physical address?
  2012-08-24  3:14 [Qemu-devel] Get host virtual address corresponding to guest physical address? 陳韋任 (Wei-Ren Chen)
@ 2012-08-25  8:02 ` Blue Swirl
  2012-08-25 10:56 ` Peter Maydell
  1 sibling, 0 replies; 6+ messages in thread
From: Blue Swirl @ 2012-08-25  8:02 UTC (permalink / raw)
  To: 陳韋任 (Wei-Ren Chen); +Cc: qemu-devel

On Fri, Aug 24, 2012 at 3:14 AM, 陳韋任 (Wei-Ren Chen)
<chenwj@iis.sinica.edu.tw> wrote:
> Hi all,
>
>   I would like to know if there is a function in QEMU which converts
> a guest physical address into corresponding host virtual address. I
> guess cpu_physical_memory_map (exec.c) can do the job, but I have a
> few questions.
>
>   1. I am running x86 guest on a x86_64 host and using the cod below
>      to get the host virtual address, I am not sure what value of len
>      should be.
>
>         static inline void *gpa2hva(target_phys_addr_t addr)
>         {
>             target_phys_addr_t len = 4;
>             return cpu_physical_memory_map(addr, &len, 0);
>         }
>
>   2. There is a function "cpu_physical_memory_unmap", the comment
>      of it says,
>
>        Unmaps a memory region previously mapped by cpu_physical_memory_map().
>
>      That makes me not sure if I use cpu_physical_memory_map correctly,
>      does it do what I want to do?

I'd suppose the functions should be used like this:

ptr = cpu_physical_memory_map(addr, &len, 0);
/* code that uses ptr */
...
/* no need to use ptr anymore */
cpu_physical_memory_unmap(ptr, len, 0, len);
/* ptr may no longer be assumed to be valid */

>
> Regards,
> chenwj
>
> --
> Wei-Ren Chen (陳韋任)
> Computer Systems Lab, Institute of Information Science,
> Academia Sinica, Taiwan (R.O.C.)
> Tel:886-2-2788-3799 #1667
> Homepage: http://people.cs.nctu.edu.tw/~chenwj
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Get host virtual address corresponding to guest physical address?
  2012-08-24  3:14 [Qemu-devel] Get host virtual address corresponding to guest physical address? 陳韋任 (Wei-Ren Chen)
  2012-08-25  8:02 ` Blue Swirl
@ 2012-08-25 10:56 ` Peter Maydell
  2012-08-25 13:17   ` 陳韋任 (Wei-Ren Chen)
  1 sibling, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2012-08-25 10:56 UTC (permalink / raw)
  To: 陳韋任 (Wei-Ren Chen); +Cc: qemu-devel

On 24 August 2012 04:14, 陳韋任 (Wei-Ren Chen) <chenwj@iis.sinica.edu.tw> wrote:
>   I would like to know if there is a function in QEMU which converts
> a guest physical address into corresponding host virtual address.

So the question is, what do you want to do with the host virtual
address when you've got it? cpu_physical_memory_map() is really intended
(as Blue says) for the case where you have a bit of host code that wants
to write a chunk of data and doesn't want to do a sequence of
cpu_physical_memory_read()/_write() calls. Instead you _map() the memory,
write to it and then _unmap() it.

Note that not all guest physical addresses have a meaningful host
virtual address -- in particular memory mapped devices won't.

>   1. I am running x86 guest on a x86_64 host and using the cod below
>      to get the host virtual address, I am not sure what value of len
>      should be.

The length should be the length of the area of memory you want to
either read or write from.

>         static inline void *gpa2hva(target_phys_addr_t addr)
>         {
>             target_phys_addr_t len = 4;
>             return cpu_physical_memory_map(addr, &len, 0);
>         }

If you try this on a memory mapped device address then the first
time round it will give you back the address of a "bounce buffer",
ie a bit of temporary RAM you can read/write and which unmap will
then actually feed to the device's read/write functions. Since you
never call unmap, this means that anybody else who tries to use
cpu_physical_memory_map() on a device from now on will get back
NULL (meaning resource exhaustion, because the bouncebuffer is in
use).

-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Get host virtual address corresponding to guest physical address?
  2012-08-25 10:56 ` Peter Maydell
@ 2012-08-25 13:17   ` 陳韋任 (Wei-Ren Chen)
  2012-08-25 14:32     ` Peter Maydell
  2012-08-26 17:45     ` Blue Swirl
  0 siblings, 2 replies; 6+ messages in thread
From: 陳韋任 (Wei-Ren Chen) @ 2012-08-25 13:17 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Blue Swirl, qemu-devel

On Sat, Aug 25, 2012 at 11:56:13AM +0100, Peter Maydell wrote:
> On 24 August 2012 04:14, 陳韋任 (Wei-Ren Chen) <chenwj@iis.sinica.edu.tw> wrote:
> >   I would like to know if there is a function in QEMU which converts
> > a guest physical address into corresponding host virtual address.
> 
> So the question is, what do you want to do with the host virtual
> address when you've got it? cpu_physical_memory_map() is really intended
> (as Blue says) for the case where you have a bit of host code that wants
> to write a chunk of data and doesn't want to do a sequence of
> cpu_physical_memory_read()/_write() calls. Instead you _map() the memory,
> write to it and then _unmap() it.

  We want to let host MMU hardware to do what softmmu does. As a prototype
(x86 guest on x86_64 host), we want to do the following:

  1. Get guest page table entries (GVA -> GPA).

  2. Get corresponding HVA.

  3. Then we use /dev/mem (with host cr3) to find out HPA.

  4. We insert GVA -> HPA mapping into host page table through /dev/mem,
     we already move QEMU above 4G to make way for the guest.

So we don't write data into the host virtual addr.

> Note that not all guest physical addresses have a meaningful host
> virtual address -- in particular memory mapped devices won't.

  I guess in our case, we don't touch MMIO?
 
> >   1. I am running x86 guest on a x86_64 host and using the cod below
> >      to get the host virtual address, I am not sure what value of len
> >      should be.
> 
> The length should be the length of the area of memory you want to
> either read or write from.

  Actually I want to know where guest page are mapped to host virtual
address. The GPA we get from step 1 points to guest page table, and
we want to know its corresponding HVA.
 
> >         static inline void *gpa2hva(target_phys_addr_t addr)
> >         {
> >             target_phys_addr_t len = 4;
> >             return cpu_physical_memory_map(addr, &len, 0);
> >         }
> 
> If you try this on a memory mapped device address then the first
> time round it will give you back the address of a "bounce buffer",
> ie a bit of temporary RAM you can read/write and which unmap will
> then actually feed to the device's read/write functions. Since you
> never call unmap, this means that anybody else who tries to use
> cpu_physical_memory_map() on a device from now on will get back
> NULL (meaning resource exhaustion, because the bouncebuffer is in
> use).

  You mean if I call cpu_physical_memory_map with a guest MMIO (physcial)
address, the first time it'll return the address of a buffer that I can write
data into. The second time it'll return NULL since I don't call
cpu_physical_memory_umap to flush the buffer. Do I understand you correctly?
Hmm, I think we don't not have such issue in our use case... What do you
think?

Regards,
chenwj

-- 
Wei-Ren Chen (陳韋任)
Computer Systems Lab, Institute of Information Science,
Academia Sinica, Taiwan (R.O.C.)
Tel:886-2-2788-3799 #1667
Homepage: http://people.cs.nctu.edu.tw/~chenwj

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Get host virtual address corresponding to guest physical address?
  2012-08-25 13:17   ` 陳韋任 (Wei-Ren Chen)
@ 2012-08-25 14:32     ` Peter Maydell
  2012-08-26 17:45     ` Blue Swirl
  1 sibling, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2012-08-25 14:32 UTC (permalink / raw)
  To: 陳韋任 (Wei-Ren Chen); +Cc: Blue Swirl, qemu-devel

On 25 August 2012 14:17, 陳韋任 (Wei-Ren Chen) <chenwj@iis.sinica.edu.tw> wrote:
> On Sat, Aug 25, 2012 at 11:56:13AM +0100, Peter Maydell wrote:
>> On 24 August 2012 04:14, 陳韋任 (Wei-Ren Chen) <chenwj@iis.sinica.edu.tw> wrote:
>> >   I would like to know if there is a function in QEMU which converts
>> > a guest physical address into corresponding host virtual address.
>>
>> So the question is, what do you want to do with the host virtual
>> address when you've got it? cpu_physical_memory_map() is really intended
>> (as Blue says) for the case where you have a bit of host code that wants
>> to write a chunk of data and doesn't want to do a sequence of
>> cpu_physical_memory_read()/_write() calls. Instead you _map() the memory,
>> write to it and then _unmap() it.
>
>   We want to let host MMU hardware to do what softmmu does. As a prototype
> (x86 guest on x86_64 host), we want to do the following:
>
>   1. Get guest page table entries (GVA -> GPA).
>
>   2. Get corresponding HVA.
>
>   3. Then we use /dev/mem (with host cr3) to find out HPA.
>
>   4. We insert GVA -> HPA mapping into host page table through /dev/mem,
>      we already move QEMU above 4G to make way for the guest.

>   You mean if I call cpu_physical_memory_map with a guest MMIO (physcial)
> address, the first time it'll return the address of a buffer that I can write
> data into. The second time it'll return NULL since I don't call
> cpu_physical_memory_umap to flush the buffer. Do I understand you correctly?
> Hmm, I think we don't not have such issue in our use case... What do you
> think?

I think you would hit this when you tried to do this for a page of
guest memory which isn't RAM. In any case it's a sign that the API
is not the one you want.

-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] Get host virtual address corresponding to guest physical address?
  2012-08-25 13:17   ` 陳韋任 (Wei-Ren Chen)
  2012-08-25 14:32     ` Peter Maydell
@ 2012-08-26 17:45     ` Blue Swirl
  1 sibling, 0 replies; 6+ messages in thread
From: Blue Swirl @ 2012-08-26 17:45 UTC (permalink / raw)
  To: 陳韋任 (Wei-Ren Chen); +Cc: Peter Maydell, qemu-devel

On Sat, Aug 25, 2012 at 1:17 PM, 陳韋任 (Wei-Ren Chen)
<chenwj@iis.sinica.edu.tw> wrote:
> On Sat, Aug 25, 2012 at 11:56:13AM +0100, Peter Maydell wrote:
>> On 24 August 2012 04:14, 陳韋任 (Wei-Ren Chen) <chenwj@iis.sinica.edu.tw> wrote:
>> >   I would like to know if there is a function in QEMU which converts
>> > a guest physical address into corresponding host virtual address.
>>
>> So the question is, what do you want to do with the host virtual
>> address when you've got it? cpu_physical_memory_map() is really intended
>> (as Blue says) for the case where you have a bit of host code that wants
>> to write a chunk of data and doesn't want to do a sequence of
>> cpu_physical_memory_read()/_write() calls. Instead you _map() the memory,
>> write to it and then _unmap() it.
>
>   We want to let host MMU hardware to do what softmmu does. As a prototype
> (x86 guest on x86_64 host), we want to do the following:
>
>   1. Get guest page table entries (GVA -> GPA).
>
>   2. Get corresponding HVA.
>
>   3. Then we use /dev/mem (with host cr3) to find out HPA.
>
>   4. We insert GVA -> HPA mapping into host page table through /dev/mem,
>      we already move QEMU above 4G to make way for the guest.
>
> So we don't write data into the host virtual addr.

I don't think this GVA to HPA mapping function will help. I'd use the
memory API to construct the GPA-HVA mappings after board init. The
GVA-GPA mappings need to be gathered from guest MMU tables when MMU is
enabled. Then the page tables need to be tracked and any changes to
either guest MMU setup/tables or in guest physical memory space must
propagate to the host memory maps.

>
>> Note that not all guest physical addresses have a meaningful host
>> virtual address -- in particular memory mapped devices won't.
>
>   I guess in our case, we don't touch MMIO?
>
>> >   1. I am running x86 guest on a x86_64 host and using the cod below
>> >      to get the host virtual address, I am not sure what value of len
>> >      should be.
>>
>> The length should be the length of the area of memory you want to
>> either read or write from.
>
>   Actually I want to know where guest page are mapped to host virtual
> address. The GPA we get from step 1 points to guest page table, and
> we want to know its corresponding HVA.
>
>> >         static inline void *gpa2hva(target_phys_addr_t addr)
>> >         {
>> >             target_phys_addr_t len = 4;
>> >             return cpu_physical_memory_map(addr, &len, 0);
>> >         }
>>
>> If you try this on a memory mapped device address then the first
>> time round it will give you back the address of a "bounce buffer",
>> ie a bit of temporary RAM you can read/write and which unmap will
>> then actually feed to the device's read/write functions. Since you
>> never call unmap, this means that anybody else who tries to use
>> cpu_physical_memory_map() on a device from now on will get back
>> NULL (meaning resource exhaustion, because the bouncebuffer is in
>> use).
>
>   You mean if I call cpu_physical_memory_map with a guest MMIO (physcial)
> address, the first time it'll return the address of a buffer that I can write
> data into. The second time it'll return NULL since I don't call
> cpu_physical_memory_umap to flush the buffer. Do I understand you correctly?
> Hmm, I think we don't not have such issue in our use case... What do you
> think?
>
> Regards,
> chenwj
>
> --
> Wei-Ren Chen (陳韋任)
> Computer Systems Lab, Institute of Information Science,
> Academia Sinica, Taiwan (R.O.C.)
> Tel:886-2-2788-3799 #1667
> Homepage: http://people.cs.nctu.edu.tw/~chenwj

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-08-26 17:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-24  3:14 [Qemu-devel] Get host virtual address corresponding to guest physical address? 陳韋任 (Wei-Ren Chen)
2012-08-25  8:02 ` Blue Swirl
2012-08-25 10:56 ` Peter Maydell
2012-08-25 13:17   ` 陳韋任 (Wei-Ren Chen)
2012-08-25 14:32     ` Peter Maydell
2012-08-26 17:45     ` Blue Swirl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).