Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/io/vlapic.c
Show First 20 Lines • Show All 1,121 Lines • ▼ Show 20 Lines | if (!vlapic->ipi_exit) { | ||||||||
if (!phys) | if (!phys) | ||||||||
break; | break; | ||||||||
i = vm_apicid2vcpuid(vlapic->vm, dest); | i = vm_apicid2vcpuid(vlapic->vm, dest); | ||||||||
if (i >= vm_get_maxcpus(vlapic->vm) || | if (i >= vm_get_maxcpus(vlapic->vm) || | ||||||||
i == vlapic->vcpuid) | i == vlapic->vcpuid) | ||||||||
break; | break; | ||||||||
/* vCPU i is waiting for SIPI. */ | CPU_SETOF(i, &ipimask); | ||||||||
CPU_SETOF(i, &dmask); | |||||||||
vm_await_start(vlapic->vm, &dmask); | |||||||||
break; | break; | ||||||||
} | } | ||||||||
CPU_COPY(&dmask, &ipimask); | CPU_COPY(&dmask, &ipimask); | ||||||||
break; | break; | ||||||||
case APIC_DELMODE_STARTUP: | case APIC_DELMODE_STARTUP: | ||||||||
if (!vlapic->ipi_exit) { | if (!vlapic->ipi_exit) { | ||||||||
if (!phys) | if (!phys) | ||||||||
break; | break; | ||||||||
/* | |||||||||
* Old bhyve versions don't support the IPI | |||||||||
* exit. Translate it into the old style. | |||||||||
*/ | |||||||||
i = vm_apicid2vcpuid(vlapic->vm, dest); | i = vm_apicid2vcpuid(vlapic->vm, dest); | ||||||||
if (i >= vm_get_maxcpus(vlapic->vm) || | if (i >= vm_get_maxcpus(vlapic->vm) || | ||||||||
i == vlapic->vcpuid) | i == vlapic->vcpuid) | ||||||||
break; | break; | ||||||||
/* | CPU_SETOF(i, &ipimask); | ||||||||
* Ignore SIPIs in any state other than wait-for-SIPI | |||||||||
*/ | |||||||||
CPU_SETOF(i, &dmask); | |||||||||
dmask = vm_start_cpus(vlapic->vm, &dmask); | |||||||||
if (CPU_EMPTY(&dmask)) | |||||||||
break; | |||||||||
vmexit = vm_exitinfo(vlapic->vcpu); | |||||||||
vmexit->exitcode = VM_EXITCODE_SPINUP_AP; | |||||||||
vmexit->u.spinup_ap.vcpu = i; | |||||||||
vmexit->u.spinup_ap.rip = vec << PAGE_SHIFT; | |||||||||
*retu = true; | |||||||||
break; | break; | ||||||||
} | } | ||||||||
/* | CPU_COPY(&dmask, &ipimask); | ||||||||
* Ignore SIPIs in any state other than wait-for-SIPI | |||||||||
*/ | |||||||||
ipimask = vm_start_cpus(vlapic->vm, &dmask); | |||||||||
break; | break; | ||||||||
default: | default: | ||||||||
return (1); | return (1); | ||||||||
} | } | ||||||||
if (!CPU_EMPTY(&ipimask)) { | if (!CPU_EMPTY(&ipimask)) { | ||||||||
vmexit = vm_exitinfo(vlapic->vcpu); | vmexit = vm_exitinfo(vlapic->vcpu); | ||||||||
vmexit->exitcode = VM_EXITCODE_IPI; | vmexit->exitcode = VM_EXITCODE_IPI; | ||||||||
Show All 13 Lines | vlapic_handle_init(struct vcpu *vcpu, void *arg) | ||||||||
struct vlapic *vlapic = vm_lapic(vcpu); | struct vlapic *vlapic = vm_lapic(vcpu); | ||||||||
vlapic_reset(vlapic); | vlapic_reset(vlapic); | ||||||||
} | } | ||||||||
int | int | ||||||||
vm_handle_ipi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu) | vm_handle_ipi(struct vcpu *vcpu, struct vm_exit *vme, bool *retu) | ||||||||
{ | { | ||||||||
struct vlapic *vlapic = vm_lapic(vcpu); | |||||||||
cpuset_t *dmask = &vme->u.ipi.dmask; | |||||||||
uint8_t vec = vme->u.ipi.vector; | |||||||||
*retu = true; | *retu = true; | ||||||||
switch (vme->u.ipi.mode) { | switch (vme->u.ipi.mode) { | ||||||||
case APIC_DELMODE_INIT: | case APIC_DELMODE_INIT: | ||||||||
vm_smp_rendezvous(vcpu, vme->u.ipi.dmask, vlapic_handle_init, | vm_smp_rendezvous(vcpu, *dmask, vlapic_handle_init, | ||||||||
corvink: This wasn't done in the `!vlapic->ipi_exit` case before. I don't think that resetting the… | |||||||||
NULL); | NULL); | ||||||||
vm_await_start(vcpu_vm(vcpu), &vme->u.ipi.dmask); | vm_await_start(vcpu_vm(vcpu), dmask); | ||||||||
if (!vlapic->ipi_exit) { | |||||||||
*retu = false; | |||||||||
} | |||||||||
break; | break; | ||||||||
case APIC_DELMODE_STARTUP: | case APIC_DELMODE_STARTUP: | ||||||||
/* | |||||||||
* Ignore SIPIs in any state other than wait-for-SIPI | |||||||||
*/ | |||||||||
*dmask = vm_start_cpus(vcpu_vm(vcpu), dmask); | |||||||||
if (CPU_EMPTY(dmask)) { | |||||||||
*retu = false; | |||||||||
break; | |||||||||
} | |||||||||
/* | |||||||||
* Old bhyve versions don't support the IPI | |||||||||
* exit. Translate it into the old style. | |||||||||
*/ | |||||||||
if (!vlapic->ipi_exit) { | |||||||||
vme->exitcode = VM_EXITCODE_SPINUP_AP; | |||||||||
vme->u.spinup_ap.vcpu = CPU_FFS(dmask); | |||||||||
Not Done Inline Actions
jhb: | |||||||||
vme->u.spinup_ap.rip = vec << PAGE_SHIFT; | |||||||||
} | |||||||||
break; | break; | ||||||||
default: | default: | ||||||||
return (1); | return (1); | ||||||||
} | } | ||||||||
return (0); | return (0); | ||||||||
} | } | ||||||||
▲ Show 20 Lines • Show All 692 Lines • Show Last 20 Lines |
This wasn't done in the !vlapic->ipi_exit case before. I don't think that resetting the vlapic is an issue for old bhyve binaries. So, I didn't masked it to keep the code cleaner.
If you complain about it, I'm going to mask it.