All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.