|
@@ -1495,6 +1495,8 @@ static void record_steal_time(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
|
{
|
|
|
+ bool pr = false;
|
|
|
+
|
|
|
switch (msr) {
|
|
|
case MSR_EFER:
|
|
|
return set_efer(vcpu, data);
|
|
@@ -1635,6 +1637,18 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|
|
pr_unimpl(vcpu, "unimplemented perfctr wrmsr: "
|
|
|
"0x%x data 0x%llx\n", msr, data);
|
|
|
break;
|
|
|
+ case MSR_P6_PERFCTR0:
|
|
|
+ case MSR_P6_PERFCTR1:
|
|
|
+ pr = true;
|
|
|
+ case MSR_P6_EVNTSEL0:
|
|
|
+ case MSR_P6_EVNTSEL1:
|
|
|
+ if (kvm_pmu_msr(vcpu, msr))
|
|
|
+ return kvm_pmu_set_msr(vcpu, msr, data);
|
|
|
+
|
|
|
+ if (pr || data != 0)
|
|
|
+ pr_unimpl(vcpu, "disabled perfctr wrmsr: "
|
|
|
+ "0x%x data 0x%llx\n", msr, data);
|
|
|
+ break;
|
|
|
case MSR_K7_CLK_CTL:
|
|
|
/*
|
|
|
* Ignore all writes to this no longer documented MSR.
|
|
@@ -1835,6 +1849,14 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
|
|
|
case MSR_FAM10H_MMIO_CONF_BASE:
|
|
|
data = 0;
|
|
|
break;
|
|
|
+ case MSR_P6_PERFCTR0:
|
|
|
+ case MSR_P6_PERFCTR1:
|
|
|
+ case MSR_P6_EVNTSEL0:
|
|
|
+ case MSR_P6_EVNTSEL1:
|
|
|
+ if (kvm_pmu_msr(vcpu, msr))
|
|
|
+ return kvm_pmu_get_msr(vcpu, msr, pdata);
|
|
|
+ data = 0;
|
|
|
+ break;
|
|
|
case MSR_IA32_UCODE_REV:
|
|
|
data = 0x100000000ULL;
|
|
|
break;
|
|
@@ -4180,6 +4202,28 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt,
|
|
|
return kvm_x86_ops->check_intercept(emul_to_vcpu(ctxt), info, stage);
|
|
|
}
|
|
|
|
|
|
+static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt,
|
|
|
+ u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
|
|
|
+{
|
|
|
+ struct kvm_cpuid_entry2 *cpuid = NULL;
|
|
|
+
|
|
|
+ if (eax && ecx)
|
|
|
+ cpuid = kvm_find_cpuid_entry(emul_to_vcpu(ctxt),
|
|
|
+ *eax, *ecx);
|
|
|
+
|
|
|
+ if (cpuid) {
|
|
|
+ *eax = cpuid->eax;
|
|
|
+ *ecx = cpuid->ecx;
|
|
|
+ if (ebx)
|
|
|
+ *ebx = cpuid->ebx;
|
|
|
+ if (edx)
|
|
|
+ *edx = cpuid->edx;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static struct x86_emulate_ops emulate_ops = {
|
|
|
.read_std = kvm_read_guest_virt_system,
|
|
|
.write_std = kvm_write_guest_virt_system,
|
|
@@ -4211,6 +4255,7 @@ static struct x86_emulate_ops emulate_ops = {
|
|
|
.get_fpu = emulator_get_fpu,
|
|
|
.put_fpu = emulator_put_fpu,
|
|
|
.intercept = emulator_intercept,
|
|
|
+ .get_cpuid = emulator_get_cpuid,
|
|
|
};
|
|
|
|
|
|
static void cache_all_regs(struct kvm_vcpu *vcpu)
|