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/include/asm-x86/hvm | |
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/include/asm-x86/hvm')
-rw-r--r-- | xen/include/asm-x86/hvm/vlapic.h | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h index 09cb63cef7..101ef57e14 100644 --- a/xen/include/asm-x86/hvm/vlapic.h +++ b/xen/include/asm-x86/hvm/vlapic.h @@ -62,8 +62,7 @@ struct vlapic { struct page_info *regs_page; /* INIT-SIPI-SIPI work gets deferred to a tasklet. */ struct { - struct vcpu *target; - uint32_t icr; + uint32_t icr, dest; struct tasklet tasklet; } init_sipi; }; @@ -102,7 +101,7 @@ void vlapic_adjust_i8259_target(struct domain *d); void vlapic_EOI_set(struct vlapic *vlapic); void vlapic_handle_EOI_induced_exit(struct vlapic *vlapic, int vector); -int vlapic_ipi(struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high); +void vlapic_ipi(struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high); int vlapic_apicv_write(struct vcpu *v, unsigned int offset); |