Date: Wed, 10 Sep 2014 02:20:32 +0000 (UTC) From: Neel Natu <neel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r271345 - projects/bhyve_svm/sys/amd64/vmm/amd Message-ID: <201409100220.s8A2KW6T039372@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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@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_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409100220.s8A2KW6T039372>