mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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@eu.citrix.com> Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
1 parent
c96513ff9d
commit
94d166c010
2 files changed
+9
-5
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||