aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kvm/coproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kvm/coproc.c')
-rw-r--r--arch/arm/kvm/coproc.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/arm/kvm/coproc.c b/arch/arm/kvm/coproc.c
index e8bd288fd5be..14915c78bd99 100644
--- a/arch/arm/kvm/coproc.c
+++ b/arch/arm/kvm/coproc.c
@@ -293,15 +293,16 @@ static bool access_cntp_tval(struct kvm_vcpu *vcpu,
293 const struct coproc_params *p, 293 const struct coproc_params *p,
294 const struct coproc_reg *r) 294 const struct coproc_reg *r)
295{ 295{
296 u64 now = kvm_phys_timer_read(); 296 u32 val;
297 u64 val;
298 297
299 if (p->is_write) { 298 if (p->is_write) {
300 val = *vcpu_reg(vcpu, p->Rt1); 299 val = *vcpu_reg(vcpu, p->Rt1);
301 kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL, val + now); 300 kvm_arm_timer_write_sysreg(vcpu,
301 TIMER_PTIMER, TIMER_REG_TVAL, val);
302 } else { 302 } else {
303 val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL); 303 val = kvm_arm_timer_read_sysreg(vcpu,
304 *vcpu_reg(vcpu, p->Rt1) = val - now; 304 TIMER_PTIMER, TIMER_REG_TVAL);
305 *vcpu_reg(vcpu, p->Rt1) = val;
305 } 306 }
306 307
307 return true; 308 return true;
@@ -315,9 +316,11 @@ static bool access_cntp_ctl(struct kvm_vcpu *vcpu,
315 316
316 if (p->is_write) { 317 if (p->is_write) {
317 val = *vcpu_reg(vcpu, p->Rt1); 318 val = *vcpu_reg(vcpu, p->Rt1);
318 kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CTL, val); 319 kvm_arm_timer_write_sysreg(vcpu,
320 TIMER_PTIMER, TIMER_REG_CTL, val);
319 } else { 321 } else {
320 val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CTL); 322 val = kvm_arm_timer_read_sysreg(vcpu,
323 TIMER_PTIMER, TIMER_REG_CTL);
321 *vcpu_reg(vcpu, p->Rt1) = val; 324 *vcpu_reg(vcpu, p->Rt1) = val;
322 } 325 }
323 326
@@ -333,9 +336,11 @@ static bool access_cntp_cval(struct kvm_vcpu *vcpu,
333 if (p->is_write) { 336 if (p->is_write) {
334 val = (u64)*vcpu_reg(vcpu, p->Rt2) << 32; 337 val = (u64)*vcpu_reg(vcpu, p->Rt2) << 32;
335 val |= *vcpu_reg(vcpu, p->Rt1); 338 val |= *vcpu_reg(vcpu, p->Rt1);
336 kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL, val); 339 kvm_arm_timer_write_sysreg(vcpu,
340 TIMER_PTIMER, TIMER_REG_CVAL, val);
337 } else { 341 } else {
338 val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL); 342 val = kvm_arm_timer_read_sysreg(vcpu,
343 TIMER_PTIMER, TIMER_REG_CVAL);
339 *vcpu_reg(vcpu, p->Rt1) = val; 344 *vcpu_reg(vcpu, p->Rt1) = val;
340 *vcpu_reg(vcpu, p->Rt2) = val >> 32; 345 *vcpu_reg(vcpu, p->Rt2) = val >> 32;
341 } 346 }