Message ID | 20190625112642.113460-1-liran.alon@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: nVMX: Allow restore nested-state to enable eVMCS when vCPU in SMM | expand |
Liran Alon <liran.alon@oracle.com> writes: > As comment in code specifies, SMM temporarily disables VMX so we cannot > be in guest mode, nor can VMLAUNCH/VMRESUME be pending. > > However, code currently assumes that these are the only flags that can be > set on kvm_state->flags. This is not true as KVM_STATE_NESTED_EVMCS > can also be set on this field to signal that eVMCS should be enabled. > > Therefore, fix code to check for guest-mode and pending VMLAUNCH/VMRESUME > explicitly. > > Reviewed-by: Joao Martins <joao.m.martins@oracle.com> > Signed-off-by: Liran Alon <liran.alon@oracle.com> > --- > arch/x86/kvm/vmx/nested.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c > index 5c470db311f7..27ff04874f67 100644 > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -5373,7 +5373,10 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, > * nor can VMLAUNCH/VMRESUME be pending. Outside SMM, SMM flags > * must be zero. > */ > - if (is_smm(vcpu) ? kvm_state->flags : kvm_state->hdr.vmx.smm.flags) > + if (is_smm(vcpu) ? > + (kvm_state->flags & > + (KVM_STATE_NESTED_GUEST_MODE | KVM_STATE_NESTED_RUN_PENDING)) > + : kvm_state->hdr.vmx.smm.flags) > return -EINVAL; > > if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) && Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Gentle ping. > On 25 Jun 2019, at 16:11, Vitaly Kuznetsov <vkuznets@redhat.com> wrote: > > Liran Alon <liran.alon@oracle.com> writes: > >> As comment in code specifies, SMM temporarily disables VMX so we cannot >> be in guest mode, nor can VMLAUNCH/VMRESUME be pending. >> >> However, code currently assumes that these are the only flags that can be >> set on kvm_state->flags. This is not true as KVM_STATE_NESTED_EVMCS >> can also be set on this field to signal that eVMCS should be enabled. >> >> Therefore, fix code to check for guest-mode and pending VMLAUNCH/VMRESUME >> explicitly. >> >> Reviewed-by: Joao Martins <joao.m.martins@oracle.com> >> Signed-off-by: Liran Alon <liran.alon@oracle.com> >> --- >> arch/x86/kvm/vmx/nested.c | 5 ++++- >> 1 file changed, 4 insertions(+), 1 deletion(-) >> >> diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c >> index 5c470db311f7..27ff04874f67 100644 >> --- a/arch/x86/kvm/vmx/nested.c >> +++ b/arch/x86/kvm/vmx/nested.c >> @@ -5373,7 +5373,10 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, >> * nor can VMLAUNCH/VMRESUME be pending. Outside SMM, SMM flags >> * must be zero. >> */ >> - if (is_smm(vcpu) ? kvm_state->flags : kvm_state->hdr.vmx.smm.flags) >> + if (is_smm(vcpu) ? >> + (kvm_state->flags & >> + (KVM_STATE_NESTED_GUEST_MODE | KVM_STATE_NESTED_RUN_PENDING)) >> + : kvm_state->hdr.vmx.smm.flags) >> return -EINVAL; >> >> if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) && > > Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> > > -- > Vitaly
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 5c470db311f7..27ff04874f67 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -5373,7 +5373,10 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, * nor can VMLAUNCH/VMRESUME be pending. Outside SMM, SMM flags * must be zero. */ - if (is_smm(vcpu) ? kvm_state->flags : kvm_state->hdr.vmx.smm.flags) + if (is_smm(vcpu) ? + (kvm_state->flags & + (KVM_STATE_NESTED_GUEST_MODE | KVM_STATE_NESTED_RUN_PENDING)) + : kvm_state->hdr.vmx.smm.flags) return -EINVAL; if ((kvm_state->hdr.vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&