[PATCH v5 2/4] ARM: KVM: arch_timers: Add guest timer core support
From: Christoffer Dall <hidden>
Date: 2013-01-15 14:32:29
Also in:
kvm
On Tue, Jan 15, 2013 at 6:07 AM, Marc Zyngier [off-list ref] wrote:
On 14/01/13 19:19, Christoffer Dall wrote:quoted
On Mon, Jan 14, 2013 at 10:18 AM, Will Deacon [off-list ref] wrote:quoted
On Tue, Jan 08, 2013 at 06:43:20PM +0000, Christoffer Dall wrote:quoted
From: Marc Zyngier <redacted> Add some the architected timer related infrastructure, and support timer interrupt injection, which can happen as a resultof three possible events: - The virtual timer interrupt has fired while we were still executing the guest - The timer interrupt hasn't fired, but it expired while we were doing the world switch - A hrtimer we programmed earlier has fired[...]quoted
+void kvm_timer_sync_to_cpu(struct kvm_vcpu *vcpu) +{ + struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; + + /* + * We're about to run this vcpu again, so there is no need to + * keep the background timer running, as we're about to + * populate the CPU timer again. + */ + timer_disarm(timer); +} + +void kvm_timer_sync_from_cpu(struct kvm_vcpu *vcpu) +{ + struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; + cycle_t cval, now; + u64 ns; + + /* Check if the timer is enabled and unmasked first */ + if ((timer->cntv_ctl & 3) != 1) + return; + + cval = timer->cntv_cval; + now = kvm_phys_timer_read() - vcpu->kvm->arch.timer.cntvoff; + + BUG_ON(timer_is_armed(timer)); + + if (cval <= now) { + /* + * Timer has already expired while we were not + * looking. Inject the interrupt and carry on. + */ + kvm_timer_inject_irq(vcpu); + return; + } + + ns = cyclecounter_cyc2ns(timecounter->cc, cval - now); + timer_arm(timer, ns); +}Please use flush/sync terminology to match the rest of arch/arm/.ok, the following fixes this for both timers and the vgic: commit 1b68f39459dbc797f6766c103edf2c1053984161 Author: Christoffer Dall [off-list ref] Date: Mon Jan 14 14:16:31 2013 -0500 KVM: ARM: vgic: use sync/flush terminology Use sync/flush for saving state to/from CPUs to be consistent with other uses in arch/arm.Sync and flush on their own are pretty inexpressive. Consider changing it to {flush,sync}_hwstate, so we're consistent with what VFP does.
sure