|
@@ -327,9 +327,11 @@ void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu)
|
|
|
}
|
|
|
|
|
|
int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
|
|
|
- const struct kvm_irq_level *irq)
|
|
|
+ const struct kvm_irq_level *virt_irq,
|
|
|
+ const struct kvm_irq_level *phys_irq)
|
|
|
{
|
|
|
struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
|
|
|
+ struct arch_timer_context *ptimer = vcpu_ptimer(vcpu);
|
|
|
|
|
|
/*
|
|
|
* The vcpu timer irq number cannot be determined in
|
|
@@ -337,7 +339,8 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
|
|
|
* kvm_vcpu_set_target(). To handle this, we determine
|
|
|
* vcpu timer irq number when the vcpu is reset.
|
|
|
*/
|
|
|
- vtimer->irq.irq = irq->irq;
|
|
|
+ vtimer->irq.irq = virt_irq->irq;
|
|
|
+ ptimer->irq.irq = phys_irq->irq;
|
|
|
|
|
|
/*
|
|
|
* The bits in CNTV_CTL are architecturally reset to UNKNOWN for ARMv8
|
|
@@ -346,6 +349,7 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
|
|
|
* the ARMv7 architecture.
|
|
|
*/
|
|
|
vtimer->cnt_ctl = 0;
|
|
|
+ ptimer->cnt_ctl = 0;
|
|
|
kvm_timer_update_state(vcpu);
|
|
|
|
|
|
return 0;
|
|
@@ -376,6 +380,7 @@ void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
/* Synchronize cntvoff across all vtimers of a VM. */
|
|
|
update_vtimer_cntvoff(vcpu, kvm_phys_timer_read());
|
|
|
+ vcpu_ptimer(vcpu)->cntvoff = 0;
|
|
|
|
|
|
INIT_WORK(&timer->expired, kvm_timer_inject_irq_work);
|
|
|
hrtimer_init(&timer->timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|