diff options
author | grehan <grehan@FreeBSD.org> | 2011-06-28 06:26:03 +0000 |
---|---|---|
committer | grehan <grehan@FreeBSD.org> | 2011-06-28 06:26:03 +0000 |
commit | 2c6741be0f59191f2283eb268e4f7690399d578a (patch) | |
tree | b139c8c6dcca4fa284815daade405b75886ee360 /sys/amd64/vmm/io/vlapic.c | |
parent | 3c35264f695e0a1f8a04dbcca1c93bb5159b2274 (diff) | |
parent | 19ae02bba572390c7299166228d31e54003e094a (diff) | |
download | FreeBSD-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.c | 27 |
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 */ |