summaryrefslogtreecommitdiffstats
path: root/sys/amd64/vmm/io/vlapic.c
diff options
context:
space:
mode:
authorgrehan <grehan@FreeBSD.org>2011-06-28 06:26:03 +0000
committergrehan <grehan@FreeBSD.org>2011-06-28 06:26:03 +0000
commit2c6741be0f59191f2283eb268e4f7690399d578a (patch)
treeb139c8c6dcca4fa284815daade405b75886ee360 /sys/amd64/vmm/io/vlapic.c
parent3c35264f695e0a1f8a04dbcca1c93bb5159b2274 (diff)
parent19ae02bba572390c7299166228d31e54003e094a (diff)
downloadFreeBSD-src-2c6741be0f59191f2283eb268e4f7690399d578a.zip
FreeBSD-src-2c6741be0f59191f2283eb268e4f7690399d578a.tar.gz
IFC @ r222830
Diffstat (limited to 'sys/amd64/vmm/io/vlapic.c')
-rw-r--r--sys/amd64/vmm/io/vlapic.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/sys/amd64/vmm/io/vlapic.c b/sys/amd64/vmm/io/vlapic.c
index c0d82dd..0a14127 100644
--- a/sys/amd64/vmm/io/vlapic.c
+++ b/sys/amd64/vmm/io/vlapic.c
@@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/systm.h>
+#include <sys/smp.h>
#include <machine/clock.h>
#include <x86/apicreg.h>
@@ -439,12 +440,11 @@ static int
lapic_process_icr(struct vlapic *vlapic, uint64_t icrval)
{
int i;
- cpumask_t dmask, thiscpumask;
+ cpuset_t dmask;
uint32_t dest, vec, mode;
- thiscpumask = vcpu_mask(vlapic->vcpuid);
+ CPU_ZERO(&dmask);
- dmask = 0;
dest = icrval >> 32;
vec = icrval & APIC_VECTOR_MASK;
mode = icrval & APIC_DELMODE_MASK;
@@ -452,26 +452,27 @@ lapic_process_icr(struct vlapic *vlapic, uint64_t icrval)
if (mode == APIC_DELMODE_FIXED || mode == APIC_DELMODE_NMI) {
switch (icrval & APIC_DEST_MASK) {
case APIC_DEST_DESTFLD:
- dmask = vcpu_mask(dest);
+ CPU_SETOF(dest, &dmask);
break;
case APIC_DEST_SELF:
- dmask = thiscpumask;
+ CPU_SETOF(vlapic->vcpuid, &dmask);
break;
case APIC_DEST_ALLISELF:
dmask = vm_active_cpus(vlapic->vm);
break;
case APIC_DEST_ALLESELF:
- dmask = vm_active_cpus(vlapic->vm) & ~thiscpumask;
+ dmask = vm_active_cpus(vlapic->vm);
+ CPU_CLR(vlapic->vcpuid, &dmask);
break;
}
- for (i = 0; i < VM_MAXCPU; i++) {
- if (dmask & vcpu_mask(i)) {
- if (mode == APIC_DELMODE_FIXED)
- lapic_set_intr(vlapic->vm, i, vec);
- else
- vm_inject_nmi(vlapic->vm, i);
- }
+ while ((i = cpusetobj_ffs(&dmask)) != 0) {
+ i--;
+ CPU_CLR(i, &dmask);
+ if (mode == APIC_DELMODE_FIXED)
+ lapic_set_intr(vlapic->vm, i, vec);
+ else
+ vm_inject_nmi(vlapic->vm, i);
}
return (0); /* handled completely in the kernel */
OpenPOWER on IntegriCloud