hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/arch/x86/kvm/pmu.h
....@@ -15,6 +15,8 @@
1515 #define VMWARE_BACKDOOR_PMC_REAL_TIME 0x10001
1616 #define VMWARE_BACKDOOR_PMC_APPARENT_TIME 0x10002
1717
18
+#define MAX_FIXED_COUNTERS 3
19
+
1820 struct kvm_event_hw_type_mapping {
1921 u8 eventsel;
2022 u8 unit_mask;
....@@ -22,16 +24,16 @@
2224 };
2325
2426 struct kvm_pmu_ops {
25
- unsigned (*find_arch_event)(struct kvm_pmu *pmu, u8 event_select,
26
- u8 unit_mask);
27
+ unsigned int (*pmc_perf_hw_id)(struct kvm_pmc *pmc);
2728 unsigned (*find_fixed_event)(int idx);
2829 bool (*pmc_is_enabled)(struct kvm_pmc *pmc);
2930 struct kvm_pmc *(*pmc_idx_to_pmc)(struct kvm_pmu *pmu, int pmc_idx);
30
- struct kvm_pmc *(*msr_idx_to_pmc)(struct kvm_vcpu *vcpu, unsigned idx,
31
- u64 *mask);
32
- int (*is_valid_msr_idx)(struct kvm_vcpu *vcpu, unsigned idx);
31
+ struct kvm_pmc *(*rdpmc_ecx_to_pmc)(struct kvm_vcpu *vcpu,
32
+ unsigned int idx, u64 *mask);
33
+ struct kvm_pmc *(*msr_idx_to_pmc)(struct kvm_vcpu *vcpu, u32 msr);
34
+ int (*is_valid_rdpmc_ecx)(struct kvm_vcpu *vcpu, unsigned int idx);
3335 bool (*is_valid_msr)(struct kvm_vcpu *vcpu, u32 msr);
34
- int (*get_msr)(struct kvm_vcpu *vcpu, u32 msr, u64 *data);
36
+ int (*get_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
3537 int (*set_msr)(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
3638 void (*refresh)(struct kvm_vcpu *vcpu);
3739 void (*init)(struct kvm_vcpu *vcpu);
....@@ -57,12 +59,21 @@
5759 return counter & pmc_bitmask(pmc);
5860 }
5961
62
+static inline void pmc_release_perf_event(struct kvm_pmc *pmc)
63
+{
64
+ if (pmc->perf_event) {
65
+ perf_event_release_kernel(pmc->perf_event);
66
+ pmc->perf_event = NULL;
67
+ pmc->current_config = 0;
68
+ pmc_to_pmu(pmc)->event_count--;
69
+ }
70
+}
71
+
6072 static inline void pmc_stop_counter(struct kvm_pmc *pmc)
6173 {
6274 if (pmc->perf_event) {
6375 pmc->counter = pmc_read_counter(pmc);
64
- perf_event_release_kernel(pmc->perf_event);
65
- pmc->perf_event = NULL;
76
+ pmc_release_perf_event(pmc);
6677 }
6778 }
6879
....@@ -78,7 +89,13 @@
7889
7990 static inline bool pmc_is_enabled(struct kvm_pmc *pmc)
8091 {
81
- return kvm_x86_ops->pmu_ops->pmc_is_enabled(pmc);
92
+ return kvm_x86_ops.pmu_ops->pmc_is_enabled(pmc);
93
+}
94
+
95
+static inline bool kvm_valid_perf_global_ctrl(struct kvm_pmu *pmu,
96
+ u64 data)
97
+{
98
+ return !(pmu->global_ctrl_mask & data);
8299 }
83100
84101 /* returns general purpose PMC with the specified MSR. Note that it can be
....@@ -113,6 +130,15 @@
113130 return NULL;
114131 }
115132
133
+static inline u64 get_sample_period(struct kvm_pmc *pmc, u64 counter_value)
134
+{
135
+ u64 sample_period = (-counter_value) & pmc_bitmask(pmc);
136
+
137
+ if (!sample_period)
138
+ sample_period = pmc_bitmask(pmc) + 1;
139
+ return sample_period;
140
+}
141
+
116142 void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel);
117143 void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 ctrl, int fixed_idx);
118144 void reprogram_counter(struct kvm_pmu *pmu, int pmc_idx);
....@@ -120,14 +146,16 @@
120146 void kvm_pmu_deliver_pmi(struct kvm_vcpu *vcpu);
121147 void kvm_pmu_handle_event(struct kvm_vcpu *vcpu);
122148 int kvm_pmu_rdpmc(struct kvm_vcpu *vcpu, unsigned pmc, u64 *data);
123
-int kvm_pmu_is_valid_msr_idx(struct kvm_vcpu *vcpu, unsigned idx);
149
+int kvm_pmu_is_valid_rdpmc_ecx(struct kvm_vcpu *vcpu, unsigned int idx);
124150 bool kvm_pmu_is_valid_msr(struct kvm_vcpu *vcpu, u32 msr);
125
-int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, u32 msr, u64 *data);
151
+int kvm_pmu_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
126152 int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info);
127153 void kvm_pmu_refresh(struct kvm_vcpu *vcpu);
128154 void kvm_pmu_reset(struct kvm_vcpu *vcpu);
129155 void kvm_pmu_init(struct kvm_vcpu *vcpu);
156
+void kvm_pmu_cleanup(struct kvm_vcpu *vcpu);
130157 void kvm_pmu_destroy(struct kvm_vcpu *vcpu);
158
+int kvm_vm_ioctl_set_pmu_event_filter(struct kvm *kvm, void __user *argp);
131159
132160 bool is_vmware_backdoor_pmc(u32 pmc_idx);
133161