|
@@ -594,6 +594,8 @@ struct vcpu_vmx {
|
|
u64 msr_guest_kernel_gs_base;
|
|
u64 msr_guest_kernel_gs_base;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ u64 arch_capabilities;
|
|
|
|
+
|
|
u32 vm_entry_controls_shadow;
|
|
u32 vm_entry_controls_shadow;
|
|
u32 vm_exit_controls_shadow;
|
|
u32 vm_exit_controls_shadow;
|
|
u32 secondary_exec_control;
|
|
u32 secondary_exec_control;
|
|
@@ -3260,6 +3262,12 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|
case MSR_IA32_TSC:
|
|
case MSR_IA32_TSC:
|
|
msr_info->data = guest_read_tsc(vcpu);
|
|
msr_info->data = guest_read_tsc(vcpu);
|
|
break;
|
|
break;
|
|
|
|
+ case MSR_IA32_ARCH_CAPABILITIES:
|
|
|
|
+ if (!msr_info->host_initiated &&
|
|
|
|
+ !guest_cpuid_has(vcpu, X86_FEATURE_ARCH_CAPABILITIES))
|
|
|
|
+ return 1;
|
|
|
|
+ msr_info->data = to_vmx(vcpu)->arch_capabilities;
|
|
|
|
+ break;
|
|
case MSR_IA32_SYSENTER_CS:
|
|
case MSR_IA32_SYSENTER_CS:
|
|
msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
|
|
msr_info->data = vmcs_read32(GUEST_SYSENTER_CS);
|
|
break;
|
|
break;
|
|
@@ -3395,6 +3403,11 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
|
vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD,
|
|
vmx_disable_intercept_for_msr(vmx->vmcs01.msr_bitmap, MSR_IA32_PRED_CMD,
|
|
MSR_TYPE_W);
|
|
MSR_TYPE_W);
|
|
break;
|
|
break;
|
|
|
|
+ case MSR_IA32_ARCH_CAPABILITIES:
|
|
|
|
+ if (!msr_info->host_initiated)
|
|
|
|
+ return 1;
|
|
|
|
+ vmx->arch_capabilities = data;
|
|
|
|
+ break;
|
|
case MSR_IA32_CR_PAT:
|
|
case MSR_IA32_CR_PAT:
|
|
if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
|
|
if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) {
|
|
if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
|
|
if (!kvm_mtrr_valid(vcpu, MSR_IA32_CR_PAT, data))
|
|
@@ -5657,6 +5670,8 @@ static void vmx_vcpu_setup(struct vcpu_vmx *vmx)
|
|
++vmx->nmsrs;
|
|
++vmx->nmsrs;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if (boot_cpu_has(X86_FEATURE_ARCH_CAPABILITIES))
|
|
|
|
+ rdmsrl(MSR_IA32_ARCH_CAPABILITIES, vmx->arch_capabilities);
|
|
|
|
|
|
vm_exit_controls_init(vmx, vmcs_config.vmexit_ctrl);
|
|
vm_exit_controls_init(vmx, vmcs_config.vmexit_ctrl);
|
|
|
|
|