diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
| -rw-r--r-- | arch/x86/kvm/x86.c | 45 | 
1 files changed, 45 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 14d6cadc4ba..9cbfc069811 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -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)  |