Page MenuHomeFreeBSD

D37093.id112107.diff
No OneTemporary

D37093.id112107.diff

diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -815,8 +815,8 @@
* or xAPIC (8-bit) destination field.
*/
static void
-vlapic_calcdest(struct vm *vm, cpuset_t *dmask, uint32_t dest, bool phys,
- bool lowprio, bool x2apic_dest)
+vlapic_calcdest(struct vm *vm, cpuset_t *dmask, uint32_t mode, uint32_t dest,
+ bool phys, bool lowprio, bool x2apic_dest)
{
struct vlapic *vlapic;
uint32_t dfr, ldr, ldest, cluster;
@@ -839,9 +839,19 @@
*/
CPU_ZERO(dmask);
vcpuid = vm_apicid2vcpuid(vm, dest);
- amask = vm_active_cpus(vm);
- if (vcpuid < vm_get_maxcpus(vm) && CPU_ISSET(vcpuid, &amask))
- CPU_SET(vcpuid, dmask);
+ if (vcpuid < vm_get_maxcpus(vm)) {
+ switch (mode) {
+ default:
+ amask = vm_active_cpus(vm);
+ if (!CPU_ISSET(vcpuid, &amask))
+ break;
+ /* FALLTHROUGH */
+ case APIC_DELMODE_INIT:
+ case APIC_DELMODE_STARTUP:
+ CPU_SET(vcpuid, dmask);
+ break;
+ }
+ }
} else {
/*
* In the "Flat Model" the MDA is interpreted as an 8-bit wide
@@ -1062,7 +1072,8 @@
switch (shorthand) {
case APIC_DEST_DESTFLD:
- vlapic_calcdest(vlapic->vm, &dmask, dest, phys, false, x2apic(vlapic));
+ vlapic_calcdest(vlapic->vm, &dmask, mode, dest, phys, false,
+ x2apic(vlapic));
break;
case APIC_DEST_SELF:
CPU_SETOF(vlapic->vcpuid, &dmask);
@@ -1120,13 +1131,17 @@
break;
case APIC_DELMODE_INIT:
CPU_FOREACH_ISSET(i, &dmask) {
- /*
- * Userland which doesn't support the IPI exit requires
- * that the boot state is set to SIPI here.
- */
- vlapic2 = vm_lapic(vlapic->vm, i);
- vlapic2->boot_state = BS_SIPI;
- CPU_SET(i, &ipimask);
+ if (!vlapic->ipi_exit) {
+ /*
+ * Userland which doesn't support the
+ * IPI exit requires that the boot
+ * state is set to SIPI here.
+ */
+ vlapic2 = vm_lapic(vlapic->vm, i);
+ vlapic2->boot_state = BS_SIPI;
+ printf("Setting BS_SIPI for vcpu %d\n", i);
+ } else
+ CPU_SET(i, &ipimask);
}
break;
@@ -1139,6 +1154,21 @@
if (vlapic2->boot_state != BS_SIPI)
continue;
vlapic2->boot_state = BS_RUNNING;
+
+ /*
+ * Old bhyve versions don't support the IPI
+ * exit. Translate it into the old style.
+ */
+ if (!vlapic->ipi_exit) {
+ vmexit = vm_exitinfo(vlapic->vm,
+ vlapic->vcpuid);
+ vmexit->exitcode = VM_EXITCODE_SPINUP_AP;
+ vmexit->u.spinup_ap.vcpu = i;
+ vmexit->u.spinup_ap.rip = vec << PAGE_SHIFT;
+
+ *retu = true;
+ break;
+ }
CPU_SET(i, &ipimask);
}
@@ -1155,20 +1185,6 @@
vmexit->u.ipi.dmask = dmask;
*retu = true;
-
- /*
- * Old bhyve versions don't support the IPI exit. Translate it
- * into the old style.
- */
- if (!vlapic->ipi_exit) {
- if (mode == APIC_DELMODE_STARTUP) {
- vmexit->exitcode = VM_EXITCODE_SPINUP_AP;
- vmexit->u.spinup_ap.vcpu = CPU_FFS(&ipimask) - 1;
- vmexit->u.spinup_ap.rip = vec << PAGE_SHIFT;
- } else {
- *retu = false;
- }
- }
}
return (0);
@@ -1690,7 +1706,7 @@
* all interrupts originating from the ioapic or MSI specify the
* 'dest' in the legacy xAPIC format.
*/
- vlapic_calcdest(vm, &dmask, dest, phys, lowprio, false);
+ vlapic_calcdest(vm, &dmask, delmode, dest, phys, lowprio, false);
CPU_FOREACH_ISSET(vcpuid, &dmask) {
if (delmode == IOART_DELEXINT) {
@@ -1781,7 +1797,8 @@
}
lowprio = (delmode == APIC_DELMODE_LOWPRIO);
- vlapic_calcdest(vlapic->vm, &dmask, dest, phys, lowprio, false);
+ vlapic_calcdest(vlapic->vm, &dmask, delmode, dest, phys, lowprio,
+ false);
if (!CPU_ISSET(vlapic->vcpuid, &dmask))
return;

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 26, 7:46 PM (8 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32174888
Default Alt Text
D37093.id112107.diff (3 KB)

Event Timeline