|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 for-4.15] x86/msr: introduce an option for compatible MSR behavior selection
On Tue, Mar 09, 2021 at 07:13:26PM +0000, Andrew Cooper wrote:
> On 09/03/2021 10:56, Roger Pau Monne wrote:
> > Introduce an option to allow selecting a behavior similar to the pre
> > Xen 4.15 one for accesses to MSRs not explicitly handled. Since commit
> > 84e848fd7a162f669 and 322ec7c89f6640e accesses to MSRs not explicitly
> > handled by Xen result in the injection of a #GP to the guest. This
> > is a behavior change since previously a #GP was only injected if
> > accessing the MSR on the real hardware would also trigger a #GP, or if
> > the attempted to be set bits wouldn't match the hardware values (for
> > PV).
> >
> > This seems to be problematic for some guests, so introduce an option
> > to fallback to this kind of legacy behavior without leaking the
> > underlying MSR values to the guest.
> >
> > When the option is set, for both PV and HVM don't inject a #GP to the
> > guest on MSR read if reading the underlying MSR doesn't result in a
> > #GP, do the same for writes and simply discard the value to be written
> > on that case.
> >
> > Note that for guests restored or migrated from previous Xen versions
> > the option is enabled by default, in order to keep a compatible
> > MSR behavior. Such compatibility is done at the libxl layer, to avoid
> > higher-level toolstacks from having to know the details about this flag.
> >
> > Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
>
> Thankyou for doing this. By and large, Reviewed-by: Andrew Cooper
> <andrew.cooper3@xxxxxxxxxx>, subject to some pandoc syntax fixes below.
Thanks.
> However, I think it is worth saying explicitly that the reasons behind
> the changes in 84e848fd7a162f669 and 322ec7c89f6640e (not leaking
> hardware MSRs, and not breaking #GP-probing) are still legitimate, and
> this influences the change in behaviour between msr_relaxed and 4.14
> (i.e. read-as-zero rather than leaking).
Right, I tried to convey this fact by using "compatible" behavior
instead of "legacy" one, as the behavior provided by msr_relaxed is
not exactly the same as what you would get on 4.14.
I've added the following at the end of the first paragraph:
"The reasons for not leaking hardware MSR values and injecting a
#GP are fully valid, so the solution proposed here should be
considered a temporary workaround until all the required MSRs are
properly handled."
> > diff --git a/docs/misc/xen-command-line.pandoc
> > b/docs/misc/xen-command-line.pandoc
> > index 4737c92bfe..6cf61a5c57 100644
> > --- a/docs/misc/xen-command-line.pandoc
> > +++ b/docs/misc/xen-command-line.pandoc
> > @@ -740,7 +740,7 @@ Specify the bit width of the DMA heap.
> >
> > ### dom0
> > = List of [ pv | pvh, shadow=<bool>, verbose=<bool>,
> > - cpuid-faulting=<bool> ]
> > + cpuid-faulting=<bool>, msr-relaxed=<bool> ]
> >
> > Applicability: x86
> >
> > @@ -789,6 +789,21 @@ Controls for how dom0 is constructed on x86 systems.
> > restore the pre-4.13 behaviour. If specifying `no-cpuid-faulting`
> > fixes
> > an issue in dom0, please report a bug.
> >
> > +* msr-relaxed: Select whether to use a relaxed behavior for accesses to
> > MSRs
> > + not explicitly handled by Xen instead of injecting a #GP to dom0.
> > + Such access mode will force Xen to replicate the behavior from the
> > hardware
> > + it's currently running on in order to decide whether a #GP is injected
> > to
> > + dom0 for MSR reads. Note that dom0 is never allowed to read the value
> > of
> > + unhandled MSRs, this option only changes whether a #GP might be
> > injected
> > + or not. For writes a #GP won't be injected as long as reading the
> > + underlying MSR doesn't result in a #GP.
>
> I don't find this overly clear to follow, and it also misses stating the
> default explicitly. How about:
>
> ---8<---
> The `msr-relaxed` boolean is an interim option, and defaults to false.
>
> In Xen 4.15, the default behaviour for unhandled MSRs has been changed,
> to avoid leaking host data into guests, and to avoid breaking guest
> logic which uses \#GP probing to identify the availability of MSRs.
>
> However, this new stricter behaviour has the possibility to break
> guests, and a more 4.14-like behaviour can be selected by specifying
> `dom0=msr-relaxed`.
>
> If using this option is necessary to fix an issue, please report a bug.
> ---8<---
OK, this seems to be less verbose that what I previously had, but I'm
fine with it. I assume this should also be changed in xl.cfg then?
> Other pending Sphinx work is drawing together the "how to contact us"
> information, so the various "please report a bug"s through this document
> will turn into links.
>
> > diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> > index 23bbb6e8c1..d217c223b0 100644
> > --- a/xen/arch/x86/setup.c
> > +++ b/xen/arch/x86/setup.c
> > @@ -749,6 +749,7 @@ static struct domain *__init create_dom0(const module_t
> > *image,
> > .max_grant_frames = -1,
> > .max_maptrack_frames = -1,
> > .max_vcpus = dom0_max_vcpus(),
> > + .arch.domain_flags = opt_dom0_msr_relaxed ? XEN_X86_MSR_RELAXED :
> > 0,
>
> Can I request
>
> .arch = {
> .domain_flags = opt_dom0_msr_relaxed ? XEN_X86_MSR_RELAXED : 0,
> },
>
> please, to reduce the patch complexity of further additions inside .arch.
Sure.
> > diff --git a/xen/include/public/arch-x86/xen.h
> > b/xen/include/public/arch-x86/xen.h
> > index 629cb2ba40..f9d0e33b94 100644
> > --- a/xen/include/public/arch-x86/xen.h
> > +++ b/xen/include/public/arch-x86/xen.h
> > @@ -304,6 +304,14 @@ struct xen_arch_domainconfig {
> > XEN_X86_EMU_PIT |
> > XEN_X86_EMU_USE_PIRQ |\
> > XEN_X86_EMU_VPCI)
> > uint32_t emulation_flags;
> > +
> > +/*
> > + * Select whether to use a relaxed behavior for accesses to MSRs not
> > explicitly
> > + * handled by Xen instead of injecting a #GP to the guest. Note this option
> > + * doesn't allow the guest to read or write to the underlying MSR.
> > + */
> > +#define XEN_X86_MSR_RELAXED (1u << 0)
> > + uint32_t domain_flags;
>
> The domain prefix is somewhat redundant, given the name of the structure
> or the hypercall it is used for. OTOH, 'flags' on its own probably
> isn't ok. Thoughts on misc_flags?
I'm fine with it, will change unless Jan objects to the name.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |