lkml.org 
[lkml]   [2020]   [Dec]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 11/34] KVM: SVM: Prepare for SEV-ES exit handling in the sev.c file
    Date
    From: Tom Lendacky <thomas.lendacky@amd.com>

    This is a pre-patch to consolidate some exit handling code into callable
    functions. Follow-on patches for SEV-ES exit handling will then be able
    to use them from the sev.c file.

    Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
    ---
    arch/x86/kvm/svm/svm.c | 64 +++++++++++++++++++++++++-----------------
    1 file changed, 38 insertions(+), 26 deletions(-)

    diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
    index 3b02620ba9a9..ce7bcb9cf90c 100644
    --- a/arch/x86/kvm/svm/svm.c
    +++ b/arch/x86/kvm/svm/svm.c
    @@ -3151,6 +3151,43 @@ static void dump_vmcb(struct kvm_vcpu *vcpu)
    "excp_to:", save->last_excp_to);
    }

    +static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
    +{
    + if (exit_code < ARRAY_SIZE(svm_exit_handlers) &&
    + svm_exit_handlers[exit_code])
    + return 0;
    +
    + vcpu_unimpl(vcpu, "svm: unexpected exit reason 0x%llx\n", exit_code);
    + dump_vmcb(vcpu);
    + vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
    + vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_UNEXPECTED_EXIT_REASON;
    + vcpu->run->internal.ndata = 2;
    + vcpu->run->internal.data[0] = exit_code;
    + vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
    +
    + return -EINVAL;
    +}
    +
    +static int svm_invoke_exit_handler(struct vcpu_svm *svm, u64 exit_code)
    +{
    + if (svm_handle_invalid_exit(&svm->vcpu, exit_code))
    + return 0;
    +
    +#ifdef CONFIG_RETPOLINE
    + if (exit_code == SVM_EXIT_MSR)
    + return msr_interception(svm);
    + else if (exit_code == SVM_EXIT_VINTR)
    + return interrupt_window_interception(svm);
    + else if (exit_code == SVM_EXIT_INTR)
    + return intr_interception(svm);
    + else if (exit_code == SVM_EXIT_HLT)
    + return halt_interception(svm);
    + else if (exit_code == SVM_EXIT_NPF)
    + return npf_interception(svm);
    +#endif
    + return svm_exit_handlers[exit_code](svm);
    +}
    +
    static void svm_get_exit_info(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2,
    u32 *intr_info, u32 *error_code)
    {
    @@ -3217,32 +3254,7 @@ static int handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
    if (exit_fastpath != EXIT_FASTPATH_NONE)
    return 1;

    - if (exit_code >= ARRAY_SIZE(svm_exit_handlers)
    - || !svm_exit_handlers[exit_code]) {
    - vcpu_unimpl(vcpu, "svm: unexpected exit reason 0x%x\n", exit_code);
    - dump_vmcb(vcpu);
    - vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
    - vcpu->run->internal.suberror =
    - KVM_INTERNAL_ERROR_UNEXPECTED_EXIT_REASON;
    - vcpu->run->internal.ndata = 2;
    - vcpu->run->internal.data[0] = exit_code;
    - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
    - return 0;
    - }
    -
    -#ifdef CONFIG_RETPOLINE
    - if (exit_code == SVM_EXIT_MSR)
    - return msr_interception(svm);
    - else if (exit_code == SVM_EXIT_VINTR)
    - return interrupt_window_interception(svm);
    - else if (exit_code == SVM_EXIT_INTR)
    - return intr_interception(svm);
    - else if (exit_code == SVM_EXIT_HLT)
    - return halt_interception(svm);
    - else if (exit_code == SVM_EXIT_NPF)
    - return npf_interception(svm);
    -#endif
    - return svm_exit_handlers[exit_code](svm);
    + return svm_invoke_exit_handler(svm, exit_code);
    }

    static void reload_tss(struct kvm_vcpu *vcpu)
    --
    2.28.0
    \
     
     \ /
      Last update: 2020-12-10 18:51    [W:4.084 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site