]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: nVMX: Consolidate missing X86EMUL_INTERCEPTED logic in L2 emulation
authorSean Christopherson <seanjc@google.com>
Sat, 1 Feb 2025 01:55:12 +0000 (17:55 -0800)
committerSean Christopherson <seanjc@google.com>
Mon, 24 Feb 2025 17:01:07 +0000 (09:01 -0800)
Refactor the handling of port I/O interception checks when emulating on
behalf of L2 in anticipation of synthesizing a nested VM-Exit to L1
instead of injecting a #UD into L2.

No functional change intended.

Link: https://lore.kernel.org/r/20250201015518.689704-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/vmx/vmx.c

index c844107e046662ac4de4616ab79d5785f744c15f..bf5a700ef064d739966fd0ca35883d926d5fc428 100644 (file)
@@ -8007,12 +8007,11 @@ static __init void vmx_set_cpu_caps(void)
                kvm_cpu_cap_check_and_set(X86_FEATURE_WAITPKG);
 }
 
-static int vmx_check_intercept_io(struct kvm_vcpu *vcpu,
+static bool vmx_is_io_intercepted(struct kvm_vcpu *vcpu,
                                  struct x86_instruction_info *info)
 {
        struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
        unsigned short port;
-       bool intercept;
        int size;
 
        if (info->intercept == x86_intercept_in ||
@@ -8032,13 +8031,9 @@ static int vmx_check_intercept_io(struct kvm_vcpu *vcpu,
         * Otherwise, IO instruction VM-exits are controlled by the IO bitmaps.
         */
        if (!nested_cpu_has(vmcs12, CPU_BASED_USE_IO_BITMAPS))
-               intercept = nested_cpu_has(vmcs12,
-                                          CPU_BASED_UNCOND_IO_EXITING);
-       else
-               intercept = nested_vmx_check_io_bitmaps(vcpu, port, size);
+               return nested_cpu_has(vmcs12, CPU_BASED_UNCOND_IO_EXITING);
 
-       /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED.  */
-       return intercept ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE;
+       return nested_vmx_check_io_bitmaps(vcpu, port, size);
 }
 
 int vmx_check_intercept(struct kvm_vcpu *vcpu,
@@ -8067,7 +8062,9 @@ int vmx_check_intercept(struct kvm_vcpu *vcpu,
        case x86_intercept_ins:
        case x86_intercept_out:
        case x86_intercept_outs:
-               return vmx_check_intercept_io(vcpu, info);
+               if (!vmx_is_io_intercepted(vcpu, info))
+                       return X86EMUL_CONTINUE;
+               break;
 
        case x86_intercept_lgdt:
        case x86_intercept_lidt:
@@ -8079,8 +8076,6 @@ int vmx_check_intercept(struct kvm_vcpu *vcpu,
        case x86_intercept_str:
                if (!nested_cpu_has2(vmcs12, SECONDARY_EXEC_DESC))
                        return X86EMUL_CONTINUE;
-
-               /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED.  */
                break;
 
        case x86_intercept_hlt:
@@ -8108,6 +8103,7 @@ int vmx_check_intercept(struct kvm_vcpu *vcpu,
                break;
        }
 
+       /* FIXME: produce nested vmexit and return X86EMUL_INTERCEPTED.  */
        return X86EMUL_UNHANDLEABLE;
 }