From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44941) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WTVez-0000my-Ub for qemu-devel@nongnu.org; Fri, 28 Mar 2014 08:13:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WTVes-0004c4-5y for qemu-devel@nongnu.org; Fri, 28 Mar 2014 08:13:21 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64404) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WTVer-0004bg-Tw for qemu-devel@nongnu.org; Fri, 28 Mar 2014 08:13:14 -0400 Date: Fri, 28 Mar 2014 14:13:30 +0200 From: "Michael S. Tsirkin" Message-ID: <1396008068-20481-3-git-send-email-mst@redhat.com> References: <1396008068-20481-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396008068-20481-1-git-send-email-mst@redhat.com> Subject: [Qemu-devel] [PULL for-2.0 2/3] Don't enable a HPET timer if HPET is disabled List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Paolo Bonzini , Anthony Liguori , Matt Lupfer From: Matt Lupfer A HPET timer can be started when HPET is not yet enabled. This will not generate an interrupt to the guest, but causes problems when HPET is later enabled. A timer that is created and expires at least once before HPET is enabled will have an initialized comparator based on a hpet_offset of 0 (uninitialized). When HPET is enabled, hpet_set_timer() is called a second time, which modifies the timer expiry to a time based on the difference between current ticks (measured with the newly initialized hpet_offset) and the timer's comparator (which was generated before hpet_offset was initialized). This results in a long period of no HPET timer ticks. When this occurs with a CentOS 5.x guest, the guest may not receive timer interrupts during its narrow timer check window and panic on boot. Signed-off-by: Matt Lupfer Acked-by: Michael S. Tsirkin Reviewed-by: Paolo Bonzini --- hw/timer/hpet.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c index 1264dfd..e15d6bc 100644 --- a/hw/timer/hpet.c +++ b/hw/timer/hpet.c @@ -506,7 +506,8 @@ static void hpet_ram_write(void *opaque, hwaddr addr, timer->cmp = (uint32_t)timer->cmp; timer->period = (uint32_t)timer->period; } - if (activating_bit(old_val, new_val, HPET_TN_ENABLE)) { + if (activating_bit(old_val, new_val, HPET_TN_ENABLE) && + hpet_enabled(s)) { hpet_set_timer(timer); } else if (deactivating_bit(old_val, new_val, HPET_TN_ENABLE)) { hpet_del_timer(timer); -- MST