All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Egger <Christoph.Egger@amd.com>
To: Tim Deegan <Tim.Deegan@citrix.com>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [PATCH 07/14] Nested Virtualization: trap
Date: Tue, 10 Aug 2010 14:25:10 +0200	[thread overview]
Message-ID: <201008101425.11212.Christoph.Egger@amd.com> (raw)
In-Reply-To: <20100810104827.GE13291@whitby.uk.xensource.com>

On Tuesday 10 August 2010 12:48:27 Tim Deegan wrote:
> At 09:55 +0100 on 10 Aug (1281434149), Christoph Egger wrote:
> > There is exactly one reason to have them: Intel seems to want
> > "shadow-on-shadow". In this case the page fault handler
> > walks the guests shadow page table. If that fails the page
> > fault handler wants to inject a VMEXIT(#PF) into the guest to
> > let the guest fix its shadow page table. If the guest page walk
> > is successfull the page fault intercept handler wants to inject the
> > page fault exception into the nested guest.
>
> OK, I think I'm getting tied up in the naming scheme.  Let me try to lay
> out what I think is going on and you can tell me where I'm going wrong.
>
> If the L0 Xen is using shadow pagetables, then it must be intercepting
> #PF.  We expect the guest to be using shadows (and intercepting #PF) too.
>
> When an actual #PF occurs when L2 is running, we VMEXIT to L0, which
> walks the pagetables provided by L1.  In the interesting case, L0 sees
> that the L1 pagetables justify the fault. It injects #PF into the VM. 

> If the L1 guest is using shadows, it intercepts #PF and does its own
> shadow pagetable tricks (which might involve it injecting #PF into the
> L2 guest).  If it's not, the injected #PF goes straight to the L2.

Correct.

> > The page fault intercept handler in
> > SVM (see [PATCH 10/14] Nested Virtualization: svm specific
> > implementation) assumes that the guest intercepts a page fault.
> > It uses the return value to check if hvm_inject_exception() did what is
> > expected: Injecting a VMEXIT(#PF), which is the case when the assumption
> > is correct.
> > The page fault intercept handler calls svm_inject_exception() to inject
> > a page fault into the nested guest.
>
> The new return code from hvm_inject_exception() is
> 0: Normal injection into the running L1 or the running L2.
> 1: VMEXIT from the running L2 to the L1, caused by injecting an
>    intercepted exception. (This is the expected case in the scenario
>    above).
> -1: Any other case.

Correct.

> The logic in svm_vmexit_handler() when the L0 shadow code decides to
> inject #PF is now:
>
> if ( L2 is running and L1 is not using HAP (i.e. sh-on-hap or sh-on-sh) )
> {
>     Inject #PF (allowing the L1 to intercept);
>     If the L1 didn't intercept (or injection failed)
>         then crash the L1.
> } else (i.e L1 running directly or hap-on-hap) {
>     Inject directly, ignoring the L1 intercepts.
> }

Correct.

> I don't see why this change is needed.  AFAICS, all cases are covered by
> unconditionally calling hvm_inject_exception() here.  *-on-hap never
> takes this path at all because L0 doesn't intercept #PF when it uses
> HAP, so the only difference this makes is to catch the case where L1
> didn't intercept #PF and it was injected directly into L2.

Correct. How should L1 fix its shadow page table in this case?
I expect L2 to go wild because of that.

> But this is an acceptable thing for the L1 to do (even though Xen doesn't
> ever behave that way), so I think it's wrong to crash the guest.

Ok, that is the point where our opinions differ. Can you explain me why
this is acceptable? As I said above, I expect the L2 guest to go wild in
this case.

> What was the reason for calling svm_inject_exception() directly in some
> cases?

svm_inject_exception() always injects a #PF into running L1 or L2. It never
injects a VMEXIT into L1.

> Cheers,
>
> Tim.
>
> > If you can invalidate this error check reason then yes, I can go back
> > to make hvm_inject_exception() return void.
> >
> > Christoph


-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632

  reply	other threads:[~2010-08-10 12:25 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-05 15:02 [PATCH 07/14] Nested Virtualization: trap Christoph Egger
2010-08-09 12:44 ` Tim Deegan
2010-08-10  8:55   ` Christoph Egger
2010-08-10 10:48     ` Tim Deegan
2010-08-10 12:25       ` Christoph Egger [this message]
2010-08-10 12:56         ` Tim Deegan
2010-08-10 13:37           ` Christoph Egger
     [not found] <1A42CE6F5F474C41B63392A5F80372B22A3E5B97@shsmsx501.ccr.corp.intel.com>
2010-08-19  2:44 ` Dong, Eddie
2010-08-19  8:35   ` Tim Deegan
2010-08-19 10:32     ` Christoph Egger
2010-08-19 14:12       ` Dong, Eddie
2010-08-19 13:53     ` Dong, Eddie
2010-08-19 14:30       ` Tim Deegan
2010-08-23  3:12         ` Dong, Eddie
2010-08-31 10:34           ` Tim Deegan
2010-08-23 16:03         ` Christoph Egger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201008101425.11212.Christoph.Egger@amd.com \
    --to=christoph.egger@amd.com \
    --cc=Tim.Deegan@citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.