diff options
author | Jiongxi Li <jiongxi.li@intel.com> | 2012-09-17 21:05:11 +0100 |
---|---|---|
committer | Jiongxi Li <jiongxi.li@intel.com> | 2012-09-17 21:05:11 +0100 |
commit | 25b81a7941d71fabd4c8c56e9d3d76801d061842 (patch) | |
tree | 70c210788e3b17400e6c8a2a736a0298ec8bacea /xen/arch/x86/hvm/vpt.c | |
parent | f62b02e177cd03da2b8397b9bdf1a53b541df3f3 (diff) | |
download | xen-25b81a7941d71fabd4c8c56e9d3d76801d061842.tar.gz xen-25b81a7941d71fabd4c8c56e9d3d76801d061842.tar.bz2 xen-25b81a7941d71fabd4c8c56e9d3d76801d061842.zip |
xen: enable Virtual-interrupt delivery
Virtual interrupt delivery avoids Xen to inject vAPIC interrupts
manually, which is fully taken care of by the hardware. This needs
some special awareness into existing interrupr injection path:
For pending interrupt from vLAPIC, instead of direct injection, we may
need update architecture specific indicators before resuming to guest.
Before returning to guest, RVI should be updated if any pending IRRs
EOI exit bitmap controls whether an EOI write should cause VM-Exit. If
set, a trap-like induced EOI VM-Exit is triggered. The approach here
is to manipulate EOI exit bitmap based on value of TMR. Level
triggered irq requires a hook in vLAPIC EOI write, so that vIOAPIC EOI
is triggered and emulated
Signed-off-by: Gang Wei <gang.wei@intel.com>
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Signed-off-by: Jiongxi Li <jiongxi.li@intel.com>
Committed-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/arch/x86/hvm/vpt.c')
-rw-r--r-- | xen/arch/x86/hvm/vpt.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index 353eda0343..15abad8b82 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -212,7 +212,7 @@ static void pt_timer_fn(void *data) pt_unlock(pt); } -void pt_update_irq(struct vcpu *v) +int pt_update_irq(struct vcpu *v) { struct list_head *head = &v->arch.hvm_vcpu.tm_list; struct periodic_time *pt, *temp, *earliest_pt = NULL; @@ -245,7 +245,7 @@ void pt_update_irq(struct vcpu *v) if ( earliest_pt == NULL ) { spin_unlock(&v->arch.hvm_vcpu.tm_lock); - return; + return -1; } earliest_pt->irq_issued = 1; @@ -263,6 +263,17 @@ void pt_update_irq(struct vcpu *v) hvm_isa_irq_deassert(v->domain, irq); hvm_isa_irq_assert(v->domain, irq); } + + /* + * If periodic timer interrut is handled by lapic, its vector in + * IRR is returned and used to set eoi_exit_bitmap for virtual + * interrupt delivery case. Otherwise return -1 to do nothing. + */ + if ( vlapic_accept_pic_intr(v) && + (&v->domain->arch.hvm_domain)->vpic[0].int_output ) + return -1; + else + return pt_irq_vector(earliest_pt, hvm_intsrc_lapic); } static struct periodic_time *is_pt_irq( |