From: Maxim Levitsky <mlevitsk@redhat.com>
To: kvm@vger.kernel.org
Cc: x86@kernel.org (maintainer:X86 ARCHITECTURE (32-BIT AND 64-BIT)),
Jim Mattson <jmattson@google.com>, Ingo Molnar <mingo@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
linux-kernel@vger.kernel.org (open list:X86 ARCHITECTURE (32-BIT
AND 64-BIT)), "H. Peter Anvin" <hpa@zytor.com>,
Sean Christopherson <sean.j.christopherson@intel.com>,
Joerg Roedel <joro@8bytes.org>,
Wanpeng Li <wanpengli@tencent.com>,
Borislav Petkov <bp@alien8.de>,
Vitaly Kuznetsov <vkuznets@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Maxim Levitsky <mlevitsk@redhat.com>
Subject: [PATCH v2 5/7] KVM: nSVM: more strict smm checks
Date: Thu, 20 Aug 2020 16:33:37 +0300 [thread overview]
Message-ID: <20200820133339.372823-6-mlevitsk@redhat.com> (raw)
In-Reply-To: <20200820133339.372823-1-mlevitsk@redhat.com>
* check that guest is 64 bit guest, otherwise the fields in the smm
state area are not defined
* If the SMM area indicates that SMM interrupted a running guest,
check that EFER.SVME which is also saved in this area is set, otherwise
the guest might have tampered with SMM save area, and so indicate
emulation failure which should triple fault the guest.
* Check that that guest CPUID supports SVM (due to the same issue as above)
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
---
arch/x86/kvm/svm/svm.c | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index f4569899361f..2ac13420055d 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -3902,22 +3902,29 @@ static int svm_pre_enter_smm(struct kvm_vcpu *vcpu, char *smstate)
static int svm_pre_leave_smm(struct kvm_vcpu *vcpu, const char *smstate)
{
struct vcpu_svm *svm = to_svm(vcpu);
- struct vmcb *nested_vmcb;
struct kvm_host_map map;
- u64 guest;
- u64 vmcb12_gpa;
int ret = 0;
- guest = GET_SMSTATE(u64, smstate, 0x7ed8);
- vmcb12_gpa = GET_SMSTATE(u64, smstate, 0x7ee0);
+ if (guest_cpuid_has(vcpu, X86_FEATURE_LM)) {
+ u64 saved_efer = GET_SMSTATE(u64, smstate, 0x7ed0);
+ u64 guest = GET_SMSTATE(u64, smstate, 0x7ed8);
+ u64 vmcb12_gpa = GET_SMSTATE(u64, smstate, 0x7ee0);
- if (guest) {
- if (kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(vmcb12_gpa), &map) == -EINVAL)
- return 1;
+ if (guest) {
- nested_vmcb = map.hva;
- ret = enter_svm_guest_mode(svm, vmcb12_gpa, nested_vmcb);
- kvm_vcpu_unmap(&svm->vcpu, &map, true);
+ if (!guest_cpuid_has(vcpu, X86_FEATURE_SVM))
+ return 1;
+
+ if (!(saved_efer && EFER_SVME))
+ return 1;
+
+ if (kvm_vcpu_map(&svm->vcpu,
+ gpa_to_gfn(vmcb12_gpa), &map) == -EINVAL)
+ return 1;
+
+ ret = enter_svm_guest_mode(svm, vmcb12_gpa, map.hva);
+ kvm_vcpu_unmap(&svm->vcpu, &map, true);
+ }
}
return ret;
--
2.26.2
next prev parent reply other threads:[~2020-08-20 13:35 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-20 13:33 [PATCH v2 0/7] KVM: nSVM: ondemand nested state allocation + smm fixes Maxim Levitsky
2020-08-20 13:33 ` [PATCH v2 1/7] KVM: SVM: rename a variable in the svm_create_vcpu Maxim Levitsky
2020-08-20 20:52 ` Jim Mattson
2020-08-20 13:33 ` [PATCH v2 2/7] KVM: nSVM: rename nested 'vmcb' to vmcb12_gpa in few places Maxim Levitsky
2020-08-20 21:00 ` Jim Mattson
2020-08-24 11:37 ` Maxim Levitsky
2020-08-20 13:33 ` [PATCH v2 3/7] KVM: SVM: refactor msr permission bitmap allocation Maxim Levitsky
2020-08-20 21:26 ` Jim Mattson
2020-08-24 11:43 ` Maxim Levitsky
2020-08-20 13:33 ` [PATCH v2 4/7] KVM: x86: allow kvm_x86_ops.set_efer to return a value Maxim Levitsky
2020-08-20 21:43 ` Jim Mattson
2020-08-21 0:43 ` Sean Christopherson
2020-08-27 10:23 ` Maxim Levitsky
2020-08-20 13:33 ` Maxim Levitsky [this message]
2020-08-20 13:33 ` [PATCH v2 6/7] KVM: emulator: more strict rsm checks Maxim Levitsky
2020-08-20 13:33 ` [PATCH v2 7/7] KVM: nSVM: implement ondemand allocation of the nested state Maxim Levitsky
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=20200820133339.372823-6-mlevitsk@redhat.com \
--to=mlevitsk@redhat.com \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=jmattson@google.com \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=pbonzini@redhat.com \
--cc=sean.j.christopherson@intel.com \
--cc=tglx@linutronix.de \
--cc=vkuznets@redhat.com \
--cc=wanpengli@tencent.com \
--cc=x86@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®