From: Gleb Natapov <gleb@redhat.com>
To: Julian Stecklina <jsteckli@os.inf.tu-dresden.de>
Cc: kvm@vger.kernel.org
Subject: Re: [PATCH v3] KVM: x86: Make register state after reset conform to specification
Date: Wed, 5 Dec 2012 12:50:11 +0200 [thread overview]
Message-ID: <20121205105011.GM19514@redhat.com> (raw)
In-Reply-To: <1354623210-25622-1-git-send-email-jsteckli@os.inf.tu-dresden.de>
On Tue, Dec 04, 2012 at 01:13:30PM +0100, Julian Stecklina wrote:
> VMX behaves now as SVM wrt to FPU initialization. Code has been moved to
> generic code path. General-purpose registers are now cleared on reset and
> INIT. SVM code properly initializes EDX.
>
Looks good overall, small bug bellow and regenerate the patch against
git://git.kernel.org/pub/scm/virt/kvm/kvm.git queue branch please.
> Signed-off-by: Julian Stecklina <jsteckli@os.inf.tu-dresden.de>
> ---
> arch/x86/kvm/cpuid.c | 1 +
> arch/x86/kvm/svm.c | 14 ++++++--------
> arch/x86/kvm/vmx.c | 7 -------
> arch/x86/kvm/x86.c | 8 ++++++++
> 4 files changed, 15 insertions(+), 15 deletions(-)
>
> diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
> index 0595f13..aa468c2 100644
> --- a/arch/x86/kvm/cpuid.c
> +++ b/arch/x86/kvm/cpuid.c
> @@ -659,6 +659,7 @@ void kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx)
> } else
> *eax = *ebx = *ecx = *edx = 0;
> }
> +EXPORT_SYMBOL_GPL(kvm_cpuid);
>
> void kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
> {
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> index baead95..6c50121 100644
> --- a/arch/x86/kvm/svm.c
> +++ b/arch/x86/kvm/svm.c
> @@ -20,6 +20,7 @@
> #include "mmu.h"
> #include "kvm_cache_regs.h"
> #include "x86.h"
> +#include "cpuid.h"
>
> #include <linux/module.h>
> #include <linux/mod_devicetable.h>
> @@ -1190,6 +1191,8 @@ static void init_vmcb(struct vcpu_svm *svm)
> static int svm_vcpu_reset(struct kvm_vcpu *vcpu)
> {
> struct vcpu_svm *svm = to_svm(vcpu);
> + u32 dummy;
> + u32 eax = 1;
>
> init_vmcb(svm);
>
> @@ -1198,8 +1201,9 @@ static int svm_vcpu_reset(struct kvm_vcpu *vcpu)
> svm->vmcb->save.cs.base = svm->vcpu.arch.sipi_vector << 12;
> svm->vmcb->save.cs.selector = svm->vcpu.arch.sipi_vector << 8;
> }
> - vcpu->arch.regs_avail = ~0;
> - vcpu->arch.regs_dirty = ~0;
> +
> + kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy);
> + kvm_register_write(vcpu, VCPU_REGS_RDX, eax);
>
> return 0;
> }
> @@ -1257,10 +1261,6 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
> init_vmcb(svm);
> kvm_write_tsc(&svm->vcpu, 0);
>
> - err = fx_init(&svm->vcpu);
> - if (err)
> - goto free_page4;
> -
> svm->vcpu.arch.apic_base = 0xfee00000 | MSR_IA32_APICBASE_ENABLE;
> if (kvm_vcpu_is_bsp(&svm->vcpu))
> svm->vcpu.arch.apic_base |= MSR_IA32_APICBASE_BSP;
> @@ -1269,8 +1269,6 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id)
>
> return &svm->vcpu;
>
> -free_page4:
> - __free_page(hsave_page);
> free_page3:
> __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER);
> free_page2:
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index ff66a3b..85cecfe 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -3942,8 +3942,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
> u64 msr;
> int ret;
>
> - vcpu->arch.regs_avail = ~((1 << VCPU_REGS_RIP) | (1 << VCPU_REGS_RSP));
> -
> vmx->rmode.vm86_active = 0;
>
> vmx->soft_vnmi_blocked = 0;
> @@ -3955,10 +3953,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
> msr |= MSR_IA32_APICBASE_BSP;
> kvm_set_apic_base(&vmx->vcpu, msr);
>
> - ret = fx_init(&vmx->vcpu);
> - if (ret != 0)
> - goto out;
> -
> vmx_segment_cache_clear(vmx);
>
> seg_setup(VCPU_SREG_CS);
> @@ -3999,7 +3993,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
> kvm_rip_write(vcpu, 0xfff0);
> else
> kvm_rip_write(vcpu, 0);
> - kvm_register_write(vcpu, VCPU_REGS_RSP, 0);
>
> vmcs_writel(GUEST_DR7, 0x400);
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 2966c84..2e031bf 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -6066,6 +6066,10 @@ int kvm_arch_vcpu_reset(struct kvm_vcpu *vcpu)
>
> kvm_pmu_reset(vcpu);
>
> + memset(vcpu->arch.regs, 0, sizeof(vcpu->arch.regs));
> + vcpu->arch.regs_avail = ~0;
> + vcpu->arch.regs_dirty = ~0;
> +
> return kvm_x86_ops->vcpu_reset(vcpu);
> }
>
> @@ -6229,6 +6233,10 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
> if (!zalloc_cpumask_var(&vcpu->arch.wbinvd_dirty_mask, GFP_KERNEL))
> goto fail_free_mce_banks;
>
> + r = fx_init(vcpu);
> + if (r)
> + goto fail_free_mce_banks;
> +
You need to free vcpu->arch.wbinvd_dirty_mask in case fx_init() fails.
> kvm_async_pf_hash_reset(vcpu);
> kvm_pmu_init(vcpu);
>
> --
> 1.7.11.7
--
Gleb.
next prev parent reply other threads:[~2012-12-05 11:32 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-29 14:07 KVM VMX: register state after reset violates spec Julian Stecklina
2012-11-29 14:38 ` [PATCH] KVM VMX: Make register state after reset conform to specification Julian Stecklina
2012-11-29 14:55 ` Julian Stecklina
2012-12-02 13:38 ` KVM VMX: register state after reset violates spec Gleb Natapov
2012-12-03 12:05 ` Julian Stecklina
2012-12-03 13:46 ` [PATCH v2] KVM: x86: Make register state after reset conform to specification Julian Stecklina
2012-12-04 9:48 ` Gleb Natapov
2012-12-04 12:13 ` [PATCH v3] " Julian Stecklina
2012-12-05 10:50 ` Gleb Natapov [this message]
2012-12-05 12:00 ` [PATCH v4] " Julian Stecklina
2012-12-05 13:27 ` Gleb Natapov
2012-12-05 14:26 ` [PATCH v5] " Julian Stecklina
2012-12-05 16:02 ` Gleb Natapov
2012-12-05 14:27 ` [PATCH v4] " Julian Stecklina
2012-12-03 13:49 ` KVM VMX: register state after reset violates spec Julian Stecklina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121205105011.GM19514@redhat.com \
--to=gleb@redhat.com \
--cc=jsteckli@os.inf.tu-dresden.de \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.