svn commit: r271345 - projects/bhyve_svm/sys/amd64/vmm/amd
Neel Natu
neel at FreeBSD.org
Wed Sep 10 02:20:33 UTC 2014
Author: neel
Date: Wed Sep 10 02:20:32 2014
New Revision: 271345
URL: http://svnweb.freebsd.org/changeset/base/271345
Log:
Move the event injection function into svm.c and add KTR logging for
every event injection.
This in in preparation for changes to SVM guest interrupt injection.
Discussed with: Anish Gupta (akgupt3 at gmail.com)
Modified:
projects/bhyve_svm/sys/amd64/vmm/amd/svm.c
projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.c
projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.h
Modified: projects/bhyve_svm/sys/amd64/vmm/amd/svm.c
==============================================================================
--- projects/bhyve_svm/sys/amd64/vmm/amd/svm.c Wed Sep 10 01:46:22 2014 (r271344)
+++ projects/bhyve_svm/sys/amd64/vmm/amd/svm.c Wed Sep 10 02:20:32 2014 (r271345)
@@ -707,6 +707,67 @@ svm_write_efer(struct svm_softc *sc, int
}
}
+#ifdef KTR
+static const char *
+intrtype_to_str(int intr_type)
+{
+ switch (intr_type) {
+ case VMCB_EVENTINJ_TYPE_INTR:
+ return ("hwintr");
+ case VMCB_EVENTINJ_TYPE_NMI:
+ return ("nmi");
+ case VMCB_EVENTINJ_TYPE_INTn:
+ return ("swintr");
+ case VMCB_EVENTINJ_TYPE_EXCEPTION:
+ return ("exception");
+ default:
+ panic("%s: unknown intr_type %d", __func__, intr_type);
+ }
+}
+#endif
+
+/*
+ * Inject an event to vcpu as described in section 15.20, "Event injection".
+ */
+static void
+svm_eventinject(struct svm_softc *sc, int vcpu, int intr_type, int vector,
+ uint32_t error, bool ec_valid)
+{
+ struct vmcb_ctrl *ctrl;
+
+ ctrl = svm_get_vmcb_ctrl(sc, vcpu);
+
+ KASSERT((ctrl->eventinj & VMCB_EVENTINJ_VALID) == 0,
+ ("%s: event already pending %#lx", __func__, ctrl->eventinj));
+
+ KASSERT(vector >=0 && vector <= 255, ("%s: invalid vector %d",
+ __func__, vector));
+
+ switch (intr_type) {
+ case VMCB_EVENTINJ_TYPE_INTR:
+ case VMCB_EVENTINJ_TYPE_NMI:
+ case VMCB_EVENTINJ_TYPE_INTn:
+ break;
+ case VMCB_EVENTINJ_TYPE_EXCEPTION:
+ if (vector >= 0 && vector <= 31 && vector != 2)
+ break;
+ /* FALLTHROUGH */
+ default:
+ panic("%s: invalid intr_type/vector: %d/%d", __func__,
+ intr_type, vector);
+ }
+ ctrl->eventinj = vector | (intr_type << 8) | VMCB_EVENTINJ_VALID;
+ if (ec_valid) {
+ ctrl->eventinj |= VMCB_EVENTINJ_EC_VALID;
+ ctrl->eventinj |= (uint64_t)error << 32;
+ VCPU_CTR3(sc->vm, vcpu, "Injecting %s at vector %d errcode %#x",
+ intrtype_to_str(intr_type), vector, error);
+ } else {
+ VCPU_CTR2(sc->vm, vcpu, "Injecting %s at vector %d",
+ intrtype_to_str(intr_type), vector);
+ }
+}
+
static void
svm_save_intinfo(struct svm_softc *svm_sc, int vcpu)
{
@@ -998,7 +1059,8 @@ svm_inject_nmi(struct svm_softc *svm_sc,
return (0);
/* Inject NMI, vector number is not used.*/
- vmcb_eventinject(ctrl, VMCB_EVENTINJ_TYPE_NMI, IDT_NMI, 0, false);
+ svm_eventinject(svm_sc, vcpu, VMCB_EVENTINJ_TYPE_NMI, IDT_NMI, 0,
+ false);
/* Acknowledge the request is accepted.*/
vm_nmi_clear(svm_sc->vm, vcpu);
@@ -1011,18 +1073,15 @@ svm_inject_nmi(struct svm_softc *svm_sc,
static void
svm_inj_intinfo(struct svm_softc *svm_sc, int vcpu)
{
- struct vmcb_ctrl *ctrl;
uint64_t intinfo;
- ctrl = svm_get_vmcb_ctrl(svm_sc, vcpu);
-
if (!vm_entry_intinfo(svm_sc->vm, vcpu, &intinfo))
return;
KASSERT(VMCB_EXITINTINFO_VALID(intinfo), ("%s: entry intinfo is not "
"valid: %#lx", __func__, intinfo));
- vmcb_eventinject(ctrl, VMCB_EXITINTINFO_TYPE(intinfo),
+ svm_eventinject(svm_sc, vcpu, VMCB_EXITINTINFO_TYPE(intinfo),
VMCB_EXITINTINFO_VECTOR(intinfo),
VMCB_EXITINTINFO_EC(intinfo),
VMCB_EXITINTINFO_EC_VALID(intinfo));
@@ -1089,7 +1148,8 @@ svm_inj_interrupts(struct svm_softc *svm
return;
}
- vmcb_eventinject(ctrl, VMCB_EVENTINJ_TYPE_INTR, vector, 0, false);
+ svm_eventinject(svm_sc, vcpu, VMCB_EVENTINJ_TYPE_INTR, vector, 0,
+ false);
if (!extint_pending) {
/* Update the Local APIC ISR */
Modified: projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.c
==============================================================================
--- projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.c Wed Sep 10 01:46:22 2014 (r271344)
+++ projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.c Wed Sep 10 02:20:32 2014 (r271345)
@@ -352,36 +352,3 @@ vmcb_seg(struct vmcb *vmcb, int type)
return (seg);
}
-
-/*
- * Inject an event to vcpu as described in section 15.20, "Event injection".
- */
-void
-vmcb_eventinject(struct vmcb_ctrl *ctrl, int intr_type, int vector,
- uint32_t error, bool ec_valid)
-{
- KASSERT((ctrl->eventinj & VMCB_EVENTINJ_VALID) == 0,
- ("%s: event already pending %#lx", __func__, ctrl->eventinj));
-
- KASSERT(vector >=0 && vector <= 255, ("%s: invalid vector %d",
- __func__, vector));
-
- switch (intr_type) {
- case VMCB_EVENTINJ_TYPE_INTR:
- case VMCB_EVENTINJ_TYPE_NMI:
- case VMCB_EVENTINJ_TYPE_INTn:
- break;
- case VMCB_EVENTINJ_TYPE_EXCEPTION:
- if (vector >= 0 && vector <= 31 && vector != 2)
- break;
- /* FALLTHROUGH */
- default:
- panic("%s: invalid intr_type/vector: %d/%d", __func__,
- intr_type, vector);
- }
- ctrl->eventinj = vector | (intr_type << 8) | VMCB_EVENTINJ_VALID;
- if (ec_valid) {
- ctrl->eventinj |= VMCB_EVENTINJ_EC_VALID;
- ctrl->eventinj |= (uint64_t)error << 32;
- }
-}
Modified: projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.h
==============================================================================
--- projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.h Wed Sep 10 01:46:22 2014 (r271344)
+++ projects/bhyve_svm/sys/amd64/vmm/amd/vmcb.h Wed Sep 10 02:20:32 2014 (r271345)
@@ -282,7 +282,5 @@ void svm_init_vmcb(struct vmcb *vmcb, ui
int vmcb_read(struct vmcb *vmcb, int ident, uint64_t *retval);
int vmcb_write(struct vmcb *vmcb, int ident, uint64_t val);
struct vmcb_segment *vmcb_seg(struct vmcb *vmcb, int type);
-void vmcb_eventinject(struct vmcb_ctrl *ctrl, int type, int vector,
- uint32_t error, bool ec_valid);
#endif /* _VMCB_H_ */
More information about the svn-src-projects
mailing list