diff options
author | Jan Beulich <jbeulich@suse.com> | 2013-02-05 09:44:00 +0100 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2013-02-05 09:44:00 +0100 |
commit | 620d5dad54008e40798c4a0c4322aef274c36fa3 (patch) | |
tree | 395efe24b3207225165ac5ba117fc5c1da5f64ef /xen/arch/x86/hvm/vpt.c | |
parent | 19014daf9fbd8e9bb3c26cb0fdbb993f82471d5a (diff) | |
download | xen-620d5dad54008e40798c4a0c4322aef274c36fa3.tar.gz xen-620d5dad54008e40798c4a0c4322aef274c36fa3.tar.bz2 xen-620d5dad54008e40798c4a0c4322aef274c36fa3.zip |
x86/HVM: assorted RTC emulation adjustments
- only call check_update_timer() on REG_B writes when SET changes
- only call alarm_timer_update() on REG_B writes when relevant bits
change
- instead properly handle AF and PF when the guest is not also setting
AIE/PIE respectively (for UF this was already the case, only a
comment was slightly inaccurate), including calling the respective
update functions upon REG_C reads
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Olaf Hering <olaf@aepfle.de>
Diffstat (limited to 'xen/arch/x86/hvm/vpt.c')
-rw-r--r-- | xen/arch/x86/hvm/vpt.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/xen/arch/x86/hvm/vpt.c b/xen/arch/x86/hvm/vpt.c index 15abad8b82..46d3ec6c97 100644 --- a/xen/arch/x86/hvm/vpt.c +++ b/xen/arch/x86/hvm/vpt.c @@ -22,6 +22,7 @@ #include <asm/hvm/vpt.h> #include <asm/event.h> #include <asm/apic.h> +#include <asm/mc146818rtc.h> #define mode_is(d, name) \ ((d)->arch.hvm_domain.params[HVM_PARAM_TIMER_MODE] == HVMPTM_##name) @@ -218,6 +219,7 @@ int pt_update_irq(struct vcpu *v) struct periodic_time *pt, *temp, *earliest_pt = NULL; uint64_t max_lag = -1ULL; int irq, is_lapic; + void *pt_priv; spin_lock(&v->arch.hvm_vcpu.tm_lock); @@ -251,13 +253,14 @@ int pt_update_irq(struct vcpu *v) earliest_pt->irq_issued = 1; irq = earliest_pt->irq; is_lapic = (earliest_pt->source == PTSRC_lapic); + pt_priv = earliest_pt->priv; spin_unlock(&v->arch.hvm_vcpu.tm_lock); if ( is_lapic ) - { vlapic_set_irq(vcpu_vlapic(v), irq, 0); - } + else if ( irq == RTC_IRQ && pt_priv ) + rtc_periodic_interrupt(pt_priv); else { hvm_isa_irq_deassert(v->domain, irq); |