arch/x86/include/asm/kvm_host.h | 1 + arch/x86/kvm/svm/svm.c | 7 +------ arch/x86/kvm/vmx/tdx.c | 6 +----- arch/x86/kvm/vmx/vmx.c | 9 +-------- arch/x86/kvm/x86.c | 12 ++++++++++++ 5 files changed, 16 insertions(+), 19 deletions(-)
Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
code that fills the exit reason and CPU when KVM encounters a VM-Exit that
KVM doesn't know how to handle.
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
arch/x86/include/asm/kvm_host.h | 1 +
arch/x86/kvm/svm/svm.c | 7 +------
arch/x86/kvm/vmx/tdx.c | 6 +-----
arch/x86/kvm/vmx/vmx.c | 9 +--------
arch/x86/kvm/x86.c | 12 ++++++++++++
5 files changed, 16 insertions(+), 19 deletions(-)
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 48598d017d6f..4fbe4b7ce1da 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
+void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
void kvm_enable_efer_bits(u64);
bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index f14709a511aa..83e0d4d5f4c5 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
{
- 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;
+ kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
return 0;
}
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
index 326db9b9c567..079d9f13eddb 100644
--- a/arch/x86/kvm/vmx/tdx.c
+++ b/arch/x86/kvm/vmx/tdx.c
@@ -2145,11 +2145,7 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
}
unhandled_exit:
- 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] = vp_enter_ret;
- vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
+ kvm_prepare_unexpected_reason_exit(vcpu, vp_enter_ret);
return 0;
}
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 1021d3b65ea0..08f7957ed4c3 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -6642,15 +6642,8 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
return kvm_vmx_exit_handlers[exit_handler_index](vcpu);
unexpected_vmexit:
- vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
- exit_reason.full);
dump_vmcs(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_reason.full;
- vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
+ kvm_prepare_unexpected_reason_exit(vcpu, exit_reason.full);
return 0;
}
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index b4b5d2d09634..c826cd05228a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -9110,6 +9110,18 @@ void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa)
}
EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_event_vectoring_exit);
+void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason)
+{
+ vcpu_unimpl(vcpu, "unexpected exit reason 0x%llx\n", exit_reason);
+
+ 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_reason;
+ vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
+}
+EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_unexpected_reason_exit);
+
static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type)
{
struct kvm *kvm = vcpu->kvm;
base-commit: 4cc167c50eb19d44ac7e204938724e685e3d8057
--
2.51.1.930.gacf6e81ea2-goog
On Thu, 30 Oct 2025 11:50:03 -0700, Sean Christopherson wrote:
> Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> KVM doesn't know how to handle.
>
>
Applied to kvm-x86 misc, thanks!
[1/1] KVM: x86: Add a helper to dedup reporting of unhandled VM-Exits
https://github.com/kvm-x86/linux/commit/65a70164aba7
--
https://github.com/kvm-x86/linux/tree/next
On 10/31/2025 2:50 AM, Sean Christopherson wrote: > Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the > code that fills the exit reason and CPU when KVM encounters a VM-Exit that > KVM doesn't know how to handle. > > Signed-off-by: Sean Christopherson <seanjc@google.com> Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com>
On 10/31/2025 2:50 AM, Sean Christopherson wrote:
> Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> KVM doesn't know how to handle.
>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com>
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/svm/svm.c | 7 +------
> arch/x86/kvm/vmx/tdx.c | 6 +-----
> arch/x86/kvm/vmx/vmx.c | 9 +--------
> arch/x86/kvm/x86.c | 12 ++++++++++++
> 5 files changed, 16 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 48598d017d6f..4fbe4b7ce1da 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
> void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
>
> void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
>
> void kvm_enable_efer_bits(u64);
> bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index f14709a511aa..83e0d4d5f4c5 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
>
> static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
> {
> - 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;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 326db9b9c567..079d9f13eddb 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -2145,11 +2145,7 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
> }
>
> unhandled_exit:
> - 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] = vp_enter_ret;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, vp_enter_ret);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 1021d3b65ea0..08f7957ed4c3 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6642,15 +6642,8 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
> return kvm_vmx_exit_handlers[exit_handler_index](vcpu);
>
> unexpected_vmexit:
> - vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
> - exit_reason.full);
> dump_vmcs(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_reason.full;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_reason.full);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b4b5d2d09634..c826cd05228a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -9110,6 +9110,18 @@ void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa)
> }
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_event_vectoring_exit);
>
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason)
> +{
> + vcpu_unimpl(vcpu, "unexpected exit reason 0x%llx\n", exit_reason);
> +
> + 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_reason;
> + vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> +}
> +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_unexpected_reason_exit);
> +
> static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type)
> {
> struct kvm *kvm = vcpu->kvm;
>
> base-commit: 4cc167c50eb19d44ac7e204938724e685e3d8057
On Thu, Oct 30, 2025 at 11:50:03AM -0700, Sean Christopherson wrote:
> Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> KVM doesn't know how to handle.
>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/svm/svm.c | 7 +------
> arch/x86/kvm/vmx/tdx.c | 6 +-----
> arch/x86/kvm/vmx/vmx.c | 9 +--------
> arch/x86/kvm/x86.c | 12 ++++++++++++
> 5 files changed, 16 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 48598d017d6f..4fbe4b7ce1da 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
> void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
>
> void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
>
> void kvm_enable_efer_bits(u64);
> bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index f14709a511aa..83e0d4d5f4c5 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
>
> static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
> {
> - 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;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
> return 0;
> }
We can probably drop svm_handle_invalid_exit() entirely now, but looks
good either way:
Reviewed-by: Yosry Ahmed <yosry.ahmed@linux.dev>
>
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 326db9b9c567..079d9f13eddb 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -2145,11 +2145,7 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
> }
>
> unhandled_exit:
> - 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] = vp_enter_ret;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, vp_enter_ret);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 1021d3b65ea0..08f7957ed4c3 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6642,15 +6642,8 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
> return kvm_vmx_exit_handlers[exit_handler_index](vcpu);
>
> unexpected_vmexit:
> - vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
> - exit_reason.full);
> dump_vmcs(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_reason.full;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_reason.full);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b4b5d2d09634..c826cd05228a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -9110,6 +9110,18 @@ void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa)
> }
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_event_vectoring_exit);
>
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason)
> +{
> + vcpu_unimpl(vcpu, "unexpected exit reason 0x%llx\n", exit_reason);
> +
> + 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_reason;
> + vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> +}
> +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_unexpected_reason_exit);
> +
> static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type)
> {
> struct kvm *kvm = vcpu->kvm;
>
> base-commit: 4cc167c50eb19d44ac7e204938724e685e3d8057
> --
> 2.51.1.930.gacf6e81ea2-goog
>
On Mon, Nov 03, 2025, Yosry Ahmed wrote:
> On Thu, Oct 30, 2025 at 11:50:03AM -0700, Sean Christopherson wrote:
> > Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> > code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> > KVM doesn't know how to handle.
> >
> > Signed-off-by: Sean Christopherson <seanjc@google.com>
> > ---
> > arch/x86/include/asm/kvm_host.h | 1 +
> > arch/x86/kvm/svm/svm.c | 7 +------
> > arch/x86/kvm/vmx/tdx.c | 6 +-----
> > arch/x86/kvm/vmx/vmx.c | 9 +--------
> > arch/x86/kvm/x86.c | 12 ++++++++++++
> > 5 files changed, 16 insertions(+), 19 deletions(-)
> >
> > diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> > index 48598d017d6f..4fbe4b7ce1da 100644
> > --- a/arch/x86/include/asm/kvm_host.h
> > +++ b/arch/x86/include/asm/kvm_host.h
> > @@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
> > void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
> >
> > void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
> > +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
> >
> > void kvm_enable_efer_bits(u64);
> > bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
> > diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> > index f14709a511aa..83e0d4d5f4c5 100644
> > --- a/arch/x86/kvm/svm/svm.c
> > +++ b/arch/x86/kvm/svm/svm.c
> > @@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
> >
> > static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
> > {
> > - 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;
> > + kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
> > return 0;
> > }
>
> We can probably drop svm_handle_invalid_exit() entirely now
Hmm, yeah. I'll do so in a separate follow-up, as I want to do more than just
fold svm_handle_invalid_exit() into svm_invoke_exit_handler().
> Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> KVM doesn't know how to handle.
>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/svm/svm.c | 7 +------
> arch/x86/kvm/vmx/tdx.c | 6 +-----
> arch/x86/kvm/vmx/vmx.c | 9 +--------
> arch/x86/kvm/x86.c | 12 ++++++++++++
> 5 files changed, 16 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 48598d017d6f..4fbe4b7ce1da 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
> void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
>
> void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
>
> void kvm_enable_efer_bits(u64);
> bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index f14709a511aa..83e0d4d5f4c5 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
>
> static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
> {
> - 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;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 326db9b9c567..079d9f13eddb 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -2145,11 +2145,7 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
> }
>
> unhandled_exit:
> - 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] = vp_enter_ret;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, vp_enter_ret);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 1021d3b65ea0..08f7957ed4c3 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6642,15 +6642,8 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
> return kvm_vmx_exit_handlers[exit_handler_index](vcpu);
>
> unexpected_vmexit:
> - vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
> - exit_reason.full);
> dump_vmcs(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_reason.full;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_reason.full);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b4b5d2d09634..c826cd05228a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -9110,6 +9110,18 @@ void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa)
> }
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_event_vectoring_exit);
>
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason)
> +{
> + vcpu_unimpl(vcpu, "unexpected exit reason 0x%llx\n", exit_reason);
> +
> + 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_reason;
> + vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> +}
> +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_unexpected_reason_exit);
> +
> static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type)
> {
> struct kvm *kvm = vcpu->kvm;
>
> base-commit: 4cc167c50eb19d44ac7e204938724e685e3d8057
On Thu, 2025-10-30 at 11:50 -0700, Sean Christopherson wrote: > Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the > code that fills the exit reason and CPU when KVM encounters a VM-Exit that > KVM doesn't know how to handle. > > Signed-off-by: Sean Christopherson <seanjc@google.com> > Acked-by: Kai Huang <kai.huang@intel.com>
On Thu, Oct 30, 2025 at 11:50:03AM +0800, Sean Christopherson wrote:
> Add and use a helper, kvm_prepare_unexpected_reason_exit(), to dedup the
> code that fills the exit reason and CPU when KVM encounters a VM-Exit that
> KVM doesn't know how to handle.
>
> Signed-off-by: Sean Christopherson <seanjc@google.com>
> ---
> arch/x86/include/asm/kvm_host.h | 1 +
> arch/x86/kvm/svm/svm.c | 7 +------
> arch/x86/kvm/vmx/tdx.c | 6 +-----
> arch/x86/kvm/vmx/vmx.c | 9 +--------
> arch/x86/kvm/x86.c | 12 ++++++++++++
> 5 files changed, 16 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
> index 48598d017d6f..4fbe4b7ce1da 100644
> --- a/arch/x86/include/asm/kvm_host.h
> +++ b/arch/x86/include/asm/kvm_host.h
> @@ -2167,6 +2167,7 @@ void __kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu,
> void kvm_prepare_emulation_failure_exit(struct kvm_vcpu *vcpu);
>
> void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa);
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason);
>
> void kvm_enable_efer_bits(u64);
> bool kvm_valid_efer(struct kvm_vcpu *vcpu, u64 efer);
> diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
> index f14709a511aa..83e0d4d5f4c5 100644
> --- a/arch/x86/kvm/svm/svm.c
> +++ b/arch/x86/kvm/svm/svm.c
> @@ -3451,13 +3451,8 @@ static bool svm_check_exit_valid(u64 exit_code)
>
> static int svm_handle_invalid_exit(struct kvm_vcpu *vcpu, u64 exit_code)
> {
> - 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;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_code);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
> index 326db9b9c567..079d9f13eddb 100644
> --- a/arch/x86/kvm/vmx/tdx.c
> +++ b/arch/x86/kvm/vmx/tdx.c
> @@ -2145,11 +2145,7 @@ int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
> }
>
> unhandled_exit:
> - 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] = vp_enter_ret;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, vp_enter_ret);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
> index 1021d3b65ea0..08f7957ed4c3 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -6642,15 +6642,8 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
> return kvm_vmx_exit_handlers[exit_handler_index](vcpu);
>
> unexpected_vmexit:
> - vcpu_unimpl(vcpu, "vmx: unexpected exit reason 0x%x\n",
> - exit_reason.full);
> dump_vmcs(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_reason.full;
> - vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> + kvm_prepare_unexpected_reason_exit(vcpu, exit_reason.full);
> return 0;
> }
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index b4b5d2d09634..c826cd05228a 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -9110,6 +9110,18 @@ void kvm_prepare_event_vectoring_exit(struct kvm_vcpu *vcpu, gpa_t gpa)
> }
> EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_event_vectoring_exit);
>
> +void kvm_prepare_unexpected_reason_exit(struct kvm_vcpu *vcpu, u64 exit_reason)
> +{
> + vcpu_unimpl(vcpu, "unexpected exit reason 0x%llx\n", exit_reason);
I like the dedup, and this brings above for tdx which not
before. Just one small thing: Will it be better if keep the
"vmx"/"svm" hint as before and plus the "tdx" hint yet ?
Reviewed-by: Yao Yuan <yaoyuan@linux.alibaba.com>
> +
> + 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_reason;
> + vcpu->run->internal.data[1] = vcpu->arch.last_vmentry_cpu;
> +}
> +EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_prepare_unexpected_reason_exit);
> +
> static int handle_emulation_failure(struct kvm_vcpu *vcpu, int emulation_type)
> {
> struct kvm *kvm = vcpu->kvm;
>
> base-commit: 4cc167c50eb19d44ac7e204938724e685e3d8057
> --
> 2.51.1.930.gacf6e81ea2-goog
>
On Fri, Oct 31, 2025, Yao Yuan wrote: > On Thu, Oct 30, 2025 at 11:50:03AM +0800, Sean Christopherson wrote: > I like the dedup, and this brings above for tdx which not > before. Just one small thing: Will it be better if keep the > "vmx"/"svm" hint as before and plus the "tdx" hint yet ? It'd be nice to have, but I honestly don't think it's worth going out of our way to capture that information. If someone can't disambiguate "kvm" to mean "vmx/tdx" vs. "svm" based on the host, they've got bigger problems. And as for "vmx" vs. "tdx", I really hope that's not meaningful information for users, e.g. the printks are ratelimited, and users should really be gleaning information from the VMM instance, not from dmesg.
On Fri, Oct 31, 2025 at 10:01:38AM +0800, Sean Christopherson wrote: > On Fri, Oct 31, 2025, Yao Yuan wrote: > > On Thu, Oct 30, 2025 at 11:50:03AM +0800, Sean Christopherson wrote: > > I like the dedup, and this brings above for tdx which not > > before. Just one small thing: Will it be better if keep the > > "vmx"/"svm" hint as before and plus the "tdx" hint yet ? > > It'd be nice to have, but I honestly don't think it's worth going out of our > way to capture that information. If someone can't disambiguate "kvm" to mean > "vmx/tdx" vs. "svm" based on the host, they've got bigger problems. > > And as for "vmx" vs. "tdx", I really hope that's not meaningful information for > users, e.g. the printks are ratelimited, and users should really be gleaning > information from the VMM instance, not from dmesg. thanks for your reply, Good point on printks are ratelimited! Reviewed-by: yaoyuan@linux.alibaba.com
© 2016 - 2026 Red Hat, Inc.