diff options
author | Keir Fraser <keir@xen.org> | 2013-03-28 11:44:11 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2013-03-28 11:44:11 +0000 |
commit | 7242e0dc2c6c083ded570de159007d112ee34e88 (patch) | |
tree | 0c91b27d4df9aa28dcda555e0b3f2f2897740dbd /xen/arch/x86/hvm/viridian.c | |
parent | 3920df230bbe9eb2fcb5147df97f7ab7ece22fc2 (diff) | |
download | xen-7242e0dc2c6c083ded570de159007d112ee34e88.tar.gz xen-7242e0dc2c6c083ded570de159007d112ee34e88.tar.bz2 xen-7242e0dc2c6c083ded570de159007d112ee34e88.zip |
hvm: Improve APIC INIT/SIPI emulation, fixing it for call paths other than x86_emulate().
In particular, on broadcast/multicast INIT/SIPI, we handle all target
APICs at once in a single invocation of the init/sipi tasklet. This
avoids needing to return an X86EMUL_RETRY error code to the caller,
which was being ignored by all except x86_emulate().
The original bug, and the general approach in this fix, pointed out by
Intel (yang.z.zhang@intel.com).
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/viridian.c')
-rw-r--r-- | xen/arch/x86/hvm/viridian.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c index 6c7f2dc3eb..1ee0f7fec8 100644 --- a/xen/arch/x86/hvm/viridian.c +++ b/xen/arch/x86/hvm/viridian.c @@ -240,8 +240,8 @@ int wrmsr_viridian_regs(uint32_t idx, uint64_t val) eax &= ~(1 << 12); edx &= 0xff000000; vlapic_set_reg(vlapic, APIC_ICR2, edx); - if ( vlapic_ipi(vlapic, eax, edx) == X86EMUL_OKAY ) - vlapic_set_reg(vlapic, APIC_ICR, eax); + vlapic_ipi(vlapic, eax, edx); + vlapic_set_reg(vlapic, APIC_ICR, eax); break; } |