From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 2/2] kvm/x86: remove unneeded substitute search for missing CPUID entries Date: Wed, 30 Mar 2011 15:26:01 +0200 Message-ID: <4D932F69.8070205@redhat.com> References: <1301490106-20626-1-git-send-email-andre.przywara@amd.com> <1301490106-20626-2-git-send-email-andre.przywara@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, stable@kernel.org To: Andre Przywara Return-path: Received: from mx1.redhat.com ([209.132.183.28]:21206 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754838Ab1C3N0J (ORCPT ); Wed, 30 Mar 2011 09:26:09 -0400 In-Reply-To: <1301490106-20626-2-git-send-email-andre.przywara@amd.com> Sender: kvm-owner@vger.kernel.org List-ID: On 03/30/2011 03:01 PM, Andre Przywara wrote: > If KVM cannot find an exact match for a requested CPUID leaf, the > code will try to find the closest match instead of simply confessing > it's failure. The heuristic is on one hand wrong nowadays, > since it does not take the KVM CPUID leaves (0x400000xx) into > account. On the other hand the callers of this function can all deal > with the no-match situation. So lets remove this code, as it serves > no purpose. > This fixes a crash of newer Linux kernels as KVM guests on > AMD Bulldozer CPUs, where bogus values were returned in response to > a CPUID intercept. > > > @@ -4959,12 +4959,6 @@ struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, > best = e; > break; > } > - /* > - * Both basic or both extended? > - */ > - if (((e->function ^ function)& 0x80000000) == 0) > - if (!best || e->function> best->function) > - best = e; > } > return best; > } This behaviour is mandated by the spec (looking at the Intel one), though it is implemented incorrectly - should always return largest basic leaf, and ignore the kvm leaves. I think the correct behaviour is: if (e->function < 10000 && (!best || e->function > best->function)) best = e; We probably need a find_exact_cpuid_entry() that returns NULL if it doesn't find a match, for internal use. -- error compiling committee.c: too many arguments to function