Older binaries that do not request IPI exits to userspace do not
start user threads for other vCPUs until a STARTUP IPI triggers a
VM_EXITCODE_SPINUP_AP exit to userland. This means that those vcpus
are not yet active (in terms of vm_active_cpus) when the INIT and
STARTUP IPIs are delivered to the vCPUs.
The changes in commit 0bda8d3e9f7a changed the INIT and STARTUP IPIs
to reuse the existing vlapic_calcdest() function. This function
silently ignores IPIs sent to inactive vCPUs. As a result, when using
an old bhyve binary, the INIT and STARTUP IPIs sent to wakeup APs were
ignored. To fix, exempt INIT and STARTUP IPIs from the check against
vm_active_vcpus.
While hereTo fix, restructure the compat code for the INIT and STARTUP IPIs to
in vlapic_irclo_write_hanlder() to always be performed inignore the results of vlapic_calcdest() and manually parse the switchAPIC ID
statement on delivery mode and always be conditional on the ipi_exitand resulting vcpuid. As part of this, make the compat code always
conditonal on the ipi_exit capability being disabled.