On 9/11/2019 1:00 AM, Jim Mattson wrote:
On Tue, Sep 10, 2019 at 3:42 AM Xiaoyao Li <xiaoyao.li@xxxxxxxxx> wrote:
When limit checking is required, it should be executed first, which is
consistent with the CPUID specification.
Signed-off-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx>
---
v2:
- correctly set entry_found in no limit checking case.
---
arch/x86/kvm/cpuid.c | 51 ++++++++++++++++++++++++++------------------
1 file changed, 30 insertions(+), 21 deletions(-)
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index 22c2720cd948..67fa44ab87af 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -952,23 +952,36 @@ struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu,
EXPORT_SYMBOL_GPL(kvm_find_cpuid_entry);
/*
- * If no match is found, check whether we exceed the vCPU's limit
- * and return the content of the highest valid _standard_ leaf instead.
- * This is to satisfy the CPUID specification.
+ * Based on CPUID specification, if leaf number exceeds the vCPU's limit,
+ * it should return the content of the highest valid _standard_ leaf instead.
+ * Note: *found is set true only means the queried leaf number doesn't exceed
+ * the maximum leaf number of basic or extented leaf.
Nit: "extented" should be "extended."
A more serious problem is that the CPUID specification you quote is
Intel's specification. AMD CPUs return zeroes in EAX, EBX, ECX, and
EDX for all undefined leaves, whatever the input value for EAX. This
code is supposed to be vendor-agnostic, right?
I checked the AMD spec and I didn't find the statement about "AMD CPUs
return zeroes in EAX, EBX, ECX, and EDX for all undefined leaves". I
don't have AMD machine at hand so that I can't test it to verify it.
Assume what you said about AMD CPUs is true, then the current codes in
KVM makes AMD guest act as Intel CPU that returns the highest valid
standard leaf if input value of EAX exceeds the limit.
Anyway, I find we cannot check the limit first for guest, otherwise the
leaves 0x4000XXXX will be not readable. So please just ignore this patch.