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 <matt@xxxxxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html