On 25/09/19 20:17, Jim Mattson wrote: > Don't return -E2BIG from __do_cpuid_func when processing function 0BH > or 1FH and the last interesting subleaf occupies the last allocated > entry in the result array. > > Cc: Sean Christopherson <sean.j.christopherson@xxxxxxxxx> > Cc: Paolo Bonzini <pbonzini@xxxxxxxxxx> > Fixes: 831bf664e9c1fc ("KVM: Refactor and simplify kvm_dev_ioctl_get_supported_cpuid") > Signed-off-by: Jim Mattson <jmattson@xxxxxxxxxx> > Reviewed-by: Peter Shier <pshier@xxxxxxxxxx> > --- > arch/x86/kvm/cpuid.c | 16 ++++++++++------ > 1 file changed, 10 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c > index dd5985eb61b4c..a3ee9e110ba82 100644 > --- a/arch/x86/kvm/cpuid.c > +++ b/arch/x86/kvm/cpuid.c > @@ -612,16 +612,20 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function, > */ > case 0x1f: > case 0xb: { > - int i, level_type; > + int i; > > - /* read more entries until level_type is zero */ > - for (i = 1; ; ++i) { > + /* > + * We filled in entry[0] for CPUID(EAX=<function>, > + * ECX=00H) above. If its level type (ECX[15:8]) is > + * zero, then the leaf is unimplemented, and we're > + * done. Otherwise, continue to populate entries > + * until the level type (ECX[15:8]) of the previously > + * added entry is zero. > + */ > + for (i = 1; entry[i - 1].ecx & 0xff00; ++i) { > if (*nent >= maxnent) > goto out; > > - level_type = entry[i - 1].ecx & 0xff00; > - if (!level_type) > - break; > do_host_cpuid(&entry[i], function, i); > ++*nent; > } > Queued, thanks. Paolo