RE: [PATCH 2/6] KVM: x86: Mask off reserved bits in CPUID.80000006H

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I see. Thanks Jim!
It makes sense.
Eddie

> -----Original Message-----
> From: Jim Mattson <jmattson@xxxxxxxxxx>
> Sent: Tuesday, October 4, 2022 7:59 PM
> To: Dong, Eddie <eddie.dong@xxxxxxxxx>
> Cc: kvm@xxxxxxxxxxxxxxx; pbonzini@xxxxxxxxxx; Christopherson,, Sean
> <seanjc@xxxxxxxxxx>
> Subject: Re: [PATCH 2/6] KVM: x86: Mask off reserved bits in
> CPUID.80000006H
> 
> On Tue, Oct 4, 2022 at 5:08 PM Dong, Eddie <eddie.dong@xxxxxxxxx> wrote:
> >
> > > Hardware reserved CPUID bits are always zero today, though that may
> > > not be architecturally specified.
> >
> > entry->edx is initialized to native value in do_host_cpuid(), which executes
> physical CPUID.
> > I guess I am disconnected here.
> 
> Hardware values should only be passed through for features that KVM can
> support. Reserved bits should be set to 0, because KVM has no idea whether
> or not it will be able to support them once they are defined.
> 
> Perhaps an example will help.
> 
> At one time, leaf 7 was completely reserved. Following the principle that KVM
> should not pass through reserved CPUID bits, KVM zeroed out this leaf prior to
> commit 611c120f7486 ("KVM: Mask function7 ebx against host capability
> word9").
> Suppose that the legacy KVM had, as you suggest, passed through the
> hardware values for leaf 7. As CPUs appeared with SMEP, SMAP, Intel
> Processor Trace, SGX, and a whole slew of other features, that version of KVM
> would claim that it supported those features. Not true.
> 
> How would userspace be able to tell a version of KVM that could really support
> SMEP from one that just blindly passed the bit through without knowing what
> it meant? The KVM_GET_SUPPORTED_CPUID results would be identical.
> 
> In some cases, if KVM claims to support a feature that it doesn't (like SMEP), a
> guest that tries to use the feature will fail to boot (e.g. setting CR4.SMEP will
> raise an unexpected #GP).
> 
> However, as you alluded to earlier, zeroing out reserved bits does not always
> work out. Again, looking at leaf 7, the old KVM that clears all of leaf 7 claims
> legacy x87 behavior with respect to the FPU data pointer, FPU CS and FPU DS
> values, even on newer chips where that is not true. This is because of the two
> "reverse polarity" feature bits in leaf 7, where '0' indicates the presence of the
> feature and '1'
> indicates that the feature has been removed. At least, in this case, userspace
> can tell if KVM is wrong, just by querying CPUID leaf 7 itself. Long after leaf 7
> support was added to KVM, it continued to make the mistake of clearing those
> two bits. That bug wasn't addressed until commit e3bcfda012ed ("KVM: x86:
> Report deprecated x87 features in supported CPUID"). Fortunately, no
> software actually looks at those two bits.
> 
> The KVM_GET_SUPPORTED_CPUID API is abysmal, but it is what we have for
> now. The best thing we can do is to zero out reserved bits. Passing through the
> hardware values is likely to get us into trouble in the future, when those bits
> are defined to mean something that we don't support.




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux