From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Lalancette Subject: [PATCH]: Fix MSR_K7_EVNTSEL{0,3} for SVM Date: Wed, 23 Apr 2008 14:23:14 -0400 Message-ID: <480F7E92.6030709@redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------010800020806050205000806" Cc: Avi Kivity To: kvm-devel@lists.sourceforge.net Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces@lists.sourceforge.net Errors-To: kvm-devel-bounces@lists.sourceforge.net List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------010800020806050205000806 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Avi, Joerg, While trying to boot a RHEL-4 guest on latest KVM tip on an AMD machine, I found that the guest would consistently crash when trying to setup the NMI watchdog. I traced it down to the following commit: 51ef1ac7b23ee32bfcc61c229d634fdc1c68b38a It seems that in that commit, the K7_EVNTSEL MSR's were set to fail if the data != 0. That test is actually fine, the problem is how the code around it is generated. That is, we are only supposed to go to unhandled if data != 0; but for some reason, we are *always* going to unhandled, even when the data == 0. That causes RHEL-4 kernel to crash. If I rearrange the code to look like this: case MSR_K7_EVNTSEL0: case MSR_K7_EVNTSEL1: case MSR_K7_EVNTSEL2: case MSR_K7_EVNTSEL3: if (data != 0) return kvm_set_msr_common(vcpu, ecx, data); default: return kvm_set_msr_common(vcpu, ecx, data); } Then everything works again. A patch that does just this is attached. It might be slightly nicer to say "if (data == 0) return 0" and then just fall through to the default case, but I don't much care either way. Signed-off-by: Chris Lalancette --------------010800020806050205000806 Content-Type: text/x-patch; name="kvm-66-msr-k7.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kvm-66-msr-k7.patch" diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 89e0be2..ef550d7 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -1291,10 +1291,9 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned ecx, u64 data) * performance counter emulation later. */ if (data != 0) - goto unhandled; - break; + return kvm_set_msr_common(vcpu, ecx, data); + default: - unhandled: return kvm_set_msr_common(vcpu, ecx, data); } return 0; --------------010800020806050205000806 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone --------------010800020806050205000806 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel --------------010800020806050205000806--