[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [HVM] Fix timer interrupt delivery on x64 Vista.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1168596518 0 # Node ID 162d9d9eaf4aaa1005f9dc3b7e8000856b8ed691 # Parent ecf6a0a05350eb8518a3c0e49fb04f28241d2f95 [HVM] Fix timer interrupt delivery on x64 Vista. x64 SMP Vista HVM guest uses HPET as the main system timer, and it uses physical destination mode with broadcast to deliver the interrupts generated by HPET. In current code, timer interrupts are injected only to VCPU0 in vioapic.c, but this doesn't satisfy x64 SMP Vista -- when it boots, it complains "a clock interrupt was not received on a secondary processor within the allocated time interval" with Bug Check 0x101. Signed-off-by: Dexuan Cui <dexuan.cui@xxxxxxxxx> --- xen/arch/x86/domain.c | 2 +- xen/arch/x86/hvm/vioapic.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff -r ecf6a0a05350 -r 162d9d9eaf4a xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Jan 11 19:01:28 2007 +0000 +++ b/xen/arch/x86/domain.c Fri Jan 12 10:08:38 2007 +0000 @@ -1047,7 +1047,7 @@ void context_switch(struct vcpu *prev, s local_irq_disable(); - if ( is_hvm_vcpu(prev) ) + if ( is_hvm_vcpu(prev) && !list_empty(&prev->arch.hvm_vcpu.tm_list) ) pt_freeze_time(prev); set_current(next); diff -r ecf6a0a05350 -r 162d9d9eaf4a xen/arch/x86/hvm/vioapic.c --- a/xen/arch/x86/hvm/vioapic.c Thu Jan 11 19:01:28 2007 +0000 +++ b/xen/arch/x86/hvm/vioapic.c Fri Jan 12 10:08:38 2007 +0000 @@ -309,6 +309,13 @@ static uint32_t ioapic_get_delivery_bitm return mask; } +static inline int pit_channel0_enabled(void) +{ + PITState *pit = ¤t->domain->arch.hvm_domain.pl_time.vpit; + struct periodic_time *pt = &pit->channels[0].pt; + return pt->enabled; +} + static void vioapic_deliver(struct vioapic *vioapic, int irq) { uint16_t dest = vioapic->redirtbl[irq].fields.dest_id; @@ -341,7 +348,7 @@ static void vioapic_deliver(struct vioap { #ifdef IRQ0_SPECIAL_ROUTING /* Force round-robin to pick VCPU 0 */ - if ( irq == hvm_isa_irq_to_gsi(0) ) + if ( (irq == hvm_isa_irq_to_gsi(0)) && pit_channel0_enabled() ) { v = vioapic_domain(vioapic)->vcpu[0]; target = v ? vcpu_vlapic(v) : NULL; @@ -374,7 +381,7 @@ static void vioapic_deliver(struct vioap deliver_bitmask &= ~(1 << bit); #ifdef IRQ0_SPECIAL_ROUTING /* Do not deliver timer interrupts to VCPU != 0 */ - if ( irq == hvm_isa_irq_to_gsi(0) ) + if ( (irq == hvm_isa_irq_to_gsi(0)) && pit_channel0_enabled() ) v = vioapic_domain(vioapic)->vcpu[0]; else #endif _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |