aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/hvm/viridian.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2013-03-28 11:44:11 +0000
committerKeir Fraser <keir@xen.org>2013-03-28 11:44:11 +0000
commit7242e0dc2c6c083ded570de159007d112ee34e88 (patch)
tree0c91b27d4df9aa28dcda555e0b3f2f2897740dbd /xen/arch/x86/hvm/viridian.c
parent3920df230bbe9eb2fcb5147df97f7ab7ece22fc2 (diff)
downloadxen-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.c4
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;
}