diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2016-01-28 09:48:42 -0500 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-02-29 13:34:19 -0500 |
commit | 68130cb5db09cb8a285a59f70ac72d2bfa8685fd (patch) | |
tree | c4b52cdd9cd1f58d4efa90fc6ec858134d561c7b /arch/arm/kvm | |
parent | b5fa5d3e628bd301b89937ee4f7814297d8e2e31 (diff) |
ARM: KVM: Use common version of timer-sr.c
Using the common HYP timer code is a bit more tricky, since we
use system register names. Nothing a set of macros cannot
work around...
Acked-by: Christoffer Dall <christoffer.dall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r-- | arch/arm/kvm/hyp/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/kvm/hyp/timer-sr.c | 69 |
2 files changed, 1 insertions, 70 deletions
diff --git a/arch/arm/kvm/hyp/Makefile b/arch/arm/kvm/hyp/Makefile index 8f735d970ef1..8dfa5f7f9290 100644 --- a/arch/arm/kvm/hyp/Makefile +++ b/arch/arm/kvm/hyp/Makefile | |||
@@ -5,10 +5,10 @@ | |||
5 | KVM=../../../../virt/kvm | 5 | KVM=../../../../virt/kvm |
6 | 6 | ||
7 | obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/vgic-v2-sr.o | 7 | obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/vgic-v2-sr.o |
8 | obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/timer-sr.o | ||
8 | 9 | ||
9 | obj-$(CONFIG_KVM_ARM_HOST) += tlb.o | 10 | obj-$(CONFIG_KVM_ARM_HOST) += tlb.o |
10 | obj-$(CONFIG_KVM_ARM_HOST) += cp15-sr.o | 11 | obj-$(CONFIG_KVM_ARM_HOST) += cp15-sr.o |
11 | obj-$(CONFIG_KVM_ARM_HOST) += timer-sr.o | ||
12 | obj-$(CONFIG_KVM_ARM_HOST) += vfp.o | 12 | obj-$(CONFIG_KVM_ARM_HOST) += vfp.o |
13 | obj-$(CONFIG_KVM_ARM_HOST) += banked-sr.o | 13 | obj-$(CONFIG_KVM_ARM_HOST) += banked-sr.o |
14 | obj-$(CONFIG_KVM_ARM_HOST) += entry.o | 14 | obj-$(CONFIG_KVM_ARM_HOST) += entry.o |
diff --git a/arch/arm/kvm/hyp/timer-sr.c b/arch/arm/kvm/hyp/timer-sr.c deleted file mode 100644 index 2bb0c926e01c..000000000000 --- a/arch/arm/kvm/hyp/timer-sr.c +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2012-2015 - ARM Ltd | ||
3 | * Author: Marc Zyngier <marc.zyngier@arm.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
12 | * GNU General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | */ | ||
17 | |||
18 | #include <clocksource/arm_arch_timer.h> | ||
19 | #include <linux/compiler.h> | ||
20 | #include <linux/kvm_host.h> | ||
21 | |||
22 | #include <asm/kvm_hyp.h> | ||
23 | |||
24 | /* vcpu is already in the HYP VA space */ | ||
25 | void __hyp_text __timer_save_state(struct kvm_vcpu *vcpu) | ||
26 | { | ||
27 | struct kvm *kvm = kern_hyp_va(vcpu->kvm); | ||
28 | struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; | ||
29 | u64 val; | ||
30 | |||
31 | if (kvm->arch.timer.enabled) { | ||
32 | timer->cntv_ctl = read_sysreg(CNTV_CTL); | ||
33 | timer->cntv_cval = read_sysreg(CNTV_CVAL); | ||
34 | } | ||
35 | |||
36 | /* Disable the virtual timer */ | ||
37 | write_sysreg(0, CNTV_CTL); | ||
38 | |||
39 | /* Allow physical timer/counter access for the host */ | ||
40 | val = read_sysreg(CNTHCTL); | ||
41 | val |= CNTHCTL_EL1PCTEN | CNTHCTL_EL1PCEN; | ||
42 | write_sysreg(val, CNTHCTL); | ||
43 | |||
44 | /* Clear cntvoff for the host */ | ||
45 | write_sysreg(0, CNTVOFF); | ||
46 | } | ||
47 | |||
48 | void __hyp_text __timer_restore_state(struct kvm_vcpu *vcpu) | ||
49 | { | ||
50 | struct kvm *kvm = kern_hyp_va(vcpu->kvm); | ||
51 | struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu; | ||
52 | u64 val; | ||
53 | |||
54 | /* | ||
55 | * Disallow physical timer access for the guest | ||
56 | * Physical counter access is allowed | ||
57 | */ | ||
58 | val = read_sysreg(CNTHCTL); | ||
59 | val &= ~CNTHCTL_EL1PCEN; | ||
60 | val |= CNTHCTL_EL1PCTEN; | ||
61 | write_sysreg(val, CNTHCTL); | ||
62 | |||
63 | if (kvm->arch.timer.enabled) { | ||
64 | write_sysreg(kvm->arch.timer.cntvoff, CNTVOFF); | ||
65 | write_sysreg(timer->cntv_cval, CNTV_CVAL); | ||
66 | isb(); | ||
67 | write_sysreg(timer->cntv_ctl, CNTV_CTL); | ||
68 | } | ||
69 | } | ||