Since the introduction of the IO thread host_alarm_handler() fails to
wakeup vcpu0 when a timer is triggered. This results in failure to take
vcpu0 out of halt in C2 emulation.
Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]>
Index: kvm-userspace.tip/qemu/hw/i8259.c
===================================================================
--- kvm-userspace.tip.orig/qemu/hw/i8259.c
+++ kvm-userspace.tip/qemu/hw/i8259.c
@@ -83,6 +83,8 @@ static inline void pic_set_irq1(PicState
if (level) {
s->irr |= mask;
s->last_irr |= mask;
+ if (kvm_enabled())
+ kvm_unhalt_cpu0();
} else {
s->irr &= ~mask;
s->last_irr &= ~mask;
@@ -93,6 +95,8 @@ static inline void pic_set_irq1(PicState
if ((s->last_irr & mask) == 0)
s->irr |= mask;
s->last_irr |= mask;
+ if (kvm_enabled())
+ kvm_unhalt_cpu0();
} else {
s->last_irr &= ~mask;
}
Index: kvm-userspace.tip/qemu/qemu-kvm.c
===================================================================
--- kvm-userspace.tip.orig/qemu/qemu-kvm.c
+++ kvm-userspace.tip/qemu/qemu-kvm.c
@@ -128,6 +128,12 @@ static void on_vcpu(CPUState *env, void
qemu_cond_wait(&qemu_work_cond);
}
+void kvm_unhalt_cpu0(void)
+{
+ if (vcpu_info[0].thread)
+ vcpu_info[0].env->halted = 0;
+}
+
void kvm_update_interrupt_request(CPUState *env)
{
int signal = 0;
Index: kvm-userspace.tip/qemu/qemu-kvm.h
===================================================================
--- kvm-userspace.tip.orig/qemu/qemu-kvm.h
+++ kvm-userspace.tip/qemu/qemu-kvm.h
@@ -30,6 +30,7 @@ int kvm_qemu_init_env(CPUState *env);
int kvm_qemu_check_extension(int ext);
void kvm_apic_init(CPUState *env);
int kvm_set_irq(int irq, int level);
+void kvm_unhalt_cpu0(void);
int kvm_physical_memory_set_dirty_tracking(int enable);
int kvm_update_dirty_pages_log(void);
--
--
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