Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932923AbbD0Nhx (ORCPT ); Mon, 27 Apr 2015 09:37:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46188 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932758AbbD0Nhv (ORCPT ); Mon, 27 Apr 2015 09:37:51 -0400 Message-ID: <553E3BA9.8000403@redhat.com> Date: Mon, 27 Apr 2015 15:37:45 +0200 From: Paolo Bonzini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 MIME-Version: 1.0 To: =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , linux-kernel@vger.kernel.org CC: kvm@vger.kernel.org Subject: Re: [PATCH] KVM: x86: fix initial PAT value References: <1430140285-21799-1-git-send-email-rkrcmar@redhat.com> In-Reply-To: <1430140285-21799-1-git-send-email-rkrcmar@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3064 Lines: 89 On 27/04/2015 15:11, Radim Krčmář wrote: > PAT should be 0007_0406_0007_0406h on RESET and not modified on INIT. > 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čmář > --- > 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 = 0x0007040600070406ULL; > + save->g_pat = svm->vcpu.arch.pat; > save->cr3 = 0; > save->cr4 = 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)); > > - 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 = 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 = host_pat; > - } > + if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) > + vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat); > > for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i) { > u32 index = 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) > > vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu); > > + vcpu->arch.pat = MSR_IA32_CR_PAT_DEFAULT; > + > kvm_async_pf_hash_reset(vcpu); > kvm_pmu_init(vcpu); > > 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" > > +#define MSR_IA32_CR_PAT_DEFAULT 0x0007040600070406ULL > + > static inline void kvm_clear_exception_queue(struct kvm_vcpu *vcpu) > { > vcpu->arch.exception.pending = false; > Applied, thanks. Paolo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/