]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Consolidate SEV-ES MMIO emulation into a single public API
authorSean Christopherson <seanjc@google.com>
Wed, 25 Feb 2026 01:20:44 +0000 (17:20 -0800)
committerSean Christopherson <seanjc@google.com>
Tue, 3 Mar 2026 00:02:53 +0000 (16:02 -0800)
Dedup kvm_sev_es_mmio_{read,write}() into a single API, as the "cost" of
plumbing in a boolean is largely negligible since KVM pulls out a boolean
for ops->write anyways, and consolidating the APIs will allow for
additional cleanups.

No functional change intended.

Tested-by: Tom Lendacky <thomas.lendacky@gmail.com>
Tested-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
Link: https://patch.msgid.link/20260225012049.920665-10-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/sev.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h

index 3f9c1aa39a0af5d9f1366d2a81ffd186f7db2b99..f3478fb9461dddf598250064004efd0f61d7ac33 100644 (file)
@@ -4434,25 +4434,17 @@ int sev_handle_vmgexit(struct kvm_vcpu *vcpu)
 
        switch (control->exit_code) {
        case SVM_VMGEXIT_MMIO_READ:
-               ret = setup_vmgexit_scratch(svm, true, control->exit_info_2);
-               if (ret)
-                       break;
+       case SVM_VMGEXIT_MMIO_WRITE: {
+               bool is_write = control->exit_code == SVM_VMGEXIT_MMIO_WRITE;
 
-               ret = kvm_sev_es_mmio_read(vcpu,
-                                          control->exit_info_1,
-                                          control->exit_info_2,
-                                          svm->sev_es.ghcb_sa);
-               break;
-       case SVM_VMGEXIT_MMIO_WRITE:
-               ret = setup_vmgexit_scratch(svm, false, control->exit_info_2);
+               ret = setup_vmgexit_scratch(svm, !is_write, control->exit_info_2);
                if (ret)
                        break;
 
-               ret = kvm_sev_es_mmio_write(vcpu,
-                                           control->exit_info_1,
-                                           control->exit_info_2,
-                                           svm->sev_es.ghcb_sa);
+               ret = kvm_sev_es_mmio(vcpu, is_write, control->exit_info_1,
+                                     control->exit_info_2, svm->sev_es.ghcb_sa);
                break;
+       }
        case SVM_VMGEXIT_NMI_COMPLETE:
                ++vcpu->stat.nmi_window_exits;
                svm->nmi_masked = false;
index 81e68391407251524d20f37bfd820d614b486d31..6ecc3cf972ae21163680ffa12daad88c2c004173 100644 (file)
@@ -14292,9 +14292,8 @@ static int complete_sev_es_emulated_mmio(struct kvm_vcpu *vcpu)
        return 0;
 }
 
-static int kvm_sev_es_do_mmio(struct kvm_vcpu *vcpu, gpa_t gpa,
-                             unsigned int bytes, void *data,
-                             const struct read_write_emulator_ops *ops)
+int kvm_sev_es_mmio(struct kvm_vcpu *vcpu, bool is_write, gpa_t gpa,
+                   unsigned int bytes, void *data)
 {
        struct kvm_mmio_fragment *frag;
        int handled;
@@ -14302,7 +14301,10 @@ static int kvm_sev_es_do_mmio(struct kvm_vcpu *vcpu, gpa_t gpa,
        if (!data || WARN_ON_ONCE(object_is_on_stack(data)))
                return -EINVAL;
 
-       handled = ops->read_write_mmio(vcpu, gpa, bytes, data);
+       if (is_write)
+               handled = vcpu_mmio_write(vcpu, gpa, bytes, data);
+       else
+               handled = vcpu_mmio_read(vcpu, gpa, bytes, data);
        if (handled == bytes)
                return 1;
 
@@ -14325,8 +14327,8 @@ static int kvm_sev_es_do_mmio(struct kvm_vcpu *vcpu, gpa_t gpa,
 
        vcpu->run->mmio.phys_addr = gpa;
        vcpu->run->mmio.len = min(8u, frag->len);
-       vcpu->run->mmio.is_write = ops->write;
-       if (ops->write)
+       vcpu->run->mmio.is_write = is_write;
+       if (is_write)
                memcpy(vcpu->run->mmio.data, frag->data, min(8u, frag->len));
        vcpu->run->exit_reason = KVM_EXIT_MMIO;
 
@@ -14334,20 +14336,7 @@ static int kvm_sev_es_do_mmio(struct kvm_vcpu *vcpu, gpa_t gpa,
 
        return 0;
 }
-
-int kvm_sev_es_mmio_write(struct kvm_vcpu *vcpu, gpa_t gpa, unsigned int bytes,
-                         void *data)
-{
-       return kvm_sev_es_do_mmio(vcpu, gpa, bytes, data, &write_emultor);
-}
-EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_sev_es_mmio_write);
-
-int kvm_sev_es_mmio_read(struct kvm_vcpu *vcpu, gpa_t gpa, unsigned int bytes,
-                        void *data)
-{
-       return kvm_sev_es_do_mmio(vcpu, gpa, bytes, data, &read_emultor);
-}
-EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_sev_es_mmio_read);
+EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_sev_es_mmio);
 
 static void advance_sev_es_emulated_pio(struct kvm_vcpu *vcpu, unsigned count, int size)
 {
index 94d4f07aaaa09e9ac6c401ca18ee9cf504f69d07..1d0f0edd31b3cfc88177f46cb07df5cfcb720430 100644 (file)
@@ -712,10 +712,8 @@ static inline bool __kvm_is_valid_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
        __reserved_bits;                                \
 })
 
-int kvm_sev_es_mmio_write(struct kvm_vcpu *vcpu, gpa_t src, unsigned int bytes,
-                         void *dst);
-int kvm_sev_es_mmio_read(struct kvm_vcpu *vcpu, gpa_t src, unsigned int bytes,
-                        void *dst);
+int kvm_sev_es_mmio(struct kvm_vcpu *vcpu, bool is_write, gpa_t gpa,
+                   unsigned int bytes, void *data);
 int kvm_sev_es_string_io(struct kvm_vcpu *vcpu, unsigned int size,
                         unsigned int port, void *data,  unsigned int count,
                         int in);