Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1385451 > unrolled thread
| Started by | Bruce Rogers <brogers@suse.com> |
|---|---|
| First post | 2016-04-22 21:20 +0200 |
| Last post | 2016-04-28 22:40 +0200 |
| Articles | 4 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset Bruce Rogers <brogers@suse.com> - 2016-04-22 21:20 +0200
Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset Greg KH <greg@kroah.com> - 2016-04-23 00:20 +0200
Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset Radim Krčmář <rkrcmar@redhat.com> - 2016-04-28 21:10 +0200
Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset "Bruce Rogers" <brogers@suse.com> - 2016-04-28 22:40 +0200
| From | Bruce Rogers <brogers@suse.com> |
|---|---|
| Date | 2016-04-22 21:20 +0200 |
| Subject | [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset |
| Message-ID | <rqOMp-78L-1@gated-at.bofh.it> |
Commit d28bc9dd25ce reversed the order of two lines which initialize cr0, allowing the current (old) cr0 value to mess up vcpu initialization. This was observed in the checks for cr0 X86_CR0_WP bit in the context of kvm_mmu_reset_context(). Besides, setting vcpu->arch.cr0 after vmx_set_cr0() is completely redundant. Change the order back to ensure proper vcpu initialization. The combination of booting with ovmf firmware when guest vcpus > 1 and kvm's ept=N option being set results in a VM-entry failure. This patch fixes that. Signed-off-by: Bruce Rogers <brogers@suse.com> --- arch/x86/kvm/vmx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index ee1c8a9..ab4a387 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -5046,8 +5046,8 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) vmcs_write16(VIRTUAL_PROCESSOR_ID, vmx->vpid); cr0 = X86_CR0_NW | X86_CR0_CD | X86_CR0_ET; - vmx_set_cr0(vcpu, cr0); /* enter rmode */ vmx->vcpu.arch.cr0 = cr0; + vmx_set_cr0(vcpu, cr0); /* enter rmode */ vmx_set_cr4(vcpu, 0); vmx_set_efer(vcpu, 0); vmx_fpu_activate(vcpu); -- 1.9.0
[toc] | [next] | [standalone]
| From | Greg KH <greg@kroah.com> |
|---|---|
| Date | 2016-04-23 00:20 +0200 |
| Subject | Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset |
| Message-ID | <rqRAB-Pr-15@gated-at.bofh.it> |
| In reply to | #1385451 |
On Fri, Apr 22, 2016 at 12:56:03PM -0600, Bruce Rogers wrote: > Commit d28bc9dd25ce reversed the order of two lines which initialize cr0, > allowing the current (old) cr0 value to mess up vcpu initialization. > This was observed in the checks for cr0 X86_CR0_WP bit in the context of > kvm_mmu_reset_context(). Besides, setting vcpu->arch.cr0 after vmx_set_cr0() > is completely redundant. Change the order back to ensure proper vcpu > initialization. > > The combination of booting with ovmf firmware when guest vcpus > 1 and kvm's > ept=N option being set results in a VM-entry failure. This patch fixes that. > > Signed-off-by: Bruce Rogers <brogers@suse.com> > --- > arch/x86/kvm/vmx.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) <formletter> This is not the correct way to submit patches for inclusion in the stable kernel tree. Please read Documentation/stable_kernel_rules.txt for how to do this properly. </formletter>
[toc] | [prev] | [next] | [standalone]
| From | Radim Krčmář <rkrcmar@redhat.com> |
|---|---|
| Date | 2016-04-28 21:10 +0200 |
| Subject | Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset |
| Message-ID | <rsZu2-JY-7@gated-at.bofh.it> |
| In reply to | #1385451 |
2016-04-22 12:56-0600, Bruce Rogers:
> Commit d28bc9dd25ce reversed the order of two lines which initialize cr0,
> allowing the current (old) cr0 value to mess up vcpu initialization.
> This was observed in the checks for cr0 X86_CR0_WP bit in the context of
> kvm_mmu_reset_context(). Besides, setting vcpu->arch.cr0 after vmx_set_cr0()
> is completely redundant. Change the order back to ensure proper vcpu
> initialization.
>
> The combination of booting with ovmf firmware when guest vcpus > 1 and kvm's
> ept=N option being set results in a VM-entry failure. This patch fixes that.
Greg pointed out missing,
Cc: stable@vger.kernel.org
when stable@vger.kernel.org was Cc'd. Adding
Fixes: d28bc9dd25ce ("KVM: x86: INIT and reset sequences are different")
would be nice too (even when it is redundant).
> Signed-off-by: Bruce Rogers <brogers@suse.com>
> ---
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> @@ -5046,8 +5046,8 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
> cr0 = X86_CR0_NW | X86_CR0_CD | X86_CR0_ET;
> - vmx_set_cr0(vcpu, cr0); /* enter rmode */
> vmx->vcpu.arch.cr0 = cr0;
> + vmx_set_cr0(vcpu, cr0); /* enter rmode */
So vmx_set_cr0() has a code that depends on vmx->vcpu.arch.cr0 being
already set the to new value. Do you know what function is it?
I think we better set vmx->vcpu.arch.cr0 early in vmx_set_cr0().
Or do other callsites somehow depend on the old cr0 value?
Thanks.
[toc] | [prev] | [next] | [standalone]
| From | "Bruce Rogers" <brogers@suse.com> |
|---|---|
| Date | 2016-04-28 22:40 +0200 |
| Subject | Re: [PATCH] KVM: x86: fix ordering of cr0 initialization code in vmx_cpu_reset |
| Message-ID | <rt0T8-1Qs-9@gated-at.bofh.it> |
| In reply to | #1390469 |
>>> On 4/28/2016 at 01:08 PM, Radim Kr*má* <rkrcmar@redhat.com> wrote:
> 2016-04-22 12:56-0600, Bruce Rogers:
>> Commit d28bc9dd25ce reversed the order of two lines which initialize cr0,
>> allowing the current (old) cr0 value to mess up vcpu initialization.
>> This was observed in the checks for cr0 X86_CR0_WP bit in the context of
>> kvm_mmu_reset_context(). Besides, setting vcpu->arch.cr0 after vmx_set_cr0()
>> is completely redundant. Change the order back to ensure proper vcpu
>> initialization.
>>
>> The combination of booting with ovmf firmware when guest vcpus > 1 and kvm's
>> ept=N option being set results in a VM-entry failure. This patch fixes that.
>
> Greg pointed out missing,
> Cc: stable@vger.kernel.org
> when stable@vger.kernel.org was Cc'd. Adding
> Fixes: d28bc9dd25ce ("KVM: x86: INIT and reset sequences are different")
> would be nice too (even when it is redundant).
>
>> Signed-off-by: Bruce Rogers <brogers@suse.com>
>> ---
>> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
>> @@ -5046,8 +5046,8 @@ static void vmx_vcpu_reset(struct kvm_vcpu *vcpu, bool
> init_event)
>> cr0 = X86_CR0_NW | X86_CR0_CD | X86_CR0_ET;
>> - vmx_set_cr0(vcpu, cr0); /* enter rmode */
>> vmx->vcpu.arch.cr0 = cr0;
>> + vmx_set_cr0(vcpu, cr0); /* enter rmode */
>
> So vmx_set_cr0() has a code that depends on vmx->vcpu.arch.cr0 being
> already set the to new value. Do you know what function is it?
The one which I partly referred to above is the following:
vmx_set_cr0() ->
enter_rmode() ->
kvm_mmu_reset_context() ->
init_kvm_softmmu() ->
kvm_init_shadow_mmu() ->
is_write_protected()
which uses the CR0 WP bit.
There may be other problematic references. I haven't tried to do an
exhaustive search.
>
> I think we better set vmx->vcpu.arch.cr0 early in vmx_set_cr0().
> Or do other callsites somehow depend on the old cr0 value?
You may be right that that is a better overall fix. I was simply trying
to undo the erroneous lines in the commit which broke things, partly
to have a patch better suited for applying to stable releases.
I'll send a v2 shortly with your suggested additions to the patch header.
Thanks,
Bruce
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web