diff options
| -rw-r--r-- | arch/x86/include/asm/kvm_host.h | 1 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx/vmx.c | 13 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx/vmx.h | 1 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 12 |
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 | ||
| 8734 | int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) | 8745 | int 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); |
