In preparation for threaded execution, separate kvm_cpu__start() function so it
can be reused for multiple threads.

Cc: Asias He <[email protected]>
Cc: Cyrill Gorcunov <[email protected]>
Cc: Ingo Molnar <[email protected]>
Signed-off-by: Pekka Enberg <[email protected]>
---
 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 d36dadf..b4e2134 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 374adb2..392fad3 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 9392818..9a0400b 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);
 
-- 
1.7.0.4

--
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