|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Implementing shadow mem-access API
At 19:37 -0400 on 23 Apr (1366745856), Cutter 409 wrote:
> Thanks, that clears up a few things.
>
> I'm not sure I understand why I'd have to handle emulation. My assumption
> was that the process is like this:
>
> page_fault()
> {
> ...
>
> if the guest pagetables aren't the cause, then
> if regs->error_code indicates a violation of p2m access settings
> send the mem_event and return, letting the guest try again.
Sure, but in a few cases we emulate instuctions (e.g. the guest writing
to a shadowed pagtetable) and that emulation ought to obey the p2m
access permissions too -- all the more because a guest might modify its
own code so that the instruction that gets emulated != the instruction
that caused the fault.
> ...
> }
>
> The Dom0 listener sets the p2m permissions back to rwx, and when the guest
> retries the instruction, everything is okay (or the existing fault handler
> code would run and do it's thing).
>
> Also, why do we have both hvmmem_access_t and p2m_access_t? It looks like
> the domctl sets the former, but the mem_access EPT API uses the latter.
One is part of the public ABI, the other is internal and subject to change.
Cheers,
Tim.
> Thanks again!
>
> On Tue, Apr 23, 2013 at 4:49 AM, Tim Deegan <tim@xxxxxxx> wrote:
>
> > Hi,
> >
> > At 17:56 -0400 on 22 Apr (1366653364), Cutter 409 wrote:
> > > I'm finally to a point where I can start looking at this more closely.
> > I'm
> > > trying to wrap my head around the shadow code to figure out the right
> > > course of action.
> > >
> > > I'd want HVMOP_set_mem_access to work with both shadow and EPT, so I'd
> > want
> > > things to work via p2m somehow. I think I understand this part.
> > >
> > > * HVMOP_set_mem_access is used to change the p2m_access_t for the target
> > > page(s). This should already be implemented I think?
> >
> > Yep. The shadow code uses the same p2m implementataion as NPT, so that
> > should all be fine.
> >
> > > * During propagation, I'll check the p2m map to see if I should mask off
> > > any permission bits.
> >
> > Yep. You'll already be doing a p2m lookup to get the MFN, so you just
> > need to look at the p2ma as well.
> >
> > > * On a shadow paging fault, I'll check if the fault was caused by p2m
> > > permissions, somehow integrating that with the code for read-only guest
> > > page tables safely.
> >
> > Yes. The common case will be handled in _sh_propagate, which is where
> > the shadow PTE is constructed. For the rest you'll need to look at the
> > places where the shadow fault handler calls the emulator and DTRT
> > (either before the call or in the callbacks that the emulator uses to
> > access guest memory).
> >
> > > Questions:
> > >
> > > * Just for background, am I correct in my understanding that the
> > log_dirty
> > > code is used to track which gfns have been written to by the guest, in
> > > order to speed up migration?
> >
> > That's right. It's also used to track which parts of an emulated
> > framebuffer have been updated, to make VNC connections more efficient.
> >
> > > * Are multiple shadow tables maintained per domain? Is there one per
> > VCPU?
> > > One shadow table per guest page table? Is it blown away every time the
> > > guest changes CR3? I'm having some trouble tracking this down.
> >
> > There's one set of shadows per domain, shared among all VCPUs. A given
> > page of memory may have multiple shadows though, e.g. if it's seen both
> > as a top-level pagetables and a leaf pagetable.
> >
> > Shadows are kept around until:
> > - it looks like the page is no longer a pagetable;
> > - the guest explicitly tells us it's no longer a pagetable; or
> > - we need the memory to shadow some other page.
> >
> > Mostly, a pages's shadow(s) are kept in sync with any changes the guest
> > makes to the page, by trapping and emulating all writes. For
> > performance, we allow some l1 pagetables to be 'out of sync' ('oos' in
> > the code), letting the guest write to the page directly. On guest CR3
> > writes (and other TLB-flush-related activity) we make sure any OOS
> > shadows are brought up to date.
> >
> > > * How should I clear/update existing shadow entries after changing the
> > > p2m_access_t? Can I clear the shadow tables somehow and force everything
> > to
> > > be repopulated? Is that insane?
> >
> > It depends how often you're changing the access permissions.
> > sh_remove_all_mappings() and sh_remove_write_access() will try to flush
> > mappings of a single MFN from the shadows, but they can be expensive
> > (e.g. involving a brute-force scan of all shadows) so if you're going to
> > do a lot of them it may be worth considering batching them up and
> > calling shadow_blow_tables() once instead.
> >
> > Cheers,
> >
> > Tim.
> >
> >
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |