From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wanpeng Li Subject: Re: [PATCH] KVM: x86: fix initial PAT value Date: Wed, 13 May 2015 13:02:44 +0800 Message-ID: <20150513050244.GA4300@kernel> References: <1430140285-21799-1-git-send-email-rkrcmar@redhat.com> Reply-To: Wanpeng Li Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, Paolo Bonzini , Wanpeng Li To: Radim =?utf-8?B?S3LEjW3DocWZ?= Return-path: Content-Disposition: inline In-Reply-To: <1430140285-21799-1-git-send-email-rkrcmar@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org Hi Radim, On Mon, Apr 27, 2015 at 03:11:25PM +0200, Radim Kr=C4=8Dm=C3=A1=C5=99 w= rote: >PAT should be 0007_0406_0007_0406h on RESET and not modified on INIT. Could you point out where this value is described in SDM? :) Regards, Wanpeng Li=20 >VMX used a wrong value (host's PAT) and while SVM used the right one, >it never got to arch.pat. > >This is not an issue with QEMU as it will force the correct value. > >Signed-off-by: Radim Kr=C4=8Dm=C3=A1=C5=99 >--- > arch/x86/kvm/svm.c | 2 +- > arch/x86/kvm/vmx.c | 12 ++---------- > arch/x86/kvm/x86.c | 2 ++ > arch/x86/kvm/x86.h | 2 ++ > 4 files changed, 7 insertions(+), 11 deletions(-) > >diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c >index ce741b8650f6..9aceb4a8c147 100644 >--- a/arch/x86/kvm/svm.c >+++ b/arch/x86/kvm/svm.c >@@ -1176,7 +1176,7 @@ static void init_vmcb(struct vcpu_svm *svm) > clr_exception_intercept(svm, PF_VECTOR); > clr_cr_intercept(svm, INTERCEPT_CR3_READ); > clr_cr_intercept(svm, INTERCEPT_CR3_WRITE); >- save->g_pat =3D 0x0007040600070406ULL; >+ save->g_pat =3D svm->vcpu.arch.pat; > save->cr3 =3D 0; > save->cr4 =3D 0; > } >diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c >index f7b61687bd79..62459382d305 100644 >--- a/arch/x86/kvm/vmx.c >+++ b/arch/x86/kvm/vmx.c >@@ -4667,16 +4667,8 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) > vmcs_write32(VM_ENTRY_MSR_LOAD_COUNT, 0); > vmcs_write64(VM_ENTRY_MSR_LOAD_ADDR, __pa(vmx->msr_autoload.guest)); >=20 >- if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { >- u32 msr_low, msr_high; >- u64 host_pat; >- rdmsr(MSR_IA32_CR_PAT, msr_low, msr_high); >- host_pat =3D msr_low | ((u64) msr_high << 32); >- /* Write the default value follow host pat */ >- vmcs_write64(GUEST_IA32_PAT, host_pat); >- /* Keep arch.pat sync with GUEST_IA32_PAT */ >- vmx->vcpu.arch.pat =3D host_pat; >- } >+ if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) >+ vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat); >=20 > for (i =3D 0; i < ARRAY_SIZE(vmx_msr_index); ++i) { > u32 index =3D vmx_msr_index[i]; >diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c >index c73efcd03e29..a20898f9e43a 100644 >--- a/arch/x86/kvm/x86.c >+++ b/arch/x86/kvm/x86.c >@@ -7363,6 +7363,8 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) >=20 > vcpu->arch.maxphyaddr =3D cpuid_query_maxphyaddr(vcpu); >=20 >+ vcpu->arch.pat =3D MSR_IA32_CR_PAT_DEFAULT; >+ > kvm_async_pf_hash_reset(vcpu); > kvm_pmu_init(vcpu); >=20 >diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h >index f5fef1868096..01a1d011e073 100644 >--- a/arch/x86/kvm/x86.h >+++ b/arch/x86/kvm/x86.h >@@ -4,6 +4,8 @@ > #include > #include "kvm_cache_regs.h" >=20 >+#define MSR_IA32_CR_PAT_DEFAULT 0x0007040600070406ULL >+ > static inline void kvm_clear_exception_queue(struct kvm_vcpu *vcpu) > { > vcpu->arch.exception.pending =3D false; >--=20 >2.3.6 > >-- >To unsubscribe from this list: send the line "unsubscribe kvm" in >the body of a message to majordomo@vger.kernel.org >More majordomo info at http://vger.kernel.org/majordomo-info.html