[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] xen/arm: phys_timer fixes
commit 94d166c0106f158fa2c86496bfb0ca1fbb8627ec Author: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> AuthorDate: Wed Feb 20 18:16:37 2013 +0000 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Wed Apr 10 16:12:38 2013 +0100 xen/arm: phys_timer fixes Do not unmask the emulated phys_timer when the related Xen timer expires. Do not inject the phys_timer interrupt if it is masked. Do not let the user set CNTx_CTL_PENDING directly. Set CNTx_CTL_PENDING when the phys_timer expires and clear it when the phys_timer is disabled or the compare value is changed. Define offset and cval as uint64_t given that they can't be negative and they are used as uint64_t arguments. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/vtimer.c | 10 +++++++--- xen/include/asm-arm/domain.h | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c index a68f662..1cb365e 100644 --- a/xen/arch/arm/vtimer.c +++ b/xen/arch/arm/vtimer.c @@ -33,8 +33,8 @@ static void phys_timer_expired(void *data) { struct vtimer *t = data; t->ctl |= CNTx_CTL_PENDING; - t->ctl &= ~CNTx_CTL_MASK; - vgic_vcpu_inject_irq(t->v, 30, 1); + if ( !(t->ctl & CNTx_CTL_MASK) ) + vgic_vcpu_inject_irq(t->v, 30, 1); } static void virt_timer_expired(void *data) @@ -118,7 +118,10 @@ static int vtimer_emulate_32(struct cpu_user_regs *regs, union hsr hsr) } else { - v->arch.phys_timer.ctl = *r; + uint32_t ctl = *r & ~CNTx_CTL_PENDING; + if ( ctl & CNTx_CTL_ENABLE ) + ctl |= v->arch.phys_timer.ctl & CNTx_CTL_PENDING; + v->arch.phys_timer.ctl = ctl; if ( v->arch.phys_timer.ctl & CNTx_CTL_ENABLE ) { @@ -142,6 +145,7 @@ static int vtimer_emulate_32(struct cpu_user_regs *regs, union hsr hsr) v->arch.phys_timer.cval = now + ticks_to_ns(*r); if ( v->arch.phys_timer.ctl & CNTx_CTL_ENABLE ) { + v->arch.phys_timer.ctl &= ~CNTx_CTL_PENDING; set_timer(&v->arch.phys_timer.timer, v->arch.phys_timer.cval + v->arch.phys_timer.offset); } diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index bf9caff..3fa266c2 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -96,8 +96,8 @@ struct vtimer { int irq; struct timer timer; uint32_t ctl; - s_time_t offset; - s_time_t cval; + uint64_t offset; + uint64_t cval; }; struct arch_vcpu -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |