xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: George.Dunlap@eu.citrix.com, tim@xen.org, eddie.dong@intel.com,
	keir.xen@gmail.com, jun.nakajima@intel.com,
	xen-devel@lists.xenproject.org
Subject: Re: [V9 PATCH 7/8] pvh dom0: check for vioapic null ptr in vioapic_range
Date: Mon, 5 May 2014 17:19:09 -0700	[thread overview]
Message-ID: <20140505171909.141ab75b@mantra.us.oracle.com> (raw)
In-Reply-To: <5358D028020000780000BCE2@nat28.tlf.novell.com>

On Thu, 24 Apr 2014 07:49:44 +0100
"Jan Beulich" <JBeulich@suse.com> wrote:

> >>> On 23.04.14 at 23:18, <mukesh.rathor@oracle.com> wrote:
> > On Wed, 23 Apr 2014 10:07:25 +0100
> > "Jan Beulich" <JBeulich@suse.com> wrote:
> > 
> >> >>> On 23.04.14 at 02:11, <mukesh.rathor@oracle.com> wrote:
> >> > On Tue, 22 Apr 2014 08:33:29 +0100
> >> > "Jan Beulich" <JBeulich@suse.com> wrote:
> >> >> >>> On 22.04.14 at 02:59, <mukesh.rathor@oracle.com> wrote:
> > ......
.....
> >> >   So it must have been the third one that I had observed the
> >> >   vioapic_range crash in a while ago, and had made note of it.
> >> > Looking at it:
> >> > 
> >> >     if ( (p2mt == p2m_mmio_dm) ||
> >> >          (access_w && (p2mt == p2m_ram_ro)) )
> >> >     {
> >> >         put_gfn(p2m->domain, gfn);
> >> >         if ( !handle_mmio() )
> >> > 
> >> > doesn't seem apply to domu. Unfortunately, I can't reproduce it
> >> > now so maybe it was an ept violation due to some bug, and a
> >> > crash in vioapic_range before printing the gfn/mfns etc by
> >> > ept_handle_violation made me make a note to put a check in it.
> >> 
> >> Which makes me think that we don't need the patch at all.
> > 
> > Well, without this patch, in case of dom0 EPT violation, dom0 will
> > not die gracefully printing gfn/mfn/etc.. info. But instead it will
> > show fault in vioapic_range. 
> > 
> > 
> > ept_handle_violation() 
> >        hvm_hap_nested_page_fault()
> >              -> handle_mmio() -----> vioapic_range() : KABOOM!!
> > 
> >        gdprintk(XENLOG_ERR, "EPT violation %#lx (%c%c%c/%c%c%c), "
> >                     "gpa %#"PRIpaddr", mfn %#lx, type %i.\n",
> >                                  qualification,  <=== NOT REACHED
> >           .......

... 

> So we're moving in circles I'm afraid: You told us that I/O emulation
> is being handled by a separate path from HVM's, which means either
> handle_mmio() separates the cases itself, or doesn't even get
> called, only to then again show us the call sequence above. One
> of the two statements can't be correct, and what I'd like you to do
> about it depends on which one it is.

Ok, nailed it!! The issue is guest causing EPT violation because
of bad pfn in it's pte, not for mmio emulation.

ept_handle_violation calls hvm_hap_nested_page_fault() which has
three calls to handle_mmio(). The first two are skipped for pvh,
but before the 3rd call, the function does:

    mfn = get_gfn_type_access(p2m, gfn, &p2mt, &p2ma,
                              P2M_ALLOC | (access_w ? P2M_UNSHARE : 0), NULL);

Since, the pfn is invalid, this returns p2m_mmio_dm which is the
default return for non-ram for, I think, historical reasons: 

    ept_get_entry():
          *t = p2m_mmio_dm;

This causes 3rd handle_mmio in hvm_hap_nested_page_fault to be called for pvh:

    if ( (p2mt == p2m_mmio_dm) ||
         (access_w && (p2mt == p2m_ram_ro)) )
    {
        put_gfn(p2m->domain, gfn);
        if ( !handle_mmio() )  <==========
            hvm_inject_hw_exception(TRAP_gp_fault, 0);

which would result in vioapic_range panic in xen.

I was on the right track before, just couldn't come up with where 
p2m_mmio_dm was coming from. Anyways, so:


 1. We can go with the patch that adds pvh_mmio_handlers in anticipation 
    of future msix, hpet support:

+static const struct hvm_mmio_handler *const
+pvh_mmio_handlers[HVM_MMIO_HANDLER_NR] =
...

    That would naturally return X86EMUL_UNHANDLEABLE in this case. 

    OUTCOME: guest would be injected with GPF, but xen won't crash it.


 2. We could go with vioapic null ptr check in vioapic_range() itself,
    thus causing handle_mmio to return X86EMUL_UNHANDLEABLE also.

    OUTCOME: guest would be injected with GPF, but xen won't crash it.


 3. Add pvh check above in hvm_hap_nested_page_fault:

        put_gfn(p2m->domain, gfn);
        if ( is_pvh_vcpu(v) )
        {
            rc = 0;
            goto out;
        }
        if ( !handle_mmio() )  <==========
            hvm_inject_hw_exception(TRAP_gp_fault, 0);
...

    OUTCOME: xen would crash guest with the nice ept violation message.


 4. Add check for pvh in handle_mmio:

 int handle_mmio(void)
 {
      int rc;

      if ( is_pvh_vcpu(current) )
          return X86EMUL_UNHANDLEABLE;
     ... 

    OUTCOME: guest would be injected with GPF, but xen won't crash it.


 5. Do 1/2/4 above, but in addition, in hvm_hap_nested_page_fault() do:

    if ( (p2mt == p2m_mmio_dm) ||
         (access_w && (p2mt == p2m_ram_ro)) )
    {
        put_gfn(p2m->domain, gfn);
        rc = 1;
        if ( !handle_mmio() )  <==========
        {
            if ( is_pvh_vcpu )
                rc = 0;
            else
                hvm_inject_hw_exception(TRAP_gp_fault, 0);
        }
        goto out;
    }

    OUTCOME: xen would crash guest with the nice ept violation message
             that prints all the details.

Please lmk your thoughts and preference, and I'll submit patch. The patch
would not be part of dom0 pvh series, as a pvh domU ept violation
could cause this xen panic too in vioapic_range. We may wanna backport
it too (not sure because of experimental nature of the feature).

thanks,
Mukesh

  parent reply	other threads:[~2014-05-06  0:19 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-16  0:12 [V9 PATCH 0/8] pvh dom0 patches Mukesh Rathor
2014-04-16  0:12 ` [V9 PATCH 1/8] pvh dom0: move some pv specific code to static functions Mukesh Rathor
2014-04-16  0:12 ` [V9 PATCH 2/8] pvh dom0: construct_dom0 changes Mukesh Rathor
2014-04-16  0:12 ` [V9 PATCH 3/8] pvh dom0: Introduce p2m_map_foreign Mukesh Rathor
2014-04-16  0:12 ` [V9 PATCH 4/8] pvh dom0: Add checks and restrictions for p2m_is_foreign Mukesh Rathor
2014-04-16 15:28   ` Jan Beulich
2014-04-16  0:12 ` [V9 PATCH 5/8] pvh dom0: make xsm_map_gmfn_foreign available for x86 Mukesh Rathor
2014-04-16 14:29   ` Daniel De Graaf
2014-04-16  0:12 ` [V9 PATCH 6/8] pvh dom0: Add and remove foreign pages Mukesh Rathor
2014-04-16 16:00   ` Jan Beulich
2014-04-17  1:37     ` Mukesh Rathor
2014-04-17  6:50       ` Jan Beulich
2014-04-17 12:36         ` Tim Deegan
2014-04-17 13:58           ` Jan Beulich
2014-04-19  0:59             ` Mukesh Rathor
2014-04-21 16:10               ` Jan Beulich
2014-04-24  2:21             ` Mukesh Rathor
2014-04-24  6:44               ` Jan Beulich
2014-04-24  9:46               ` Tim Deegan
2014-04-25  2:09                 ` Mukesh Rathor
2014-04-25  6:49                   ` Jan Beulich
2014-04-25 23:23                     ` Mukesh Rathor
2014-04-26  0:06                     ` Mukesh Rathor
2014-04-28  7:23                       ` Jan Beulich
2014-04-25  8:55                   ` Tim Deegan
2014-04-25 23:29                     ` Mukesh Rathor
2014-04-26  1:34                   ` Mukesh Rathor
2014-04-28  8:54                     ` Jan Beulich
2014-04-28  9:09                       ` Tim Deegan
2014-04-22  0:19       ` Mukesh Rathor
2014-04-22  7:28         ` Jan Beulich
2014-04-23  0:28           ` Mukesh Rathor
2014-04-23  9:03             ` Jan Beulich
2014-04-23 16:13               ` Andres Lagar-Cavilla
2014-04-24 16:37                 ` Tim Deegan
2014-04-16  0:12 ` [V9 PATCH 7/8] pvh dom0: check for vioapic null ptr in vioapic_range Mukesh Rathor
2014-04-16 16:05   ` Jan Beulich
2014-04-17  1:44     ` Mukesh Rathor
2014-04-17  6:54       ` Jan Beulich
2014-04-22  0:59         ` Mukesh Rathor
2014-04-22  7:33           ` Jan Beulich
2014-04-23  0:11             ` Mukesh Rathor
2014-04-23  9:07               ` Jan Beulich
2014-04-23 21:18                 ` Mukesh Rathor
2014-04-24  6:49                   ` Jan Beulich
2014-04-24 23:28                     ` Mukesh Rathor
2014-05-06  0:19                     ` Mukesh Rathor [this message]
2014-05-06  7:44                       ` Jan Beulich
2014-05-07  1:07                         ` Mukesh Rathor
2014-05-07  6:47                           ` Jan Beulich
2014-05-07 23:52                             ` Mukesh Rathor
2014-05-08  6:33                               ` Jan Beulich
2014-04-16  0:12 ` [V9 PATCH 8/8] pvh dom0: add opt_dom0pvh to setup.c Mukesh Rathor
2014-04-16 12:57   ` Konrad Rzeszutek Wilk
2014-04-16 13:01   ` Andrew Cooper
2014-04-16 16:09   ` Jan Beulich
2014-04-16 14:57 ` [V9 PATCH 0/8] pvh dom0 patches Roger Pau Monné
2014-04-16 21:15   ` Mukesh Rathor

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=20140505171909.141ab75b@mantra.us.oracle.com \
    --to=mukesh.rathor@oracle.com \
    --cc=George.Dunlap@eu.citrix.com \
    --cc=JBeulich@suse.com \
    --cc=eddie.dong@intel.com \
    --cc=jun.nakajima@intel.com \
    --cc=keir.xen@gmail.com \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).