[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 37/45] xen: arm: Use 64-bit compatible registers in vtimer.
Also, don't crash the host if we fail to emulate a vtimer access, just kill the guest. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- xen/arch/arm/traps.c | 14 ++++++++++++-- xen/arch/arm/vtimer.c | 23 +++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index af0b700..d9abf83 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -721,7 +721,12 @@ static void do_cp15_32(struct cpu_user_regs *regs, break; case HSR_CPREG32(CNTP_CTL): case HSR_CPREG32(CNTP_TVAL): - BUG_ON(!vtimer_emulate(regs, hsr)); + if ( !vtimer_emulate(regs, hsr) ) + { + dprintk(XENLOG_ERR, + "failed emulation of 32-bit vtimer CP register access\n"); + domain_crash_synchronous(); + } break; default: printk("%s p15, %d, r%d, cr%d, cr%d, %d @ 0x%"PRIregister"\n", @@ -751,7 +756,12 @@ static void do_cp15_64(struct cpu_user_regs *regs, switch ( hsr.bits & HSR_CP64_REGS_MASK ) { case HSR_CPREG64(CNTPCT): - BUG_ON(!vtimer_emulate(regs, hsr)); + if ( !vtimer_emulate(regs, hsr) ) + { + dprintk(XENLOG_ERR, + "failed emulation of 64-bit vtimer CP register access\n"); + domain_crash_synchronous(); + } break; default: printk("%s p15, %d, r%d, r%d, cr%d @ 0x%"PRIregister"\n", diff --git a/xen/arch/arm/vtimer.c b/xen/arch/arm/vtimer.c index 288c27e..deda17e 100644 --- a/xen/arch/arm/vtimer.c +++ b/xen/arch/arm/vtimer.c @@ -42,7 +42,7 @@ static void virt_timer_expired(void *data) struct vtimer *t = data; vcpu_wake(t->v); } - + int vcpu_vtimer_init(struct vcpu *v) { struct vtimer *t = &v->arch.phys_timer; @@ -57,7 +57,7 @@ int vcpu_vtimer_init(struct vcpu *v) t = &v->arch.virt_timer; init_timer(&t->timer, virt_timer_expired, t, smp_processor_id()); t->ctl = 0; - t->offset = READ_CP64(CNTVCT) + READ_CP64(CNTVOFF); + t->offset = READ_SYSREG64(CNTVCT_EL0) + READ_SYSREG64(CNTVOFF_EL2); t->cval = 0; t->irq = 27; t->v = v; @@ -67,9 +67,9 @@ int vcpu_vtimer_init(struct vcpu *v) int virt_timer_save(struct vcpu *v) { - 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); + v->arch.virt_timer.ctl = READ_SYSREG32(CNTV_CTL_EL0); + WRITE_SYSREG32(v->arch.virt_timer.ctl & ~CNTx_CTL_ENABLE, CNTV_CTL_EL0); + v->arch.virt_timer.cval = READ_SYSREG64(CNTV_CVAL_EL0); if ( v->arch.virt_timer.ctl & CNTx_CTL_ENABLE ) { set_timer(&v->arch.virt_timer.timer, ticks_to_ns(v->arch.virt_timer.cval + @@ -82,13 +82,13 @@ int virt_timer_restore(struct vcpu *v) { stop_timer(&v->arch.virt_timer.timer); - WRITE_CP32(v->arch.virt_timer.ctl & ~CNTx_CTL_ENABLE, CNTV_CTL); - WRITE_CP64(v->arch.virt_timer.offset, CNTVOFF); - WRITE_CP64(v->arch.virt_timer.cval, CNTV_CVAL); - WRITE_CP32(v->arch.virt_timer.ctl, CNTV_CTL); + WRITE_SYSREG32(v->arch.virt_timer.ctl & ~CNTx_CTL_ENABLE, CNTV_CTL_EL0); + WRITE_SYSREG64(v->arch.virt_timer.offset, CNTVOFF_EL2); + WRITE_SYSREG64(v->arch.virt_timer.cval, CNTV_CVAL_EL0); + WRITE_SYSREG32(v->arch.virt_timer.ctl, CNTV_CTL_EL0); return 0; } - + static int vtimer_emulate_32(struct cpu_user_regs *regs, union hsr hsr) { struct vcpu *v = current; @@ -174,6 +174,9 @@ static int vtimer_emulate_64(struct cpu_user_regs *regs, union hsr hsr) int vtimer_emulate(struct cpu_user_regs *regs, union hsr hsr) { + if ( !is_pv32_domain(current->domain) ) + return -EINVAL; + switch (hsr.ec) { case HSR_EC_CP15_32: return vtimer_emulate_32(regs, hsr); -- 1.7.2.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |