From f7ee04391d30eaf3cd00c4cab439b3d27e61636a Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Sat, 9 Apr 2011 13:41:59 +0300 Subject: [PATCH] kvm tools: Extract kvm_cpu__start() function In preparation for threaded execution, separate kvm_cpu__start() function so it can be reused for multiple threads. Cc: Asias He Cc: Cyrill Gorcunov Cc: Ingo Molnar Signed-off-by: Pekka Enberg --- tools/kvm/include/kvm/kvm-cpu.h | 1 + tools/kvm/kvm-cpu.c | 59 +++++++++++++++++++++++++++++++++ tools/kvm/kvm-run.c | 51 ++-------------------------- 3 files changed, 63 insertions(+), 48 deletions(-) diff --git a/tools/kvm/include/kvm/kvm-cpu.h b/tools/kvm/include/kvm/kvm-cpu.h index d36dadfb01db..b4e2134d70f8 100644 --- a/tools/kvm/include/kvm/kvm-cpu.h +++ b/tools/kvm/include/kvm/kvm-cpu.h @@ -25,6 +25,7 @@ void kvm_cpu__reset_vcpu(struct kvm_cpu *self); void kvm_cpu__setup_cpuid(struct kvm_cpu *self); void kvm_cpu__enable_singlestep(struct kvm_cpu *self); void kvm_cpu__run(struct kvm_cpu *self); +int kvm_cpu__start(struct kvm_cpu *cpu); void kvm_cpu__show_code(struct kvm_cpu *self); void kvm_cpu__show_registers(struct kvm_cpu *self); diff --git a/tools/kvm/kvm-cpu.c b/tools/kvm/kvm-cpu.c index 374adb2c6dde..392fad329725 100644 --- a/tools/kvm/kvm-cpu.c +++ b/tools/kvm/kvm-cpu.c @@ -1,5 +1,7 @@ #include "kvm/kvm-cpu.h" +#include "kvm/virtio-console.h" +#include "kvm/8250-serial.h" #include "kvm/util.h" #include "kvm/kvm.h" @@ -368,3 +370,60 @@ void kvm_cpu__run(struct kvm_cpu *self) if (err && (errno != EINTR && errno != EAGAIN)) die_perror("KVM_RUN failed"); } + +int kvm_cpu__start(struct kvm_cpu *cpu) +{ + for (;;) { + kvm_cpu__run(cpu); + + switch (cpu->kvm_run->exit_reason) { + case KVM_EXIT_DEBUG: + 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, + (uint8_t *)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: { + 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: { + serial8250__inject_interrupt(cpu->kvm); + virtio_console__inject_interrupt(cpu->kvm); + break; + } + case KVM_EXIT_SHUTDOWN: + goto exit_kvm; + default: + goto panic_kvm; + } + } + +exit_kvm: + return 0; + +panic_kvm: + return 1; +} diff --git a/tools/kvm/kvm-run.c b/tools/kvm/kvm-run.c index 93928188a163..9a0400bb082b 100644 --- a/tools/kvm/kvm-run.c +++ b/tools/kvm/kvm-run.c @@ -177,54 +177,9 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) kvm__start_timer(kvm); - for (;;) { - kvm_cpu__run(cpu); - - switch (cpu->kvm_run->exit_reason) { - case KVM_EXIT_DEBUG: - kvm_cpu__show_registers(cpu); - kvm_cpu__show_code(cpu); - break; - case KVM_EXIT_IO: { - bool ret; - - ret = kvm__emulate_io(kvm, - cpu->kvm_run->io.port, - (uint8_t *)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: { - bool ret; - - ret = kvm__emulate_mmio(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: { - serial8250__inject_interrupt(kvm); - virtio_console__inject_interrupt(kvm); - break; - } - case KVM_EXIT_SHUTDOWN: - goto exit_kvm; - default: - goto panic_kvm; - } - } -exit_kvm: + if (kvm_cpu__start(cpu)) + goto panic_kvm; + disk_image__close(kvm->disk_image); kvm__delete(kvm); -- 2.39.5