On 25 August 2012 14:17, 陳韋任 (Wei-Ren Chen) <che...@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) <che...@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