xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Tim Deegan <tim@xen.org>
Cc: Xen-devel@lists.xensource.com, keir.xen@gmail.com
Subject: Re: [V10 PATCH 23/23] PVH xen: introduce vmexit handler for PVH
Date: Thu, 25 Jul 2013 19:30:57 -0700	[thread overview]
Message-ID: <20130725193057.434cd254@mantra.us.oracle.com> (raw)
In-Reply-To: <20130725162840.GD87903@ocelot.phlegethon.org>

On Thu, 25 Jul 2013 17:28:40 +0100
Tim Deegan <tim@xen.org> wrote:

> At 18:59 -0700 on 23 Jul (1374605971), Mukesh Rathor wrote:
> > +/* Just like HVM, PVH should be using "cpuid" from the kernel
> > mode. */ +static int vmxit_invalid_op(struct cpu_user_regs *regs)
> > +{
> > +    if ( guest_kernel_mode(current, regs)
> > || !emulate_forced_invalid_op(regs) )
> > +        hvm_inject_hw_exception(TRAP_invalid_op,
> > HVM_DELIVER_NO_ERROR_CODE);
> 
> Was this discussed before?  It seems harsh to stop kernel-mode code
> from using the pv cpuid operation if it wants to.  In particular,
> what about loadable kernel modules?

Yes, few times on the xen mailing list. The only PVH guest, linux
as of now, the pv ops got rewired to use native cpuid, which is
how hvm does it. So, couldn't come up with any real reason
to support it. The kernel modules in pv ops will go thru native_cpuid
too, which will do hvm cpuid too.


> If you do go with this restriction, please document it in
> include/public/arch-x86/xen.h beside the XEN_CPUID definition.

Ok, I'll add it there.

> > +/* Returns: rc == 0: success. */
> > +static int access_cr0(struct cpu_user_regs *regs, uint acc_typ,
> > uint64_t *regp) +{
> > +    struct vcpu *vp = current;
> > +
> > +    if ( acc_typ == VMX_CONTROL_REG_ACCESS_TYPE_MOV_TO_CR )
> > +    {
> > +        unsigned long new_cr0 = *regp;
> > +        unsigned long old_cr0 = __vmread(GUEST_CR0);
> > +
> > +        dbgp1("PVH:writing to CR0. RIP:%lx val:0x%lx\n",
> > regs->rip, *regp);
> > +        if ( (u32)new_cr0 != new_cr0 )
> > +        {
> > +            printk(XENLOG_G_WARNING
> > +                   "Guest setting upper 32 bits in CR0: %lx",
> > new_cr0);
> > +            return -EPERM;
> 
> AFAICS returning non-zero here crashes the guest.  Shouldn't this
> inject #GP instead?

Right, GPF it is.

.....

> > +
> > +        if ( new & HVM_CR4_GUEST_RESERVED_BITS(vp) )
> > +        {
> > +            printk(XENLOG_G_WARNING
> > +                   "PVH guest attempts to set reserved bit in CR4:
> > %lx", new);
> > +            hvm_inject_hw_exception(TRAP_gp_fault, 0);
> > +            return 0;
> > +        }
> > +
> > +        if ( !(new & X86_CR4_PAE) && hvm_long_mode_enabled(vp) )
> > +        {
> > +            printk(XENLOG_G_WARNING "Guest cleared CR4.PAE while "
> > +                   "EFER.LMA is set");
> > +            hvm_inject_hw_exception(TRAP_gp_fault, 0);
> > +            return 0;
> > +        }
> > +
> > +        vp->arch.hvm_vcpu.guest_cr[4] = new;
> > +
> > +        if ( (old_val ^ new) & (X86_CR4_PSE | X86_CR4_PGE |
> > X86_CR4_PAE) )
> > +            vpid_sync_all();
> > +
> > +        __vmwrite(CR4_READ_SHADOW, new);
> > +
> > +        new &= ~X86_CR4_PAE;         /* PVH always runs with hap
> > enabled. */
> 
> The equivalent mask in vmx_update_guest_cr() is masking out a default
> setting of CR4.PAE _before_ the guest's requested bits get ORred in.
> This is masking out the PAE bit that we just insisted on.  I'm
> surprised that VMENTER doesn't choke on this -- I guess it uses
> VM_ENTRY_IA32E_MODE rather than looking at these bits at all.

Ah, I see. what a mess! Hmm... I can't find much in the VMX sections
of the SDM on this. Not sure what I should do here. How about just
not clearing the X86_CR4_PAE, so the GUEST_CR4 will have it
if it's set in new, ie, the guest wants it set? ie, :
...
        __vmwrite(CR4_READ_SHADOW, new);

        new |= X86_CR4_VMXE | X86_CR4_MCE;
        __vmwrite(GUEST_CR4, new);
...


> > +        new |= X86_CR4_VMXE | X86_CR4_MCE;
> > +        __vmwrite(GUEST_CR4, new);
> > +    }
> > +    else
> > +        *regp = __vmread(CR4_READ_SHADOW);
> > +
> > +    return 0;
> > +}
> > +
> > +/* Returns: rc == 0: success, else -errno. */
> > +static int vmxit_cr_access(struct cpu_user_regs *regs)
> > +{
> > +    unsigned long exit_qualification =
> > __vmread(EXIT_QUALIFICATION);
> > +    uint acc_typ = VMX_CONTROL_REG_ACCESS_TYPE(exit_qualification);
> > +    int cr, rc = -EINVAL;
> > +
> > +    switch ( acc_typ )
> > +    {
> > +    case VMX_CONTROL_REG_ACCESS_TYPE_MOV_TO_CR:
> > +    case VMX_CONTROL_REG_ACCESS_TYPE_MOV_FROM_CR:
> > +    {
> > +        uint gpr = VMX_CONTROL_REG_ACCESS_GPR(exit_qualification);
> > +        uint64_t *regp = decode_register(gpr, regs, 0);
> > +        cr = VMX_CONTROL_REG_ACCESS_NUM(exit_qualification);
> > +
> > +        if ( regp == NULL )
> > +            break;
> > +
> > +        switch ( cr )
> > +        {
> > +        case 0:
> > +            rc = access_cr0(regs, acc_typ, regp);
> > +            break;
> > +
> > +        case 3:
> > +            printk(XENLOG_G_ERR "PVH: unexpected cr3 vmexit.
> > rip:%lx\n",
> > +                   regs->rip);
> > +            domain_crash(current->domain);
> > +            break;
> > +
> > +        case 4:
> > +            rc = access_cr4(regs, acc_typ, regp);
> > +            break;
> > +        }
> > +        if ( rc == 0 )
> > +            vmx_update_guest_eip();
> > +        break;
> > +    }
> > +
> > +    case VMX_CONTROL_REG_ACCESS_TYPE_CLTS:
> > +    {
> > +        struct vcpu *vp = current;
> > +        unsigned long cr0 = vp->arch.hvm_vcpu.guest_cr[0] &
> > ~X86_CR0_TS;
> > +        vp->arch.hvm_vcpu.hw_cr[0] = vp->arch.hvm_vcpu.guest_cr[0]
> > = cr0; +
> > +        vmx_fpu_enter(vp);
> > +        __vmwrite(GUEST_CR0, cr0);
> > +        __vmwrite(CR0_READ_SHADOW, cr0);
> > +        vmx_update_guest_eip();
> > +        rc = 0;
> > +    }
> > +    }
> 
> No "case VMX_CONTROL_REG_ACCESS_TYPE_LMSW"?

Well, PVH is such a new concept, do you really think we need it? Lets
not hold the series just for this, we can always add in future :).

Thanks,
Mukesh

  reply	other threads:[~2013-07-26  2:30 UTC|newest]

Thread overview: 174+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-24  1:59 [V10 PATCH 00/23]PVH xen: Phase I, Version 10 patches Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 01/23] PVH xen: Add readme docs/misc/pvh-readme.txt Mukesh Rathor
2013-08-16 10:18   ` George Dunlap
2013-08-16 13:17     ` George Dunlap
2013-08-16 14:11       ` Konrad Rzeszutek Wilk
2013-08-16 21:39     ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 02/23] PVH xen: turn gdb_frames/gdt_ents into union Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 03/23] PVH xen: add params to read_segment_register Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 04/23] PVH xen: Move e820 fields out of pv_domain struct Mukesh Rathor
2013-07-24 11:29   ` Andrew Cooper
2013-07-24  1:59 ` [V10 PATCH 05/23] PVH xen: hvm related preparatory changes for PVH Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 06/23] PVH xen: vmx " Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 07/23] PVH xen: vmcs " Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 08/23] PVH xen: Introduce PVH guest type and some basic changes Mukesh Rathor
2013-08-06 11:29   ` George Dunlap
2013-08-06 11:47     ` Jan Beulich
2013-08-06 12:06       ` George Dunlap
2013-08-06 23:26         ` Mukesh Rathor
2013-08-07  7:14           ` Jan Beulich
2013-08-07  9:14           ` George Dunlap
2013-08-07 13:10             ` George Dunlap
2013-08-07 22:37               ` Mukesh Rathor
2013-08-08  8:57                 ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 09/23] PVH xen: introduce pvh_set_vcpu_info() and vmx_pvh_set_vcpu_info() Mukesh Rathor
2013-07-25 13:47   ` Tim Deegan
2013-07-26  0:58     ` Mukesh Rathor
2013-07-26 10:29       ` Tim Deegan
2013-08-05 11:08       ` Jan Beulich
2013-08-06  1:34         ` Mukesh Rathor
2013-08-07  1:53           ` Mukesh Rathor
2013-08-07  6:34             ` Jan Beulich
2013-08-07 10:01             ` Tim Deegan
2013-08-07 10:07               ` Ian Campbell
2013-08-08  1:27               ` Mukesh Rathor
2013-08-05 11:03   ` Jan Beulich
2013-08-05 11:10   ` Jan Beulich
2013-08-08  1:05     ` Mukesh Rathor
2013-08-08  6:56       ` Jan Beulich
2013-08-08 22:07         ` Mukesh Rathor
2013-08-09 23:41         ` Mukesh Rathor
2013-08-12  7:54           ` Jan Beulich
2013-08-12 10:24             ` Tim Deegan
2013-08-12 11:04               ` Jan Beulich
2013-08-12 11:53                 ` Tim Deegan
2013-08-12 13:24                   ` Jan Beulich
2013-08-13  0:28                     ` Mukesh Rathor
2013-08-13  0:27             ` Mukesh Rathor
2013-08-13 10:49               ` Jan Beulich
2013-08-14  2:21                 ` Mukesh Rathor
2013-08-12  9:00           ` Tim Deegan
2013-08-13  0:02             ` Mukesh Rathor
2013-08-13  8:51               ` Tim Deegan
2013-07-24  1:59 ` [V10 PATCH 10/23] PVH xen: domain create, context switch related code changes Mukesh Rathor
2013-07-25 14:01   ` Tim Deegan
2013-07-26  1:02     ` Mukesh Rathor
2013-08-05 11:16     ` Jan Beulich
2013-08-07 10:24   ` George Dunlap
2013-08-08  1:40     ` Mukesh Rathor
2013-08-08  7:29       ` Jan Beulich
2013-08-08  9:02         ` George Dunlap
2013-08-08  9:08           ` Jan Beulich
2013-08-09  0:12         ` Mukesh Rathor
2013-08-07 10:48   ` George Dunlap
2013-08-08  1:42     ` Mukesh Rathor
2013-08-08  9:14       ` George Dunlap
2013-08-16 15:32   ` George Dunlap
2013-08-16 16:11     ` Jan Beulich
2013-08-20  0:52       ` Mukesh Rathor
2013-08-20  9:29         ` George Dunlap
2013-08-22 23:24           ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 11/23] PVH xen: support invalid op emulation for PVH Mukesh Rathor
2013-08-07 11:29   ` George Dunlap
2013-08-08  1:49     ` Mukesh Rathor
2013-08-08  8:55       ` George Dunlap
2013-08-09  0:17         ` Mukesh Rathor
2013-08-10  2:13         ` Mukesh Rathor
2013-08-12  7:38           ` Jan Beulich
2013-08-14  1:13             ` Mukesh Rathor
2013-08-12  9:35           ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 12/23] PVH xen: Support privileged " Mukesh Rathor
2013-08-07 13:49   ` George Dunlap
2013-08-07 14:23     ` Jan Beulich
2013-08-07 14:47       ` George Dunlap
2013-08-08  1:59     ` Mukesh Rathor
2013-08-08  7:35       ` Jan Beulich
2013-08-08 14:21         ` George Dunlap
2013-08-08 14:18       ` George Dunlap
2013-08-08 14:36         ` George Dunlap
2013-08-09  1:32         ` Mukesh Rathor
2013-08-09  6:54           ` Jan Beulich
2013-08-09 18:10             ` Konrad Rzeszutek Wilk
2013-08-09 21:15               ` Keir Fraser
2013-08-12  9:43             ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 13/23] PVH xen: interrupt/event-channel delivery to PVH Mukesh Rathor
2013-08-07 15:37   ` George Dunlap
2013-08-08  2:05     ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 14/23] PVH xen: additional changes to support PVH guest creation and execution Mukesh Rathor
2013-08-07 15:50   ` George Dunlap
2013-08-08  8:21     ` Ian Campbell
2013-08-20 14:13   ` George Dunlap
2013-08-20 21:32     ` Mukesh Rathor
2013-08-21  8:37       ` George Dunlap
2013-08-22 23:27         ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 15/23] PVH xen: mapcache and show registers Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 16/23] PVH xen: mtrr, tsc, timers, grant changes Mukesh Rathor
2013-08-07 16:04   ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 17/23] PVH xen: Checks, asserts, and limitations for PVH Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 18/23] PVH xen: add hypercall support " Mukesh Rathor
2013-08-07 16:43   ` George Dunlap
2013-08-08  2:12     ` Mukesh Rathor
2013-08-08  7:41       ` Jan Beulich
2013-08-08  8:26         ` Ian Campbell
2013-08-09  0:55         ` Mukesh Rathor
2013-08-09  6:56           ` Jan Beulich
2013-08-08  9:20       ` George Dunlap
2013-08-08 10:18         ` Jan Beulich
2013-08-20 21:41         ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 19/23] PVH xen: vmcs related changes Mukesh Rathor
2013-08-09 10:25   ` George Dunlap
2013-08-10  0:23     ` Mukesh Rathor
2013-08-12  7:42       ` Jan Beulich
2013-08-12 10:15       ` George Dunlap
2013-08-12 10:17         ` George Dunlap
2013-08-12 11:22           ` George Dunlap
2013-08-12 11:25             ` George Dunlap
2013-08-12 13:53             ` Jan Beulich
2013-08-09 13:39   ` George Dunlap
2013-08-10  0:20     ` Mukesh Rathor
2013-08-19 16:00   ` George Dunlap
2013-08-19 16:03     ` George Dunlap
2013-08-19 22:38       ` Mukesh Rathor
2013-08-19 22:21     ` Mukesh Rathor
2013-08-20 14:27       ` George Dunlap
2013-08-20 22:48         ` Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 20/23] PVH xen: HVM support of PVH guest creation/destruction Mukesh Rathor
2013-07-24  1:59 ` [V10 PATCH 21/23] PVH xen: VMX " Mukesh Rathor
2013-08-05 11:25   ` Jan Beulich
2013-08-09 13:44   ` George Dunlap
2013-08-10  1:59     ` Mukesh Rathor
2013-08-12 10:23       ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 22/23] PVH xen: preparatory patch for the pvh vmexit handler patch Mukesh Rathor
2013-08-09 14:14   ` George Dunlap
2013-08-09 14:44     ` Konrad Rzeszutek Wilk
2013-08-09 14:47       ` George Dunlap
2013-07-24  1:59 ` [V10 PATCH 23/23] PVH xen: introduce vmexit handler for PVH Mukesh Rathor
2013-07-25 16:28   ` Tim Deegan
2013-07-26  2:30     ` Mukesh Rathor [this message]
2013-07-26 10:45       ` Tim Deegan
2013-08-07  0:37         ` Mukesh Rathor
2013-08-07  9:54           ` Tim Deegan
2013-08-15 15:51             ` George Dunlap
2013-08-15 16:37               ` Tim Deegan
2013-08-15 16:44                 ` George Dunlap
2013-08-05 11:37   ` Jan Beulich
2013-08-12 16:00   ` George Dunlap
2013-08-12 16:13     ` George Dunlap
2013-08-12 17:30     ` George Dunlap
2013-08-22  1:44     ` Mukesh Rathor
2013-08-22 23:22     ` Mukesh Rathor
2013-08-23  7:16       ` Jan Beulich
2013-08-23 22:51         ` Mukesh Rathor
2013-08-26  8:09           ` Jan Beulich
2013-08-12 16:21   ` George Dunlap
2013-08-22  1:46     ` Mukesh Rathor
2013-07-24  6:21 ` [V10 PATCH 00/23]PVH xen: Phase I, Version 10 patches Keir Fraser
2013-07-24 12:24   ` Andrew Cooper
2013-07-24 15:04     ` Konrad Rzeszutek Wilk
2013-07-24 20:25     ` Keir Fraser
2013-07-25  1:07     ` Mukesh Rathor
2013-07-27  1:05       ` Mukesh Rathor
2013-08-05 11:13         ` Jan Beulich
2013-07-25 16:39 ` Tim Deegan
2013-07-26 18:55   ` Mukesh Rathor
2013-07-27  0:59   ` 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=20130725193057.434cd254@mantra.us.oracle.com \
    --to=mukesh.rathor@oracle.com \
    --cc=Xen-devel@lists.xensource.com \
    --cc=keir.xen@gmail.com \
    --cc=tim@xen.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).