[PATCH v4 9/9] KVM: VMX: Consolidate the exit handler for VMX and TDX
From: Xiaoyao Li
Date: Wed Aug 19 2026 - 06:06:08 EST
The exit handlers for VMX and TDX have the similar pattern. Consolidate
them into a single vt_handle_exit() helper.
Signed-off-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx>
Changes in v4:
- new patch.
---
arch/x86/kvm/vmx/main.c | 38 ++++++++++++++++++++++++++++----------
arch/x86/kvm/vmx/tdx.c | 18 +-----------------
arch/x86/kvm/vmx/vmx.c | 21 +--------------------
3 files changed, 30 insertions(+), 47 deletions(-)
diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
index 6a813c49ca8a..10df9667d0c0 100644
--- a/arch/x86/kvm/vmx/main.c
+++ b/arch/x86/kvm/vmx/main.c
@@ -154,15 +154,6 @@ static fastpath_t vt_vcpu_run(struct kvm_vcpu *vcpu, u64 run_flags)
return vmx_vcpu_run(vcpu, run_flags);
}
-static int vt_handle_exit(struct kvm_vcpu *vcpu,
- enum exit_fastpath_completion fastpath)
-{
- if (is_td_vcpu(vcpu))
- return tdx_handle_exit(vcpu, fastpath);
-
- return vmx_handle_exit(vcpu, fastpath);
-}
-
static bool vt_unhandleable_emulation_required(struct kvm_vcpu *vcpu)
{
if (is_td_vcpu(vcpu)) {
@@ -887,6 +878,33 @@ int vt_handle_bus_lock_vmexit(struct kvm_vcpu *vcpu)
return 1;
}
+static int vt_handle_exit(struct kvm_vcpu *vcpu,
+ enum exit_fastpath_completion fastpath)
+{
+ int ret;
+
+#ifdef CONFIG_KVM_INTEL_TDX
+ if (is_td_vcpu(vcpu))
+ ret = tdx_handle_exit(vcpu, fastpath);
+ else
+#endif
+ ret = vmx_handle_exit(vcpu, fastpath);
+
+ /*
+ * Exit to user space when bus lock detected to inform that there is
+ * a bus lock in guest.
+ */
+ if (vmx_get_exit_reason(vcpu).bus_lock_detected) {
+ if (ret > 0) {
+ vcpu->run->exit_reason = KVM_EXIT_X86_BUS_LOCK;
+ ret = 0;
+ }
+
+ vcpu->run->flags |= KVM_RUN_X86_BUS_LOCK;
+ }
+ return ret;
+}
+
#define VMX_REQUIRED_APICV_INHIBITS \
(BIT(APICV_INHIBIT_REASON_DISABLED) | \
BIT(APICV_INHIBIT_REASON_ABSENT) | \
@@ -960,7 +978,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
.vcpu_needs_initialization = vt_op_tdx_only(vcpu_needs_initialization),
.vcpu_run = vt_op(vcpu_run),
- .handle_exit = vt_op(handle_exit),
+ .handle_exit = vt_handle_exit,
.skip_emulated_instruction = vmx_skip_emulated_instruction,
.update_emulated_instruction = vmx_update_emulated_instruction,
.unhandleable_emulation_required = vt_op(unhandleable_emulation_required),
diff --git a/arch/x86/kvm/vmx/tdx.c b/arch/x86/kvm/vmx/tdx.c
index 8db0c67aaadc..364a2322a9f5 100644
--- a/arch/x86/kvm/vmx/tdx.c
+++ b/arch/x86/kvm/vmx/tdx.c
@@ -2058,7 +2058,7 @@ int tdx_complete_emulated_msr(struct kvm_vcpu *vcpu, int err)
}
-static int __tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
+int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
{
struct vcpu_tdx *tdx = to_tdx(vcpu);
u64 vp_enter_ret = tdx->vp_enter_ret;
@@ -2170,22 +2170,6 @@ static int __tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
return 0;
}
-int tdx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t fastpath)
-{
- int ret = __tdx_handle_exit(vcpu, fastpath);
-
- /* Exit to user space when bus lock was detected */
- if (vmx_get_exit_reason(vcpu).bus_lock_detected) {
- if (ret > 0) {
- vcpu->run->exit_reason = KVM_EXIT_X86_BUS_LOCK;
- ret = 0;
- }
-
- vcpu->run->flags |= KVM_RUN_X86_BUS_LOCK;
- }
- return ret;
-}
-
void tdx_get_exit_info(struct kvm_vcpu *vcpu, u32 *reason,
u64 *info1, u64 *info2, u32 *intr_info, u32 *error_code)
{
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 58c001b6cbc5..490baae56cf1 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -6681,7 +6681,7 @@ void dump_vmcs(struct kvm_vcpu *vcpu)
* The guest has exited. See if we can fix it or if we need userspace
* assistance.
*/
-static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
+int vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
{
struct vcpu_vmx *vmx = to_vmx(vcpu);
union vmx_exit_reason exit_reason = vmx_get_exit_reason(vcpu);
@@ -6840,25 +6840,6 @@ static int __vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
return 0;
}
-int vmx_handle_exit(struct kvm_vcpu *vcpu, fastpath_t exit_fastpath)
-{
- int ret = __vmx_handle_exit(vcpu, exit_fastpath);
-
- /*
- * Exit to user space when bus lock detected to inform that there is
- * a bus lock in guest.
- */
- if (vmx_get_exit_reason(vcpu).bus_lock_detected) {
- if (ret > 0) {
- vcpu->run->exit_reason = KVM_EXIT_X86_BUS_LOCK;
- ret = 0;
- }
-
- vcpu->run->flags |= KVM_RUN_X86_BUS_LOCK;
- }
- return ret;
-}
-
void vmx_update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr)
{
int tpr_threshold;
--
2.43.0