static int vtimer_emulate_cp64(struct cpu_user_regs *regs, union hsr hsr) { struct hsr_cp64 cp64 = hsr.cp64; uint32_t *r1 = (uint32_t *)select_user_reg(regs, cp64.reg1); uint32_t *r2 = (uint32_t *)select_user_reg(regs, cp64.reg2); uint64_t x = (uint64_t)(*r1) | ((uint64_t)(*r2) << 32); if ( cp64.read ) perfc_incr(vtimer_cp64_reads); else perfc_incr(vtimer_cp64_writes); switch ( hsr.bits & HSR_CP64_REGS_MASK ) { case HSR_CPREG64(CNTP_CVAL): if ( !vtimer_cntp_cval(regs, &x, cp64.read) ) return 0; break; default: return 0; } if ( cp64.read ) { *r1 = (uint32_t)(x & 0xffffffff); *r2 = (uint32_t)(x >> 32); }
static bool vtimer_emulate_cp64(struct cpu_user_regs *regs, union hsr hsr) { struct hsr_cp64 cp64 = hsr.cp64; if ( cp64.read ) perfc_incr(vtimer_cp64_reads); else perfc_incr(vtimer_cp64_writes); switch ( hsr.bits & HSR_CP64_REGS_MASK ) { case HSR_CPREG64(CNTP_CVAL): return vreg_emulate_cp64(regs, hsr, vtimer_cntp_cval); default: return false; } }
static int vtimer_emulate_64(struct cpu_user_regs *regs, union hsr hsr) { struct vcpu *v = current; struct hsr_cp64 cp64 = hsr.cp64; uint32_t *r1 = (uint32_t *)select_user_reg(regs, cp64.reg1); uint32_t *r2 = (uint32_t *)select_user_reg(regs, cp64.reg2); uint64_t ticks; s_time_t now; switch ( hsr.bits & HSR_CP64_REGS_MASK ) { case HSR_CPREG64(CNTPCT): if ( cp64.read ) { now = NOW() - v->arch.phys_timer.offset; ticks = ns_to_ticks(now); *r1 = (uint32_t)(ticks & 0xffffffff); *r2 = (uint32_t)(ticks >> 32); return 1; } else {
static int vtimer_emulate_cp64(struct cpu_user_regs *regs, union hsr hsr) { struct hsr_cp64 cp64 = hsr.cp64; uint32_t *r1 = (uint32_t *)select_user_reg(regs, cp64.reg1); uint32_t *r2 = (uint32_t *)select_user_reg(regs, cp64.reg2); uint64_t x; switch ( hsr.bits & HSR_CP64_REGS_MASK ) { case HSR_CPREG64(CNTPCT): if (!vtimer_cntpct(regs, &x, cp64.read)) return 0; if ( cp64.read ) { *r1 = (uint32_t)(x & 0xffffffff); *r2 = (uint32_t)(x >> 32); } return 1; default: return 0; }