kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions
@ 2011-04-18  9:26 Jan Kiszka
  2011-04-18  9:26 ` [PATCH 1/4] qemu-kvm: Map run_on_cpu on qemu-kvm variant Jan Kiszka
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Jan Kiszka @ 2011-04-18  9:26 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Recent merge with upstream left some corners of qemu-kvm broken behind.
This series addresses those I've spotted based on my merge experiments
in the past months.



Jan Kiszka (4):
  qemu-kvm: Map run_on_cpu on qemu-kvm variant
  qemu-kvm: Synchronize states before reset
  qemu-kvm: Process async MCE events in main loop
  qemu-kvm: Unbreak guest debugging

 kvm.h                |    4 ----
 qemu-kvm-x86.c       |   41 ++++++++++++++++++++++++++++++++++++++++-
 qemu-kvm.c           |   47 ++++++++++++++---------------------------------
 target-i386/helper.c |    3 +++
 target-i386/kvm.c    |    2 +-
 5 files changed, 58 insertions(+), 39 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] qemu-kvm: Map run_on_cpu on qemu-kvm variant
  2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
@ 2011-04-18  9:26 ` Jan Kiszka
  2011-04-18  9:26 ` [PATCH 2/4] qemu-kvm: Synchronize states before reset Jan Kiszka
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Jan Kiszka @ 2011-04-18  9:26 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 target-i386/helper.c |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/target-i386/helper.c b/target-i386/helper.c
index c859846..3fdbe68 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -33,6 +33,9 @@
 #endif
 
 #include "qemu-kvm.h"
+#ifndef OBSOLETE_KVM_IMPL
+#define run_on_cpu on_vcpu
+#endif /* !OBSOLETE_KVM_IMPL */
 
 //#define DEBUG_MMU
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/4] qemu-kvm: Synchronize states before reset
  2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
  2011-04-18  9:26 ` [PATCH 1/4] qemu-kvm: Map run_on_cpu on qemu-kvm variant Jan Kiszka
@ 2011-04-18  9:26 ` Jan Kiszka
  2011-04-18  9:26 ` [PATCH 3/4] qemu-kvm: Process async MCE events in main loop Jan Kiszka
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Jan Kiszka @ 2011-04-18  9:26 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

This aligns qemu-kvm with upstream commit a7ada1510c.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 qemu-kvm.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/qemu-kvm.c b/qemu-kvm.c
index 39974be..8781cde 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -18,6 +18,7 @@
 #include "compatfd.h"
 #include "gdbstub.h"
 #include "monitor.h"
+#include "cpus.h"
 
 #include "qemu-kvm.h"
 #include "libkvm.h"
@@ -1396,6 +1397,7 @@ static void qemu_kvm_system_reset(void)
 {
     pause_all_threads();
 
+    cpu_synchronize_all_states();
     qemu_system_reset();
 
     resume_all_threads();
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 3/4] qemu-kvm: Process async MCE events in main loop
  2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
  2011-04-18  9:26 ` [PATCH 1/4] qemu-kvm: Map run_on_cpu on qemu-kvm variant Jan Kiszka
  2011-04-18  9:26 ` [PATCH 2/4] qemu-kvm: Synchronize states before reset Jan Kiszka
