From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=35250 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PzcLb-0002Pm-RH for qemu-devel@nongnu.org; Tue, 15 Mar 2011 18:04:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PzcLV-0004zF-Fl for qemu-devel@nongnu.org; Tue, 15 Mar 2011 18:04:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55622) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PzcLV-0004yb-77 for qemu-devel@nongnu.org; Tue, 15 Mar 2011 18:04:05 -0400 From: Marcelo Tosatti Date: Tue, 15 Mar 2011 18:50:45 -0300 Message-Id: <9abf223c27a3be0b588d5dc38c7a9a6e457477e5.1300225848.git.mtosatti@redhat.com> In-Reply-To: References: Subject: [Qemu-devel] [PATCH 31/35] kvm: Rework inner loop of kvm_cpu_exec List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Jan Kiszka , Marcelo Tosatti , qemu-devel@nongnu.org, kvm@vger.kernel.org From: Jan Kiszka Let kvm_cpu_exec return EXCP_* values consistently and generate those codes already inside its inner loop. This means we will now re-enter the kernel while ret == 0. Update kvm_handle_internal_error accordingly, but keep kvm_arch_handle_exit untouched, it will be converted in a separate step. Signed-off-by: Jan Kiszka Signed-off-by: Marcelo Tosatti --- kvm-all.c | 26 ++++++++++++++------------ 1 files changed, 14 insertions(+), 12 deletions(-) diff --git a/kvm-all.c b/kvm-all.c index 8531555..271e361 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -831,7 +831,7 @@ static int kvm_handle_internal_error(CPUState *env, struct kvm_run *run) fprintf(stderr, "emulation failure\n"); if (!kvm_arch_stop_on_emulation_error(env)) { cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); - return 0; + return EXCP_INTERRUPT; } } /* FIXME: Should trigger a qmp message to let management know @@ -931,14 +931,13 @@ int kvm_cpu_exec(CPUState *env) if (run_ret < 0) { if (run_ret == -EINTR || run_ret == -EAGAIN) { DPRINTF("io window exit\n"); - ret = 0; + ret = EXCP_INTERRUPT; break; } DPRINTF("kvm run failed %s\n", strerror(-run_ret)); abort(); } - ret = 0; /* exit loop */ switch (run->exit_reason) { case KVM_EXIT_IO: DPRINTF("handle_io\n"); @@ -947,7 +946,7 @@ int kvm_cpu_exec(CPUState *env) run->io.direction, run->io.size, run->io.count); - ret = 1; + ret = 0; break; case KVM_EXIT_MMIO: DPRINTF("handle_mmio\n"); @@ -955,14 +954,16 @@ int kvm_cpu_exec(CPUState *env) run->mmio.data, run->mmio.len, run->mmio.is_write); - ret = 1; + ret = 0; break; case KVM_EXIT_IRQ_WINDOW_OPEN: DPRINTF("irq_window_open\n"); + ret = EXCP_INTERRUPT; break; case KVM_EXIT_SHUTDOWN: DPRINTF("shutdown\n"); qemu_system_reset_request(); + ret = EXCP_INTERRUPT; break; case KVM_EXIT_UNKNOWN: fprintf(stderr, "KVM: unknown exit, hardware reason %" PRIx64 "\n", @@ -979,28 +980,29 @@ int kvm_cpu_exec(CPUState *env) DPRINTF("kvm_exit_debug\n"); if (kvm_arch_debug(&run->debug.arch)) { ret = EXCP_DEBUG; - goto out; + break; } /* re-enter, this exception was guest-internal */ - ret = 1; + ret = 0; break; #endif /* KVM_CAP_SET_GUEST_DEBUG */ default: DPRINTF("kvm_arch_handle_exit\n"); ret = kvm_arch_handle_exit(env, run); + if (ret == 0) { + ret = EXCP_INTERRUPT; + } else if (ret > 0) { + ret = 0; + } break; } - } while (ret > 0); + } while (ret == 0); if (ret < 0) { cpu_dump_state(env, stderr, fprintf, CPU_DUMP_CODE); vm_stop(VMSTOP_PANIC); } - ret = EXCP_INTERRUPT; -#ifdef KVM_CAP_SET_GUEST_DEBUG -out: -#endif env->exit_request = 0; cpu_single_env = NULL; return ret; -- 1.7.4