Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Feb 2023 21:15:20 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: b265a2e0d764 - main - vmm: Fix AP startup compatibility for old bhyve executables
Message-ID:  <202302092115.319LFKSQ043009@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=b265a2e0d76422f4007e96dd7295ed0aeb846e2d

commit b265a2e0d76422f4007e96dd7295ed0aeb846e2d
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-02-09 20:52:35 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-02-09 21:14:33 +0000

    vmm: Fix AP startup compatibility for old bhyve executables
    
    These changes unbreak AP startup when using a 13.1-RELEASE bhyve
    executable with a newer kernel:
    - Correct the destination mask for the VM_EXITCODE_IPI message generated
      by an INIT or STARTUP IPI in vlapic_icrlo_write_handler().
    - Only initialize vlapics on active vCPUs.  13.1-RELEASE bhyve activates
      AP vCPUs only after the BSP starts them with an IPI, and vmm now
      allocates vcpu structures lazily, so the STARTUP handling in
      vm_handle_ipi() could trigger a page fault.
    - Fix an off-by-one setting the vcpuid in a VM_EXITCODE_SPINUP_AP
      message.
    
    Fixes:  7c326ab5bb9a ("vmm: don't lock a mtx in the icr_low write handler")
    Reviewed by:    jhb, corvink
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D38446
---
 sys/amd64/vmm/io/vlapic.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
index a68c68073893..884e232b1422 100644
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -1144,7 +1144,7 @@ vlapic_icrlo_write_handler(struct vlapic *vlapic, bool *retu)
 		vmexit->exitcode = VM_EXITCODE_IPI;
 		vmexit->u.ipi.mode = mode;
 		vmexit->u.ipi.vector = vec;
-		vmexit->u.ipi.dmask = dmask;
+		vmexit->u.ipi.dmask = ipimask;
 
 		*retu = true;
 	}
@@ -1169,16 +1169,22 @@ vm_handle_ipi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu)
 
 	*retu = true;
 	switch (vme->u.ipi.mode) {
-	case APIC_DELMODE_INIT:
-		vm_smp_rendezvous(vcpu, *dmask, vlapic_handle_init,
-		    NULL);
+	case APIC_DELMODE_INIT: {
+		cpuset_t active, reinit;
+
+		active = vm_active_cpus(vcpu_vm(vcpu));
+		CPU_AND(&reinit, &active, dmask);
+		if (!CPU_EMPTY(&reinit)) {
+			vm_smp_rendezvous(vcpu, reinit, vlapic_handle_init,
+			    NULL);
+		}
 		vm_await_start(vcpu_vm(vcpu), dmask);
 
-		if (!vlapic->ipi_exit) {
+		if (!vlapic->ipi_exit)
 			*retu = false;
-		}
 
 		break;
+	}
 	case APIC_DELMODE_STARTUP:
 		/*
 		 * Ignore SIPIs in any state other than wait-for-SIPI
@@ -1196,13 +1202,13 @@ vm_handle_ipi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu)
 		 */
 		if (!vlapic->ipi_exit) {
 			vme->exitcode = VM_EXITCODE_SPINUP_AP;
-			vme->u.spinup_ap.vcpu = CPU_FFS(dmask);
+			vme->u.spinup_ap.vcpu = CPU_FFS(dmask) - 1;
 			vme->u.spinup_ap.rip = vec << PAGE_SHIFT;
 		}
 
 		break;
 	default:
-		return (1);
+		__assert_unreachable();
 	}
 
 	return (0);



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