diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-07-07 14:21:16 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-07-07 14:21:16 +0100 |
commit | f12b7b5a0baf51c5aff3126ce269ed6972705afb (patch) | |
tree | 9a3e8839b1304cf8331dd38be93ec4f5aff39eae /xen/arch/x86/hvm/vpt.c | |
parent | e82525a924fb96e5394d6d81ecdf57d38a706415 (diff) | |
download | xen-f12b7b5a0baf51c5aff3126ce269ed6972705afb.tar.gz xen-f12b7b5a0baf51c5aff3126ce269ed6972705afb.tar.bz2 xen-f12b7b5a0baf51c5aff3126ce269ed6972705afb.zip |
x86,hvm: Allow delivery of timer interrupts to VCPUs != 0
This patch is needed for kexec/kdump since VCPU#0 is halted.
Signed-off-by: Kouya Shimura <kouya@jp.fujitsu.com>
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/hvm/vpt.c')
-rw-r--r-- | xen/arch/x86/hvm/vpt.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index 6a12d37a21..a949d918ba 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -437,3 +437,53 @@ void destroy_periodic_time(struct periodic_time *pt) */ kill_timer(&pt->timer); } + +static void pt_adjust_vcpu(struct periodic_time *pt, struct vcpu *v) +{ + int on_list; + + ASSERT(pt->source == PTSRC_isa); + + if ( pt->vcpu == NULL ) + return; + + pt_lock(pt); + on_list = pt->on_list; + if ( pt->on_list ) + list_del(&pt->list); + pt->on_list = 0; + pt_unlock(pt); + + spin_lock(&v->arch.hvm_vcpu.tm_lock); + pt->vcpu = v; + if ( on_list ) + { + pt->on_list = 1; + list_add(&pt->list, &v->arch.hvm_vcpu.tm_list); + + migrate_timer(&pt->timer, v->processor); + } + spin_unlock(&v->arch.hvm_vcpu.tm_lock); +} + +void pt_adjust_global_vcpu_target(struct vcpu *v) +{ + struct pl_time *pl_time = &v->domain->arch.hvm_domain.pl_time; + int i; + + if ( v == NULL ) + return; + + spin_lock(&pl_time->vpit.lock); + pt_adjust_vcpu(&pl_time->vpit.pt0, v); + spin_unlock(&pl_time->vpit.lock); + + spin_lock(&pl_time->vrtc.lock); + pt_adjust_vcpu(&pl_time->vrtc.pt, v); + spin_unlock(&pl_time->vrtc.lock); + + spin_lock(&pl_time->vhpet.lock); + for ( i = 0; i < HPET_TIMER_NUM; i++ ) + pt_adjust_vcpu(&pl_time->vhpet.pt[i], v); + spin_unlock(&pl_time->vhpet.lock); +} |