KVM: SVM: Prepare for SEV-ES exit handling in the sev.c file
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> Message-Id: <5b8b0ffca8137f3e1e257f83df9f5c881c8a96a3.1607620209.git.thomas.lendacky@amd.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
8164a5ffe4
Коммит
e9093fd492
|
@ -3097,6 +3097,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)
|
||||
{
|
||||
|
@ -3163,32 +3200,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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче