aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/kvm_host.h1
-rw-r--r--arch/x86/kvm/vmx/vmx.c13
-rw-r--r--arch/x86/kvm/vmx/vmx.h1
-rw-r--r--arch/x86/kvm/x86.c12
4 files changed, 13 insertions, 14 deletions
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 679168931c40..264814f26ce0 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -568,6 +568,7 @@ struct kvm_vcpu_arch {
568 bool tpr_access_reporting; 568 bool tpr_access_reporting;
569 u64 ia32_xss; 569 u64 ia32_xss;
570 u64 microcode_version; 570 u64 microcode_version;
571 u64 arch_capabilities;
571 572
572 /* 573 /*
573 * Paging state of the vcpu 574 * Paging state of the vcpu
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 6aa84e09217b..ab432a930ae8 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -1683,12 +1683,6 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
1683 1683
1684 msr_info->data = to_vmx(vcpu)->spec_ctrl; 1684 msr_info->data = to_vmx(vcpu)->spec_ctrl;
1685 break; 1685 break;
1686 case MSR_IA32_ARCH_CAPABILITIES:
1687 if (!msr_info->host_initiated &&
1688 !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
1689 return 1;
1690 msr_info->data = to_vmx(vcpu)->arch_capabilities;
1691 break;
1692 case MSR_IA32_SYSENTER_CS: 1686 case MSR_IA32_SYSENTER_CS:
1693 msr_info->data = vmcs_read32(GUEST_SYSENTER_CS); 1687 msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
1694 break; 1688 break;
@@ -1895,11 +1889,6 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
1895 vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD, 1889 vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD,
1896 MSR_TYPE_W); 1890 MSR_TYPE_W);
1897 break; 1891 break;
1898 case MSR_IA32_ARCH_CAPABILITIES:
1899 if (!msr_info->host_initiated)
1900 return 1;
1901 vmx->arch_capabilities = data;
1902 break;
1903 case MSR_IA32_CR_PAT: 1892 case MSR_IA32_CR_PAT:
1904 if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { 1893 if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
1905 if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data)) 1894 if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
@@ -4088,8 +4077,6 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx)
4088 ++vmx->nmsrs; 4077 ++vmx->nmsrs;
4089 } 4078 }
4090 4079
4091 vmx->arch_capabilities = kvm_get_arch_capabilities();
4092
4093 vm_exit_controls_init(vmx, vmx_vmexit_ctrl()); 4080 vm_exit_controls_init(vmx, vmx_vmexit_ctrl());
4094 4081
4095 /* 22.2.1, 20.8.1 */ 4082 /* 22.2.1, 20.8.1 */
diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h
index 1554cb45b393..a1e00d0a2482 100644
--- a/arch/x86/kvm/vmx/vmx.h
+++ b/arch/x86/kvm/vmx/vmx.h
@@ -190,7 +190,6 @@ struct vcpu_vmx {
190 u64 msr_guest_kernel_gs_base; 190 u64 msr_guest_kernel_gs_base;
191#endif 191#endif
192 192
193 u64 arch_capabilities;
194 u64 spec_ctrl; 193 u64 spec_ctrl;
195 194
196 u32 vm_entry_controls_shadow; 195 u32 vm_entry_controls_shadow;
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 491e92383da8..9fc378531ca7 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2443,6 +2443,11 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2443 if (msr_info->host_initiated) 2443 if (msr_info->host_initiated)
2444 vcpu->arch.microcode_version = data; 2444 vcpu->arch.microcode_version = data;
2445 break; 2445 break;
2446 case MSR_IA32_ARCH_CAPABILITIES:
2447 if (!msr_info->host_initiated)
2448 return 1;
2449 vcpu->arch.arch_capabilities = data;
2450 break;
2446 case MSR_EFER: 2451 case MSR_EFER:
2447 return set_efer(vcpu, data); 2452 return set_efer(vcpu, data);
2448 case MSR_K7_HWCR: 2453 case MSR_K7_HWCR:
@@ -2747,6 +2752,12 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2747 case MSR_IA32_UCODE_REV: 2752 case MSR_IA32_UCODE_REV:
2748 msr_info->data = vcpu->arch.microcode_version; 2753 msr_info->data = vcpu->arch.microcode_version;
2749 break; 2754 break;
2755 case MSR_IA32_ARCH_CAPABILITIES:
2756 if (!msr_info->host_initiated &&
2757 !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
2758 return 1;
2759 msr_info->data = vcpu->arch.arch_capabilities;
2760 break;
2750 case MSR_IA32_TSC: 2761 case MSR_IA32_TSC:
2751 msr_info->data = kvm_scale_tsc(vcpu, rdtsc()) + vcpu->arch.tsc_offset; 2762 msr_info->data = kvm_scale_tsc(vcpu, rdtsc()) + vcpu->arch.tsc_offset;
2752 break; 2763 break;
@@ -8733,6 +8744,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm,
8733 8744
8734int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) 8745int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
8735{ 8746{
8747 vcpu->arch.arch_capabilities = kvm_get_arch_capabilities();
8736 vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT; 8748 vcpu->arch.msr_platform_info = MSR_PLATFORM_INFO_CPUID_FAULT;
8737 kvm_vcpu_mtrr_init(vcpu); 8749 kvm_vcpu_mtrr_init(vcpu);
8738 vcpu_load(vcpu); 8750 vcpu_load(vcpu);