Thanks very much to both of you for the info! After Andrew's post today I
was able to write some code myself to walk the page tables and get it to
work correctly, and xc_translate_foreign_address is exactly what I want as
well. I had been digging through the Xen codebase for a while looking for
just such a function but hadn't found it … the docs situation for these
APIs could definitely be better! I will definitely update the wiki with all
this information once I'm sure I understand it properly.

On Thu, Oct 11, 2018 at 3:05 PM Tamas K Lengyel <tamas.k.leng...@gmail.com>
wrote:

> On Wed, Oct 10, 2018 at 5:10 PM Andrew Cooper <andrew.coop...@citrix.com>
> wrote:
> >
> > On 10/10/18 23:08, Spencer Michaels wrote:
> > > Interesting … sorry, I had read the docs a while ago and my
> > > interpretation at the time was that it didn't. I can try to get libvmi
> > > working, but nonetheless I do want to figure out how to this with the
> > > Xen API itself if at all possible, so I'd appreciate any help in doing
> > > so.
> > >
> > > I've looked through libvmi's implementation some more; it looks like
> > > it does this via vmi_pagetable_lookup_cache, which in my case ends up
> > > calling v2p_pae (intel.c:327). As I understand it, in that function,
> > > the `dtb` parameter holds the pagetable base address, and you use that
> > > to walk the page table and get the physical address corresponding to
> > > the virtual addr. Based on the end of vmi_translate_kv2p
> > > (accessors.c:703), it looks like the value of dtb is `vmi->kpgd`,
> > > which at some point earlier is set to the value of the `cr3` register.
> > > Is my understanding, roughly speaking, correct?
>
> Correct, this works because the kernel is mapped into all process'
> address space on both Windows and Linux. So you can just take the
> value of CR3 at any given time and you will find the kernel memory
> range mapped in. The recent KPTI mitigations might effect this though,
> haven't investigated it yet.
>
> > > I tried to replicate a simpler version of libvmi's page table walking
> > > code just now, and in doing so noticed that the value of CR0, as
> > > reported by Xen, has its 31st bit set to zero … i.e. virtual
> > > addressing is disabled entirely? (For reference, I'm using a 64-bit
> > > Ubuntu image set up initially by virt-manager but now just run via `xl
> > > create`. I don't know if I should expect it to have paging enabled or
> > > not.) On the other hand, if I understand correctly, what I mentioned
> > > earlier with regards to some HVM guests assuming (addr >>
> > > XC_PAGE_SHIFT) = MFN *is* assuming that guest page frame number =
> > > machine frame number, which sounds like it is what would be applicable
> > > in this case.
> > >
> > > Honestly, I'm not so sure what's happening here, and I'm not even sure
> > > my description is sensible at this point — I need to look into
> > > libvmi's implementation more and also figure out exactly what paging
> > > mode (or lack thereof) my HVM guest is running in. If, on the other
> > > hand, any of the above sounds familiar, suggestions/hints would be
> > > very helpful.
>
> If you want to look at another very compact implementation then libxc
> has one too:
> https://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=tools/libxc/xc_pagetab.c;h=db25c20247573a3c638d7725c976433221a40141;hb=HEAD#l29
>
> > Here are some observations/points which may help.
> >
> > x86 is a bit more complicated than other architectures, and as a result,
> > there is a lot of subtly incorrect terminology (including in Libvmi -
> > sorry Tamas).
>
> Well aware of it =)
>
> >
> > A virtual address (also called an effective address) is a segment:offset
> > pair.  The segment is almost always implicit (%cs for instruction
> > fetches, %ss for stack accesses, %ds for normal data accesses).  The
> > segmentation part of address translation adds the segment base to the
> > offset to produce a linear address.
> >
> > A "flat memory model" (used by almost all 32bit OSes and is
> > unconditional in AMD64) is one where the segment base is 0, at which
> > point offset == linear address.  This is where most confusion over the
> > term "virtual address" arises.
> >
> > The paging part of address translation takes a linear address, follows
> > the pagetable structure (rooted in %cr3), to produce a physical address
> > as an output.  This may be guest physical or host physical depending on
> > the VM configuration.
> >
> >
> > Next, please read
> >
> http://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=xen/include/xen/mm.h;h=054d02e6c0e68b411afba42424dc5fe7e7d69855;hb=refs/heads/staging#l8
> > which describes the terminology Xen uses for various address spaces.  In
> > particular, the difference between MFN and GFN.
> >
> > The relevant difference PV and HVM guests as far as you are concerned is
> > that for PV guests, GFN == MFN because the pagetables written by the
> > guest are walked directly by hardware.
> >
> > An HVM guest has GFN != MFN, because the guest physical to host physical
> > translation is provided by HAP/EPT/NPT/SLAT (whichever term you chose to
> > use for hardware acceleration), or by the shadow pagetables (maintained
> > and operated by Xen, for hardware lacking HAP support).
> >
> > The foreign map API uses a GFN, even if the underlying API describes the
> > parameter name as MFN.  This is a consequence of PV guests having been
> > developed long before hardware virt extensions came along, and noone
> > having gone through and retroactively updated the terminology.
> >
> > Therefore, for both PV and HVM guests, you can take the guest cr3,
> > extract the frame part of it, and ask the foreign map API to map that
> > guest frame.  The underlying implementation in Xen is trivial for a PV
> > guest (GFN == MFN), but slightly more complicated for HVM guests (GFN
> > has to be translated into an MFN by Xen walking the HAP/shadow
> > pagetables before dom0's mapping request can be completed).
> >
> > I hope this clears up some of the confusion.
> >
>
> Thanks for the in-depth write-up! We might even want to record this on
> a wiki page ;)
>
> Tamas
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to