• Michael Roth's avatar
    KVM: SEV-ES: Fix svm_get_msr()/svm_set_msr() for KVM_SEV_ES_INIT guests · cf6d9d2d
    Michael Roth authored
    With commit 27bd5fdc ("KVM: SEV-ES: Prevent MSR access post VMSA
    encryption"), older VMMs like QEMU 9.0 and older will fail when booting
    SEV-ES guests with something like the following error:
    
      qemu-system-x86_64: error: failed to get MSR 0x174
      qemu-system-x86_64: ../qemu.git/target/i386/kvm/kvm.c:3950: kvm_get_msrs: Assertion `ret == cpu->kvm_msr_buf->nmsrs' failed.
    
    This is because older VMMs that might still call
    svm_get_msr()/svm_set_msr() for SEV-ES guests after guest boot even if
    those interfaces were essentially just noops because of the vCPU state
    being encrypted and stored separately in the VMSA. Now those VMMs will
    get an -EINVAL and generally crash.
    
    Newer VMMs that are aware of KVM_SEV_INIT2 however are already aware of
    the stricter limitations of what vCPU state can be sync'd during
    guest run-time, so newer QEMU for instance will work both for legacy
    KVM_SEV_ES_INIT interface as well as KVM_SEV_INIT2.
    
    So when using KVM_SEV_INIT2 it's okay to assume userspace can deal with
    -EINVAL, whereas for legacy KVM_SEV_ES_INIT the kernel might be dealing
    with either an older VMM and so it needs to assume that returning
    -EINVAL might break the VMM.
    
    Address this by only returning -EINVAL if the guest was started with
    KVM_SEV_INIT2. Otherwise, just silently return.
    
    Cc: Ravi Bangoria <ravi.bangoria@amd.com>
    Cc: Nikunj A Dadhania <nikunj@amd.com>
    Reported-by: default avatarSrikanth Aithal <sraithal@amd.com>
    Closes: https://lore.kernel.org/lkml/37usuu4yu4ok7be2hqexhmcyopluuiqj3k266z4gajc2rcj4yo@eujb23qc3zcm/
    Fixes: 27bd5fdc ("KVM: SEV-ES: Prevent MSR access post VMSA encryption")
    Signed-off-by: default avatarMichael Roth <michael.roth@amd.com>
    Message-ID: <20240604233510.764949-1-michael.roth@amd.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    cf6d9d2d
svm.c 149 KB