• Sean Christopherson's avatar
    KVM: SVM: Exit to userspace on ENOMEM/EFAULT GHCB errors · aa9f5841
    Sean Christopherson authored
    Exit to userspace if setup_vmgexit_scratch() fails due to OOM or because
    copying data from guest (userspace) memory failed/faulted.  The OOM
    scenario is clearcut, it's userspace's decision as to whether it should
    terminate the guest, free memory, etc...
    
    As for -EFAULT, arguably, any guest issue is a violation of the guest's
    contract with userspace, and thus userspace needs to decide how to
    proceed.  E.g. userspace defines what is RAM vs. MMIO and communicates
    that directly to the guest, KVM is not involved in deciding what is/isn't
    RAM nor in communicating that information to the guest.  If the scratch
    GPA doesn't resolve to a memslot, then the guest is not honoring the
    memory configuration as defined by userspace.
    
    And if userspace unmaps an hva for whatever reason, then exiting to
    userspace with -EFAULT is absolutely the right thing to do.  KVM's ABI
    currently sucks and doesn't provide enough information to act on the
    -EFAULT, but that will hopefully be remedied in the future as there are
    multiple use cases, e.g. uffd and virtiofs truncation, that shouldn't
    require any work in KVM beyond returning -EFAULT with a small amount of
    metadata.
    
    KVM could define its ABI such that failure to access the scratch area is
    reflected into the guest, i.e. establish a contract with userspace, but
    that's undesirable as it limits KVM's options in the future, e.g. in the
    potential uffd case any failure on a uaccess needs to kick out to
    userspace.  KVM does have several cases where it reflects these errors
    into the guest, e.g. kvm_pv_clock_pairing() and Hyper-V emulation, but
    KVM would preferably "fix" those instead of propagating the falsehood
    that any memory failure is the guest's fault.
    
    Lastly, returning a boolean as an "error" for that a helper that isn't
    named accordingly never works out well.
    
    Fixes: ad5b3532 ("KVM: SVM: Do not terminate SEV-ES guests on GHCB validation failure")
    Cc: Alper Gun <alpergun@google.com>
    Cc: Peter Gonda <pgonda@google.com>
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    Message-Id: <20220225205209.3881130-1-seanjc@google.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    aa9f5841
sev.c 74.2 KB