|
[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 |