* [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).