From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH 2/2] kvm/x86: move and fix substitue search for missing CPUID entries Date: Thu, 31 Mar 2011 15:17:08 +0200 Message-ID: <4D947ED4.50407@redhat.com> References: <4D94584F.1020409@redhat.com> <1301577181-10767-1-git-send-email-andre.przywara@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Cc: stable@kernel.org, kvm@vger.kernel.org To: Andre Przywara Return-path: In-Reply-To: <1301577181-10767-1-git-send-email-andre.przywara@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: stable-bounces@linux.kernel.org Errors-To: stable-bounces@linux.kernel.org List-Id: kvm.vger.kernel.org On 03/31/2011 03:13 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 implementation was meant to satisfy the CPUID specification, but > did not properly check for extended and standard leaves and also > didn't account for the index subleaf. > Beside that this rule only applies to CPUID intercepts, which is not > the only user of the kvm_find_cpuid_entry() function. > > So fix this algorithm and move it into kvm_emulate_cpuid(). > 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. > > @@ -4996,6 +4990,19 @@ void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) > kvm_register_write(vcpu, VCPU_REGS_RCX, 0); > kvm_register_write(vcpu, VCPU_REGS_RDX, 0); > best = kvm_find_cpuid_entry(vcpu, function, index); > + > + /* 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. > + */ > + if (!best) { > + best = kvm_find_cpuid_entry(vcpu, function& 0x80000000, 0); "highest valid standard leaf" means the second argument should be zero, no? > + if (best&& best->eax< function) > + best = kvm_find_cpuid_entry(vcpu, best->eax, index); > + else > + best = NULL; > + } > + > if (best) { > kvm_register_write(vcpu, VCPU_REGS_RAX, best->eax); > kvm_register_write(vcpu, VCPU_REGS_RBX, best->ebx); -- error compiling committee.c: too many arguments to function _______________________________________________ stable mailing list stable@linux.kernel.org http://linux.kernel.org/mailman/listinfo/stable