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.