@ 2011-04-18  9:26 ` Jan Kiszka
  2011-04-18  9:26 ` [PATCH 4/4] qemu-kvm: Unbreak guest debugging Jan Kiszka
  2011-04-20 10:02 ` [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Avi Kivity
  4 siblings, 0 replies; 6+ messages in thread
From: Jan Kiszka @ 2011-04-18  9:26 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

This aligns qemu-kvm with upstream commit ab443475c9. Namely, we were
missing a call to an equivalent of kvm_arch_process_async_events from
the main loop. This adds a stripped down version of upstream's
process_async_events until we switch over.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kvm.h          |    2 --
 qemu-kvm-x86.c |   27 +++++++++++++++++++++++++++
 qemu-kvm.c     |    9 ++++++---
 3 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/kvm.h b/kvm.h
index 90c4e48..bda6ad7 100644
--- a/kvm.h
+++ b/kvm.h
@@ -110,9 +110,7 @@ void kvm_arch_post_run(CPUState *env, struct kvm_run *run);
 
 int kvm_arch_handle_exit(CPUState *env, struct kvm_run *run);
 
-#ifdef OBSOLETE_KVM_IMPL
 int kvm_arch_process_async_events(CPUState *env);
-#endif
 
 int kvm_arch_get_registers(CPUState *env);
 
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 20093fc..96d2fa6 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -811,3 +811,30 @@ void kvm_arch_process_irqchip_events(CPUState *env)
         do_cpu_sipi(env);
     }
 }
+
+int kvm_arch_process_async_events(CPUState *env)
+{
+    if (env->interrupt_request & CPU_INTERRUPT_MCE) {
+        /* We must not raise CPU_INTERRUPT_MCE if it's not supported. */
+        assert(env->mcg_cap);
+
+        env->interrupt_request &= ~CPU_INTERRUPT_MCE;
+
+        kvm_cpu_synchronize_state(env);
+
+        if (env->exception_injected == EXCP08_DBLE) {
+            /* this means triple fault */
+            qemu_system_reset_request();
+            env->exit_request = 1;
+            return 0;
+        }
+        env->exception_injected = EXCP12_MCHK;
+        env->has_error_code = 0;
+
+        env->halted = 0;
+        if (kvm_irqchip_in_kernel() && env->mp_state == KVM_MP_STATE_HALTED) {
+            env->mp_state = KVM_MP_STATE_RUNNABLE;
+        }
+    }
+    return 0;
+}
diff --git a/qemu-kvm.c b/qemu-kvm.c
index 8781cde..d7d50f5 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -1414,9 +1414,12 @@ static int kvm_main_loop_cpu(CPUState *env)
 {
     while (1) {
         int run_cpu = !kvm_cpu_is_stopped(env);
-        if (run_cpu && !kvm_irqchip_in_kernel()) {
-            process_irqchip_events(env);
-            run_cpu = !env->halted;
+        if (run_cpu) {
+            kvm_arch_process_async_events(env);
+            if (!kvm_irqchip_in_kernel()) {
+                process_irqchip_events(env);
+                run_cpu = !env->halted;
+            }
         }
         if (run_cpu) {
             kvm_cpu_exec(env);
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 4/4] qemu-kvm: Unbreak guest debugging
  2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
                   ` (2 preceding siblings ...)
  2011-04-18  9:26 ` [PATCH 3/4] qemu-kvm: Process async MCE events in main loop Jan Kiszka
@ 2011-04-18  9:26 ` Jan Kiszka
  2011-04-20 10:02 ` [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Avi Kivity
  4 siblings, 0 replies; 6+ messages in thread
From: Jan Kiszka @ 2011-04-18  9:26 UTC (permalink / raw)
  To: Avi Kivity, Marcelo Tosatti; +Cc: kvm

Align handling of guest debug exits to upstream by moving it completely
to the arch section. This patch accounts for changed return codes in the
exit handling code.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
---
 kvm.h             |    2 --
 qemu-kvm-x86.c    |   14 +++++++++++++-
 qemu-kvm.c        |   36 ++++++------------------------------
 target-i386/kvm.c |    2 +-
 4 files changed, 20 insertions(+), 34 deletions(-)

diff --git a/kvm.h b/kvm.h
index bda6ad7..b890b5d 100644
--- a/kvm.h
+++ b/kvm.h
@@ -147,8 +147,6 @@ QTAILQ_HEAD(kvm_sw_breakpoint_head, kvm_sw_breakpoint);
 struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env,
                                                  target_ulong pc);
 
-int kvm_handle_debug(struct kvm_debug_exit_arch *arch_info);
-
 int kvm_sw_breakpoints_active(CPUState *env);
 
 int kvm_arch_insert_sw_breakpoint(CPUState *current_env,
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 96d2fa6..d37f217 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -183,6 +183,8 @@ int kvm_enable_vapic(CPUState *env, uint64_t vapic)
 
 #endif
 
+extern CPUState *kvm_debug_cpu_requested;
+
 int kvm_arch_run(CPUState *env)
 {
     int r = 0;
@@ -198,8 +200,18 @@ int kvm_arch_run(CPUState *env)
         r = kvm_handle_tpr_access(env);
         break;
 #endif
+#ifdef KVM_CAP_SET_GUEST_DEBUG
+    case KVM_EXIT_DEBUG:
+        DPRINTF("kvm_exit_debug\n");
+        r = kvm_handle_debug(&run->debug.arch);
+        if (r == EXCP_DEBUG) {
+            kvm_debug_cpu_requested = env;
+            env->stopped = 1;
+        }
+        break;
+#endif /* KVM_CAP_SET_GUEST_DEBUG */
     default:
-        r = 1;
+        r = -1;
         break;
     }
 
diff --git a/qemu-kvm.c b/qemu-kvm.c
index d7d50f5..7689225 100644
--- a/qemu-kvm.c
+++ b/qemu-kvm.c
@@ -74,7 +74,7 @@ static int qemu_system_ready;
 pthread_t io_thread;
 static int io_thread_sigfd = -1;
 
-static CPUState *kvm_debug_cpu_requested;
+CPUState *kvm_debug_cpu_requested;
 
 #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
 /* The list of ioperm_data */
@@ -86,20 +86,6 @@ static QLIST_HEAD(, ioperm_data) ioperm_head;
 int kvm_abi = EXPECTED_KVM_API_VERSION;
 int kvm_page_size;
 
-#ifdef KVM_CAP_SET_GUEST_DEBUG
-static int kvm_debug(CPUState *env,
-                     struct kvm_debug_exit_arch *arch_info)
-{
-    int handle = kvm_handle_debug(arch_info);
-
-    if (handle) {
-        kvm_debug_cpu_requested = env;
-        env->stopped = 1;
-    }
-    return handle;
-}
-#endif
-
 static int handle_unhandled(uint64_t reason)
 {
     fprintf(stderr, "kvm: unhandled exit %" PRIx64 "\n", reason);
@@ -453,17 +439,6 @@ int kvm_set_irqchip(kvm_context_t kvm, struct kvm_irqchip *chip)
 
 #endif
 
-static int handle_debug(CPUState *env)
-{
-#ifdef KVM_CAP_SET_GUEST_DEBUG
-    struct kvm_run *run = env->kvm_run;
-
-    return kvm_debug(env, &run->debug.arch);
-#else
-    return 0;
-#endif
-}
-
 int kvm_get_regs(CPUState *env, struct kvm_regs *regs)
 {
     return kvm_vcpu_ioctl(env, KVM_GET_REGS, regs);
@@ -623,9 +598,6 @@ int kvm_run(CPUState *env)
                                 run->io.count);
             r = 0;
             break;
-        case KVM_EXIT_DEBUG:
-            r = handle_debug(env);
-            break;
         case KVM_EXIT_MMIO:
             r = handle_mmio(env);
             break;
@@ -649,11 +621,15 @@ int kvm_run(CPUState *env)
             r = kvm_handle_internal_error(env, run);
 	    break;
         default:
-            if (kvm_arch_run(env)) {
+            r = kvm_arch_run(env);
+            if (r < 0) {
                 fprintf(stderr, "unhandled vm exit: 0x%x\n", run->exit_reason);
                 kvm_show_regs(env);
                 abort();
             }
+            if (r > 0) {
+                return r;
+            }
             break;
         }
     }
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index be6a356..a3587ed 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -1768,7 +1768,7 @@ void kvm_arch_remove_all_hw_breakpoints(void)
 
 static CPUWatchpoint hw_watchpoint;
 
-int kvm_handle_debug(struct kvm_debug_exit_arch *arch_info)
+static int kvm_handle_debug(struct kvm_debug_exit_arch *arch_info)
 {
     int ret = 0;
     int n;
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions
  2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
                   ` (3 preceding siblings ...)
  2011-04-18  9:26 ` [PATCH 4/4] qemu-kvm: Unbreak guest debugging Jan Kiszka
@ 2011-04-20 10:02 ` Avi Kivity
  4 siblings, 0 replies; 6+ messages in thread
From: Avi Kivity @ 2011-04-20 10:02 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Marcelo Tosatti, kvm

On 04/18/2011 12:26 PM, Jan Kiszka wrote:
> Recent merge with upstream left some corners of qemu-kvm broken behind.
> This series addresses those I've spotted based on my merge experiments
> in the past months.

Applied all, thanks.

-- 
error compiling committee.c: too many arguments to function


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-04-20 10:02 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-18  9:26 [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Jan Kiszka
2011-04-18  9:26 ` [PATCH 1/4] qemu-kvm: Map run_on_cpu on qemu-kvm variant Jan Kiszka
2011-04-18  9:26 ` [PATCH 2/4] qemu-kvm: Synchronize states before reset Jan Kiszka
2011-04-18  9:26 ` [PATCH 3/4] qemu-kvm: Process async MCE events in main loop Jan Kiszka
2011-04-18  9:26 ` [PATCH 4/4] qemu-kvm: Unbreak guest debugging Jan Kiszka
2011-04-20 10:02 ` [PATCH 0/4] qemu-kvm: Sort out upstream merge regressions Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).