hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/include/kvm/arm_arch_timer.h
....@@ -1,19 +1,7 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * Copyright (C) 2012 ARM Ltd.
34 * 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, write to the Free Software
16
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
175 */
186
197 #ifndef __ASM_ARM_KVM_ARCH_TIMER_H
....@@ -21,42 +9,52 @@
219
2210 #include <linux/clocksource.h>
2311 #include <linux/hrtimer.h>
24
-#include <linux/workqueue.h>
12
+
13
+enum kvm_arch_timers {
14
+ TIMER_PTIMER,
15
+ TIMER_VTIMER,
16
+ NR_KVM_TIMERS
17
+};
18
+
19
+enum kvm_arch_timer_regs {
20
+ TIMER_REG_CNT,
21
+ TIMER_REG_CVAL,
22
+ TIMER_REG_TVAL,
23
+ TIMER_REG_CTL,
24
+};
2525
2626 struct arch_timer_context {
27
- /* Registers: control register, timer value */
28
- u32 cnt_ctl;
29
- u64 cnt_cval;
27
+ struct kvm_vcpu *vcpu;
3028
3129 /* Timer IRQ */
3230 struct kvm_irq_level irq;
3331
34
- /*
35
- * We have multiple paths which can save/restore the timer state
36
- * onto the hardware, so we need some way of keeping track of
37
- * where the latest state is.
38
- *
39
- * loaded == true: State is loaded on the hardware registers.
40
- * loaded == false: State is stored in memory.
41
- */
42
- bool loaded;
32
+ /* Emulated Timer (may be unused) */
33
+ struct hrtimer hrtimer;
4334
44
- /* Virtual offset */
45
- u64 cntvoff;
35
+ /*
36
+ * We have multiple paths which can save/restore the timer state onto
37
+ * the hardware, so we need some way of keeping track of where the
38
+ * latest state is.
39
+ */
40
+ bool loaded;
41
+
42
+ /* Duplicated state from arch_timer.c for convenience */
43
+ u32 host_timer_irq;
44
+ u32 host_timer_irq_flags;
45
+};
46
+
47
+struct timer_map {
48
+ struct arch_timer_context *direct_vtimer;
49
+ struct arch_timer_context *direct_ptimer;
50
+ struct arch_timer_context *emul_ptimer;
4651 };
4752
4853 struct arch_timer_cpu {
49
- struct arch_timer_context vtimer;
50
- struct arch_timer_context ptimer;
54
+ struct arch_timer_context timers[NR_KVM_TIMERS];
5155
5256 /* Background timer used when the guest is not running */
5357 struct hrtimer bg_timer;
54
-
55
- /* Work queued with the above timer expires */
56
- struct work_struct expired;
57
-
58
- /* Physical timer emulation */
59
- struct hrtimer phys_timer;
6058
6159 /* Is the timer enabled */
6260 bool enabled;
....@@ -66,7 +64,7 @@
6664 int kvm_timer_enable(struct kvm_vcpu *vcpu);
6765 int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu);
6866 void kvm_timer_vcpu_init(struct kvm_vcpu *vcpu);
69
-void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu);
67
+void kvm_timer_sync_user(struct kvm_vcpu *vcpu);
7068 bool kvm_timer_should_notify_user(struct kvm_vcpu *vcpu);
7169 void kvm_timer_update_run(struct kvm_vcpu *vcpu);
7270 void kvm_timer_vcpu_terminate(struct kvm_vcpu *vcpu);
....@@ -80,9 +78,6 @@
8078
8179 bool kvm_timer_is_pending(struct kvm_vcpu *vcpu);
8280
83
-void kvm_timer_schedule(struct kvm_vcpu *vcpu);
84
-void kvm_timer_unschedule(struct kvm_vcpu *vcpu);
85
-
8681 u64 kvm_phys_timer_read(void);
8782
8883 void kvm_timer_vcpu_load(struct kvm_vcpu *vcpu);
....@@ -92,7 +87,23 @@
9287
9388 bool kvm_arch_timer_get_input_level(int vintid);
9489
95
-#define vcpu_vtimer(v) (&(v)->arch.timer_cpu.vtimer)
96
-#define vcpu_ptimer(v) (&(v)->arch.timer_cpu.ptimer)
90
+#define vcpu_timer(v) (&(v)->arch.timer_cpu)
91
+#define vcpu_get_timer(v,t) (&vcpu_timer(v)->timers[(t)])
92
+#define vcpu_vtimer(v) (&(v)->arch.timer_cpu.timers[TIMER_VTIMER])
93
+#define vcpu_ptimer(v) (&(v)->arch.timer_cpu.timers[TIMER_PTIMER])
94
+
95
+#define arch_timer_ctx_index(ctx) ((ctx) - vcpu_timer((ctx)->vcpu)->timers)
96
+
97
+u64 kvm_arm_timer_read_sysreg(struct kvm_vcpu *vcpu,
98
+ enum kvm_arch_timers tmr,
99
+ enum kvm_arch_timer_regs treg);
100
+void kvm_arm_timer_write_sysreg(struct kvm_vcpu *vcpu,
101
+ enum kvm_arch_timers tmr,
102
+ enum kvm_arch_timer_regs treg,
103
+ u64 val);
104
+
105
+/* Needed for tracing */
106
+u32 timer_get_ctl(struct arch_timer_context *ctxt);
107
+u64 timer_get_cval(struct arch_timer_context *ctxt);
97108
98109 #endif