Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jun 2014 21:02:48 +0000 (UTC)
From:      Peter Grehan <grehan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r267305 - projects/bhyve_svm/sys/amd64/vmm/amd
Message-ID:  <201406092102.s59L2mnC033906@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: grehan
Date: Mon Jun  9 21:02:48 2014
New Revision: 267305
URL: http://svnweb.freebsd.org/changeset/base/267305

Log:
  Temporary fix for guest idle detection.
  
  Handle ExtINT injection for SVM. The HPET emulation
  will inject a legacy interrupt at startup, and if this
  isn't handled, will result in the HLT-exit code assuming
  there are outstanding ExtINTs and return without sleeping.
  
  svm_inj_interrupts() needs more changes to bring it up
  to date with the VT-x version: these are forthcoming.
  
  Reviewed by:	neel

Modified:
  projects/bhyve_svm/sys/amd64/vmm/amd/svm.c

Modified: projects/bhyve_svm/sys/amd64/vmm/amd/svm.c
==============================================================================
--- projects/bhyve_svm/sys/amd64/vmm/amd/svm.c	Mon Jun  9 20:56:30 2014	(r267304)
+++ projects/bhyve_svm/sys/amd64/vmm/amd/svm.c	Mon Jun  9 21:02:48 2014	(r267305)
@@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$");
 #include "vmm_stat.h"
 #include "vmm_ktr.h"
 #include "vmm_ioport.h"
+#include "vatpic.h"
 #include "vlapic.h"
 #include "vlapic_priv.h"
 
@@ -952,6 +953,7 @@ svm_inj_interrupts(struct svm_softc *svm
 	struct vmcb_ctrl *ctrl;
 	struct vmcb_state *state;
 	struct vm_exception exc;
+	int extint_pending;
 	int vector;
 	
 	KASSERT(vcpu < svm_sc->vcpu_cnt, ("Guest doesn't have VCPU%d", vcpu));
@@ -988,10 +990,17 @@ svm_inj_interrupts(struct svm_softc *svm
 		return;
 	}
 
-        /* Ask the local apic for a vector to inject */
-        if (!vlapic_pending_intr(vlapic, &vector))
-                return;
-	
+	extint_pending = vm_extint_pending(svm_sc->vm, vcpu);
+
+	if (!extint_pending) {
+		/* Ask the local apic for a vector to inject */
+		if (!vlapic_pending_intr(vlapic, &vector))
+			return;
+	} else {
+                /* Ask the legacy pic for a vector to inject */
+                vatpic_pending_intr(svm_sc->vm, &vector);
+	}
+
 	if (vector < 32 || vector > 255) {
 		VCPU_CTR1(svm_sc->vm, vcpu, "SVM_ERR:Event injection"
 			"invalid vector=%d.\n", vector);
@@ -1010,8 +1019,18 @@ svm_inj_interrupts(struct svm_softc *svm
 		return;
 	}	
 
-	/* Acknowledge that event is accepted.*/
-	vlapic_intr_accepted(vlapic, vector);
+        if (!extint_pending) {
+                /* Update the Local APIC ISR */
+                vlapic_intr_accepted(vlapic, vector);
+        } else {
+                vm_extint_clear(svm_sc->vm, vcpu);
+                vatpic_intr_accepted(svm_sc->vm, vector);
+
+                /*
+		 * XXX need to recheck exting_pending ala VT-x
+		 */
+        }
+
 	VCPU_CTR1(svm_sc->vm, vcpu, "SVM:event injected,vector=%d.\n", vector);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201406092102.s59L2mnC033906>