# HG changeset patch # User Sheng Yang # Date 1253088144 -28800 # Node ID 91c520c2cefccc8c654839d9b38d04bd8801a391 # Parent 2d68b9d29b425f138345c7b9e0e8bc66b84c7ba1 Add pvtimer support for HVM We need sync TSC with hypervisor, and update guest wallclock time if we want to enable pvtimer. The timer interrupt delivered through IRQ0. diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2792,6 +2792,11 @@ d->hybrid_enabled = XEN_HYBRID_ENABLED; printk("HVM: Hybrid domain enabled\n"); + if (a.flags & HVM_HYBRID_TIMER) { + hvm_funcs.set_tsc_offset(d->vcpu[0], 0); + update_domain_wallclock_time(d); + d->hybrid_enabled |= XEN_HYBRID_TIMER_ENABLED; + } param_fail5: rcu_unlock_domain(d); break; diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c --- a/xen/arch/x86/time.c +++ b/xen/arch/x86/time.c @@ -30,6 +30,8 @@ #include #include #include + +#include /* opt_clocksource: Force clocksource to one of: pit, hpet, cyclone, acpi. */ static char opt_clocksource[10]; @@ -1323,6 +1325,11 @@ void send_timer_event(struct vcpu *v) { send_guest_vcpu_virq(v, VIRQ_TIMER); + if (is_hybrid_timer_enabled_domain(v->domain) && + !is_hybrid_evtchn_enabled_domain(v->domain)) { + hvm_isa_irq_deassert(v->domain, 0); + hvm_isa_irq_assert(v->domain, 0); + } } /* Return secs after 00:00:00 localtime, 1 January, 1970. */ diff --git a/xen/include/public/arch-x86/cpuid.h b/xen/include/public/arch-x86/cpuid.h --- a/xen/include/public/arch-x86/cpuid.h +++ b/xen/include/public/arch-x86/cpuid.h @@ -66,8 +66,10 @@ #define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD (1u<<0) /* Mask unsupported CPUID specified by user */ -#define XEN_CPUID_FEAT2_MASK 0x1ul +#define XEN_CPUID_FEAT2_MASK 0x3ul #define _XEN_CPUID_FEAT2_HYBRID 0 #define XEN_CPUID_FEAT2_HYBRID (1u<<0) +#define _XEN_CPUID_FEAT2_HYBRID_TIMER 1 +#define XEN_CPUID_FEAT2_HYBRID_TIMER (1u<<1) #endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */