[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 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. > + 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. 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 |