On Mon, Jun 26, 2023, Weijiang Yang wrote:
On 6/24/2023 6:30 AM, Sean Christopherson wrote:The key point I am looking for is a call out that KVM is emulating architectural
On Thu, May 11, 2023, Yang Weijiang wrote:How about this:
Save GUEST_SSP to SMM state save area when guest exits to SMMThis fails to answer "Why does KVM need to do this?"
due to SMI and restore it VMCS field when guest exits SMM.
Guest SMM mode execution is out of guest kernel, to avoid GUEST_SSP
corruption,
KVM needs to save current normal mode GUEST_SSP to SMRAM area so that it can
restore original GUEST_SSP at the end of SMM.
behavior, i.e. that smram->ssp is defined in the SDM and that the documented
behavior of Intel CPUs is that the CPU's current SSP is saved on SMI and loaded
on RSM. And I specifically say "loaded" and not "restored", because the field
is writable.
Yes, I would like to merge it at some point.Yes, the check missed the case that user space disables SHSTK. Will changeSigned-off-by: Yang Weijiang <weijiang.yang@xxxxxxxxx>This is wrong, KVM should not save/restore state that doesn't exist from the guest's
---
arch/x86/kvm/smm.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/arch/x86/kvm/smm.c b/arch/x86/kvm/smm.c
index b42111a24cc2..c54d3eb2b7e4 100644
--- a/arch/x86/kvm/smm.c
+++ b/arch/x86/kvm/smm.c
@@ -275,6 +275,16 @@ static void enter_smm_save_state_64(struct kvm_vcpu *vcpu,
enter_smm_save_seg_64(vcpu, &smram->gs, VCPU_SREG_GS);
smram->int_shadow = static_call(kvm_x86_get_interrupt_shadow)(vcpu);
+
+ if (kvm_cet_user_supported()) {
perspective, i.e. this needs to check guest_cpuid_has().
it, thanks!
On a related topic, I would love feedback on my series that adds a framework forThe framework looks good, will it be merged in kvm_x86?
features like this, where KVM needs to check guest CPUID as well as host support.
https://lore.kernel.org/all/20230217231022.816138-1-seanjc@xxxxxxxxxx
Sorry, I don't follow. These writes are NOT initiated from the host, i.e.MSR_KVM_GUEST_SSP is only accessible to user space, e.g., during LM, it's not@@ -565,6 +575,16 @@ static int rsm_load_state_64(struct x86_emulate_ctxt *ctxt,No, masquerading as a host access is all kinds of wrong. I have no idea what
static_call(kvm_x86_set_interrupt_shadow)(vcpu, 0);
ctxt->interruptibility = (u8)smstate->int_shadow;
+ if (kvm_cet_user_supported()) {
+ struct msr_data msr;
+
+ msr.index = MSR_KVM_GUEST_SSP;
+ msr.host_initiated = true;
+ msr.data = smstate->ssp;
+ /* Mimic host_initiated access to bypass ssp access check. */
check you're trying to bypass, but whatever it is, it's wrong. Per the SDM, the
SSP field in SMRAM is writable, which means that KVM needs to correctly handle
the scenario where SSP holds garbage, e.g. a non-canonical address.
accessible to VM itself. So in kvm_cet_is_msr_accessible(), I added a check to
tell whether the access is initiated from user space or not, I tried to bypass
that check. Yes, I will add necessary checks here.
Why can't this use kvm_get_msr() and kvm_set_msr()?If my above assumption is correct, these helpers are passed by
host_initiated=false and cannot meet the requirments.
kvm_get_msr() and kvm_set_msr() do the right thing, unless I'm missing something.