Re: [PATCH RFC 01/39] KVM: x86: fix Xen hypercall page msr handling

From: Joao Martins
Date: Fri Feb 22 2019 - 06:48:11 EST


On 2/22/19 1:30 AM, Sean Christopherson wrote:
> On Wed, Feb 20, 2019 at 08:15:31PM +0000, Joao Martins wrote:
>> Xen usually places its MSR at 0x4000000 or 0x4000200 depending on
>> whether it is running in viridian mode or not. Note that this is not
>> ABI guaranteed, so it is possible for Xen to advertise the MSR some
>> place else.
>>
>> Given the way xen_hvm_config() is handled, if the former address is
>> selected, this will conflict with HyperV's MSR
>> (HV_X64_MSR_GUEST_OS_ID) which uses the same address.
>
> Unconditionally servicing Hyper-V and KVM MSRs seems wrong, i.e. KVM
> should only expose MSRs specific to a hypervisor if userspace has
> configured CPUID to advertise support for said hypervisor.
>
Yeah, that makes sense.

> If we do the
> same thing for Xen, then the common MSR code looks like:
>
> if (kvm_advertise_kvm()) {
> if (<handle kvm msr>)
> return ...;
> } else if (kvm_advertise_hyperv()) {
> if (<handle hyperv msr>)
> return ...;
> } else if (kvm_advertise_xen()) {
> if (<handle xen msrs>)
> return ...;
> }
>
> <fall through to main switch statement>
>
> Obviously assumes KVM only advertises itself as one hypervisor, and so
> the ordering is arbitrary.
>
One thing to consider on the above is that there might be multiple hypervisors
in advertised in the hypervisor leaf. Which is used when you want to run a KVM
guest but with Hyper-V drivers, or an Hyper-V guest with KVM extensions or VirtIO.

The else part would probably need to be removed as IIUC when multiple
hypervisors are advertised (e.g. KVM in leaf 0x40000000, Hyper-V in leaf
0x40000100) you are still allowed to use all of its features.