From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcelo Tosatti Subject: [patch 5/7] qemu: kvm: unhalt vcpu0 on pit irq Date: Wed, 18 Jun 2008 13:42:10 -0300 Message-ID: <20080618164854.661285250@localhost.localdomain> References: <20080618164205.108219607@localhost.localdomain> Cc: kvm@vger.kernel.org, Marcelo Tosatti To: Avi Kivity Return-path: Received: from mx1.redhat.com ([66.187.233.31]:60244 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754200AbYFRQwg (ORCPT ); Wed, 18 Jun 2008 12:52:36 -0400 Content-Disposition: inline; filename=pic-unhalt-cpu0 Sender: kvm-owner@vger.kernel.org List-ID: 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 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); --