35 lines
1.4 KiB
Diff
35 lines
1.4 KiB
Diff
|
# Commit fce79f8ce91dc45f3a4d699ee67c49e6cbeb1197
|
||
|
# Date 2014-04-01 16:49:18 +0200
|
||
|
# Author Jan Beulich <jbeulich@suse.com>
|
||
|
# Committer Jan Beulich <jbeulich@suse.com>
|
||
|
VMX: fix PAT value seen by guest
|
||
|
|
||
|
The XSA-60 fixes introduced a window during which the guest PAT gets
|
||
|
forced to all zeros. This shouldn't be visible to the guest. Therefore
|
||
|
we need to intercept PAT MSR accesses during that time period.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
Reviewed-by: Liu Jinsong <jinsong.liu@intel.com>
|
||
|
|
||
|
--- a/xen/arch/x86/hvm/vmx/vmx.c
|
||
|
+++ b/xen/arch/x86/hvm/vmx/vmx.c
|
||
|
@@ -984,6 +984,8 @@ static void vmx_handle_cd(struct vcpu *v
|
||
|
|
||
|
vmx_get_guest_pat(v, pat);
|
||
|
vmx_set_guest_pat(v, uc_pat);
|
||
|
+ vmx_enable_intercept_for_msr(v, MSR_IA32_CR_PAT,
|
||
|
+ MSR_TYPE_R | MSR_TYPE_W);
|
||
|
|
||
|
wbinvd(); /* flush possibly polluted cache */
|
||
|
hvm_asid_flush_vcpu(v); /* invalidate memory type cached in TLB */
|
||
|
@@ -993,6 +995,9 @@ static void vmx_handle_cd(struct vcpu *v
|
||
|
{
|
||
|
v->arch.hvm_vcpu.cache_mode = NORMAL_CACHE_MODE;
|
||
|
vmx_set_guest_pat(v, *pat);
|
||
|
+ if ( !iommu_enabled || iommu_snoop )
|
||
|
+ vmx_disable_intercept_for_msr(v, MSR_IA32_CR_PAT,
|
||
|
+ MSR_TYPE_R | MSR_TYPE_W);
|
||
|
hvm_asid_flush_vcpu(v); /* no need to flush cache */
|
||
|
}
|
||
|
}
|