Do not set the Xen internal timer if the virt_timer is masked.
Disable interrupts while saving the virt_timer registers to avoid
conflicts with possible virt_timer interrupts coming through.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
---
xen/arch/arm/vtimer.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c
index e033191..67fa513 100644
--- a/xen/arch/arm/vtimer.c
+++ b/xen/arch/arm/vtimer.c
@@ -89,10 +89,13 @@ int virt_timer_save(struct vcpu *v)
if ( is_idle_domain(v->domain) )
return 0;
+ local_irq_disable();
v->arch.virt_timer.ctl = READ_CP32(CNTV_CTL);
WRITE_CP32(v->arch.virt_timer.ctl & ~CNTx_CTL_ENABLE, CNTV_CTL);
v->arch.virt_timer.cval = READ_CP64(CNTV_CVAL);
- if ( v->arch.virt_timer.ctl & CNTx_CTL_ENABLE )
+ local_irq_enable();
+ if ( (v->arch.virt_timer.ctl & CNTx_CTL_ENABLE) &&
+ !(v->arch.virt_timer.ctl & CNTx_CTL_MASK))
{
set_timer(&v->arch.virt_timer.timer,
ticks_to_ns(v->arch.virt_timer.cval +
v->arch.virt_timer.offset - boot_count));
--
1.7.2.5