|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/hvm: Disallow moving the APIC MMIO window
On Mon, Dec 10, 2018 at 04:20:07PM +0000, Andrew Cooper wrote:
> On 10/12/2018 16:14, Roger Pau Monné wrote:
> > On Mon, Dec 10, 2018 at 11:45:13AM +0000, Andrew Cooper wrote:
> >> See the code comment for a full discussion, but in short: guests which
> >> currently run under Xen don't move the window, because moving it has never
> >> worked properly. Implementing support for moving the window is never
> >> going to
> >> work architecturally unless we switch to per-vcpu P2Ms (which seems very
> >> unlikely), and would still be a substantial quantity of work for a feature
> >> which is unused in practice.
> >>
> >> Take the opportunity to rename vlapic_msr_set() to be consistent with the
> >> other MSR handling functions, and return X86EMUL_* constants. Move the
> >> guest_{rd,wr}msr_x2apic() declarations into vlapic.h which is a more
> >> appropriate place for them to live.
> >>
> >> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> >> ---
> >> CC: Jan Beulich <JBeulich@xxxxxxxx>
> >> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> >> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> >> ---
> >> xen/arch/x86/hvm/hvm.c | 4 +--
> >> xen/arch/x86/hvm/vlapic.c | 60
> >> ++++++++++++++++++++++++++++++++++++----
> >> xen/include/asm-x86/hvm/hvm.h | 3 --
> >> xen/include/asm-x86/hvm/vlapic.h | 5 +++-
> >> 4 files changed, 59 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> >> index 0039e8c..50fa995 100644
> >> --- a/xen/arch/x86/hvm/hvm.c
> >> +++ b/xen/arch/x86/hvm/hvm.c
> >> @@ -3565,9 +3565,7 @@ int hvm_msr_write_intercept(unsigned int msr,
> >> uint64_t msr_content,
> >> break;
> >>
> >> case MSR_APIC_BASE:
> >> - if ( !vlapic_msr_set(vcpu_vlapic(v), msr_content) )
> >> - goto gp_fault;
> >> - break;
> >> + return guest_wrmsr_apic_base(v, msr_content);
> >>
> >> case MSR_IA32_TSC_DEADLINE:
> >> vlapic_tdt_msr_set(vcpu_vlapic(v), msr_content);
> >> diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
> >> index d3a5fb5..1c72573 100644
> >> --- a/xen/arch/x86/hvm/vlapic.c
> >> +++ b/xen/arch/x86/hvm/vlapic.c
> >> @@ -1072,15 +1072,63 @@ static void set_x2apic_id(struct vlapic *vlapic)
> >> vlapic_set_reg(vlapic, APIC_LDR, ldr);
> >> }
> >>
> >> -bool_t vlapic_msr_set(struct vlapic *vlapic, uint64_t value)
> >> +int guest_wrmsr_apic_base(struct vcpu *v, uint64_t value)
> >> {
> >> - if ( !has_vlapic(vlapic_domain(vlapic)) )
> >> - return 0;
> >> + struct vlapic *vlapic = vcpu_vlapic(v);
> >> +
> >> + if ( !has_vlapic(v->domain) )
> >> + return X86EMUL_EXCEPTION;
> >> +
> >> + /*
> >> + * Architecturally speaking, we should allow a guest to move the xAPIC
> >> + * MMIO window (within reason - not even hardware allows arbitrary
> >> + * positions). However, virtualising the behaviour for multi-vcpu
> >> guests
> >> + * is problematic.
> >> + *
> >> + * The ability to move the MMIO window was introduced with the
> >> Pentium Pro
> >> + * processor, to deconflict the window with other MMIO in the system.
> >> The
> >> + * need to move the MMIO window was obsoleted by the Netburst
> >> architecture
> >> + * which reserved the space in physical address space for MSIs.
> >> + *
> >> + * As such, it appears to be a rarely used feature before the turn of
> >> the
> >> + * millennium, and entirely unused after.
> >> + *
> >> + * Xen uses a per-domain P2M, but MSR_APIC_BASE is per-vcpu. In
> >> + * principle, we could emulate the MMIO windows being in different
> >> + * locations by ensuring that all windows are unmapped in the P2M and
> >> trap
> >> + * for emulation. Xen has never had code to modify the P2M in
> >> response to
> >> + * APIC_BASE updates, so guests which actually try this are likely to
> >> end
> >> + * up without a working APIC.
> >> + *
> >> + * Things are more complicated with hardware APIC acceleration, where
> >> Xen
> >> + * has to map a sink-page into the P2M for APIC accesses to be
> >> recognised
> >> + * and accelerated by microcode. Again, this could in principle be
> >> + * emulated, but the visible result in the guest would be multiple
> >> working
> >> + * APIC MMIO windows. Moving the APIC window has never caused the
> >> + * sink-page to move in the P2M, meaning that on all modern hardware,
> >> the
> >> + * APIC definitely ceases working if the guest tries to move the
> >> window.
> >> + *
> >> + * As such, when the APIC is configured in xAPIC mode, require the
> >> MMIO
> >> + * window to be in its default location. We don't expect any guests
> >> which
> >> + * currently run on Xen to be impacted by this restriction, and the
> >> #GP
> >> + * fault will be far more obvious to debug than a malfunctioning MMIO
> >> + * window.
> >> + */
> >> + if ( ((value & (APIC_BASE_EXTD | APIC_BASE_ENABLE)) ==
> >> APIC_BASE_ENABLE) &&
> >> + ((value & ~(APIC_BASE_BSP | APIC_BASE_EXTD | APIC_BASE_ENABLE))
> >> !=
> > You could use MSR_IA32_APICBASE_BASE here AFAICT.
>
> That no longer exists in staging, but either way, that would be buggy.
> I suppose I should split the actually-reserved bit checking out into an
> earlier check. Nothing at the moment prevents the guest from setting
> the reserved bits.
Oh, I was looking at an old version of the tree, that's
APIC_BASE_ADDR_MASK now.
Moving the reserved bit checking vs the MMIO window movement would be
better.
> >
> >> + APIC_DEFAULT_PHYS_BASE) )
> >> + {
> >> + dprintk(XENLOG_INFO,
> >> + "%pv attempted to move the APIC MMIO window to
> >> 0x%08"PRIx64"\n",
> >> + v, value);
> > I think you should use PAGE_MASK, or else the message is misleading
> > because you are actually printing the MSR value, which apart from the
> > address also contains flags in the low 12 bits.
>
> Printing the lower metadata is important for diagnostics, even if only
> to double check the logic leading up to the printk(). (Also, I note it
> should be XENLOG_G_INFO)
I agree, but I think the message is kind of misleading because you are
not printing an address but the attempted MSR write value, that was
the point I was trying to make with my comment. I would reword to
"attempted to move the APIC MMIO window, MSR write: ..." or something
similar.
Thanks, Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |