On Fri, Aug 10, 2012 at 10:06 PM, Peter Maydell <peter.mayd...@linaro.org> wrote: > On 10 August 2012 19:53, Steven <wangwangk...@gmail.com> wrote: >> On Fri, Aug 10, 2012 at 11:47 AM, Peter Maydell >> <peter.mayd...@linaro.org> wrote: >>> On 10 August 2012 03:11, Steven <wangwangk...@gmail.com> wrote: >>>> The function definition has a return address type tb_page_addr_t. >>>> tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr) >>>> >>>> I am wondering is this address the guest physical address or the host >>>> virtual address. >>> >>> In linux-user mode the returned address is the guest virtual address. >>> In system mode it is a ram_addr_t. (the comment above the implementation >>> says "the returned address is not exactly the physical address: it >>> is the offset relative to phys_ram_base" but this is out of date I think). >>> A ram_addr_t is neither a host address nor a guest physical address >>> but it's closely related to a guest physaddr (you can think of it as >>> if all the RAM in the system was put into a straight line and then the >> >> My question is related to system mode. >> Is the RAM you mean the guest physical address, which is a continuous >> sequence of numbers beginning from 0 to the max of allocated RAM of >> the guest? >> >>> ram_addr_t is an index into that). >> >> If the returned value of get_page_addr_code is the index to that >> straight line, I am wondering if it is the guest physical address. > > No, it is definitely not the guest physical address. Consider > the case where there are two aliases of the same RAM in > guest physical memory -- two physical addresses might > map to a single ram_addr_t. Consider the case where there > is a 'hole' in memory -- ram_addr_t and physical address are > not identical there either. > >> So if I want to get the guest physical address (GPA) of a >> tb_page_addr_t, can I do >> tb_page_addr_t = returned value from get_page_addr_code + phys_ram_base >> Is this translation correct? > > This is wrong on several counts: (a) there's no such thing > as phys_ram_base any more (it was removed several years > ago) and (b) there is no single unique guest physical > address corresponding to a tb_page_addr_t, so what > you are trying to do is not well defined. > > What are you trying to do anyway and why do you want > to call get_page_addr_code() ? > > -- PMM
I want to get the guest physical address of a pc. I note the part of the function cpu_x86_handle_mmu_fault will do something like page walking to convert a pc to its guest physical address. I think this is the guest physical address I need. However, there is no other function available to do this page walking. So I am thinking add a function to do the conversion. After you mentions about the memory region, do you think the following formula is correct guest_physical address = block->mr->addr + (pc's host virtual address - block->host) ^ ^ Base of the mapped memory block (offset in the memory block) Or do you have any suggestion? Thanks.