Different architectures will deal with MMIO exits differently.  For example,
KVM_EXIT_IO is x86-specific, and I/O cycles are often synthesisted by steering
into windows in PCI bridges on other architectures.

This patch moves the IO/MMIO exit code from the main runloop into x86/kvm-cpu.c

Signed-off-by: Matt Evans <[email protected]>
---
 tools/kvm/include/kvm/kvm-cpu.h |    1 +
 tools/kvm/kvm-cpu.c             |   37 +++++--------------------------------
 tools/kvm/x86/kvm-cpu.c         |   37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/tools/kvm/include/kvm/kvm-cpu.h b/tools/kvm/include/kvm/kvm-cpu.h
index 15618f1..6f38c0c 100644
--- a/tools/kvm/include/kvm/kvm-cpu.h
+++ b/tools/kvm/include/kvm/kvm-cpu.h
@@ -13,6 +13,7 @@ void kvm_cpu__run(struct kvm_cpu *vcpu);
 void kvm_cpu__reboot(void);
 int kvm_cpu__start(struct kvm_cpu *cpu);
 bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu);
+bool kvm_cpu__emulate_io(struct kvm_cpu *cpu, struct kvm_run *kvm_run);
 
 int kvm_cpu__get_debug_fd(void);
 void kvm_cpu__set_debug_fd(int fd);
diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c
index 884a89f..c9fbc81 100644
--- a/tools/kvm/kvm-cpu.c
+++ b/tools/kvm/kvm-cpu.c
@@ -103,49 +103,22 @@ int kvm_cpu__start(struct kvm_cpu *cpu)
                        kvm_cpu__show_registers(cpu);
                        kvm_cpu__show_code(cpu);
                        break;
-               case KVM_EXIT_IO: {
-                       bool ret;
-
-                       ret = kvm__emulate_io(cpu->kvm,
-                                       cpu->kvm_run->io.port,
-                                       (u8 *)cpu->kvm_run +
-                                       cpu->kvm_run->io.data_offset,
-                                       cpu->kvm_run->io.direction,
-                                       cpu->kvm_run->io.size,
-                                       cpu->kvm_run->io.count);
-
-                       if (!ret)
+               case KVM_EXIT_IO:
+               case KVM_EXIT_MMIO:
+                       if (!kvm_cpu__emulate_io(cpu, cpu->kvm_run))
                                goto panic_kvm;
                        break;
-               }
-               case KVM_EXIT_MMIO: {
-                       bool ret;
-
-                       ret = kvm__emulate_mmio(cpu->kvm,
-                                       cpu->kvm_run->mmio.phys_addr,
-                                       cpu->kvm_run->mmio.data,
-                                       cpu->kvm_run->mmio.len,
-                                       cpu->kvm_run->mmio.is_write);
-
-                       if (!ret)
-                               goto panic_kvm;
-                       break;
-               }
                case KVM_EXIT_INTR:
                        if (cpu->is_running)
                                break;
                        goto exit_kvm;
                case KVM_EXIT_SHUTDOWN:
                        goto exit_kvm;
-               default: {
-                       bool ret;
-
-                       ret = kvm_cpu__handle_exit(cpu);
-                       if (!ret)
+               default:
+                       if (!kvm_cpu__handle_exit(cpu))
                                goto panic_kvm;
                        break;
                }
-               }
                kvm_cpu__handle_coalesced_mmio(cpu);
        }
 
diff --git a/tools/kvm/x86/kvm-cpu.c b/tools/kvm/x86/kvm-cpu.c
index a0d10cc..665d742 100644
--- a/tools/kvm/x86/kvm-cpu.c
+++ b/tools/kvm/x86/kvm-cpu.c
@@ -217,6 +217,43 @@ bool kvm_cpu__handle_exit(struct kvm_cpu *vcpu)
        return false;
 }
 
+bool kvm_cpu__emulate_io(struct kvm_cpu *cpu, struct kvm_run *kvm_run)
+{
+       bool ret;
+       switch (kvm_run->exit_reason) {
+       case KVM_EXIT_IO: {
+               ret = kvm__emulate_io(cpu->kvm,
+                                     cpu->kvm_run->io.port,
+                                     (u8 *)cpu->kvm_run +
+                                     cpu->kvm_run->io.data_offset,
+                                     cpu->kvm_run->io.direction,
+                                     cpu->kvm_run->io.size,
+                                     cpu->kvm_run->io.count);
+
+               if (!ret)
+                       goto panic_kvm;
+               break;
+       }
+       case KVM_EXIT_MMIO: {
+               ret = kvm__emulate_mmio(cpu->kvm,
+                                       cpu->kvm_run->mmio.phys_addr,
+                                       cpu->kvm_run->mmio.data,
+                                       cpu->kvm_run->mmio.len,
+                                       cpu->kvm_run->mmio.is_write);
+
+               if (!ret)
+                       goto panic_kvm;
+               break;
+       }
+       default:
+               pr_warning("Unknown exit reason %d in %s\n", 
kvm_run->exit_reason, __FUNCTION__);
+               return false;
+       }
+       return true;
+panic_kvm:
+       return false;
+}
+
 static void print_dtable(const char *name, struct kvm_dtable *dtable)
 {
        dprintf(debug_fd, " %s                 %016llx  %08hx\n",
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to