From patchwork Thu Jan 21 19:03:49 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Osipenko X-Patchwork-Id: 8084431 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 7F60F9F440 for ; Thu, 21 Jan 2016 19:06:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C54C920390 for ; Thu, 21 Jan 2016 19:06:48 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 198E720384 for ; Thu, 21 Jan 2016 19:06:48 +0000 (UTC) Received: from localhost ([::1]:49363 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMKZD-0002Dr-D1 for patchwork-qemu-devel@patchwork.kernel.org; Thu, 21 Jan 2016 14:06:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54633) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMKXK-0007RU-Ed for qemu-devel@nongnu.org; Thu, 21 Jan 2016 14:04:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aMKXJ-0001DD-2X for qemu-devel@nongnu.org; Thu, 21 Jan 2016 14:04:50 -0500 Received: from mail-lf0-x241.google.com ([2a00:1450:4010:c07::241]:36829) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aMKXI-0001Cz-Ly; Thu, 21 Jan 2016 14:04:48 -0500 Received: by mail-lf0-x241.google.com with SMTP id t141so2797875lfd.3; Thu, 21 Jan 2016 11:04:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=QlvbnldpsRFQInQQATmijjGWQn2NNKSL0l1kxp7aEOo=; b=NZM72OO21OYHVvhB3B+s6RIYGq7vO8cjcKrk2iz0jm+jCvIShfFASG/4VjdZvN48WB aD8TtNDfBLmyhws/V0Zn6grULGdtfpWkqWAMIrrqq3/favMSKlyTnjlo9dt3g7/2ecCF FYWnmeBRTOY9j5BRuop+LmDaIZHoSquONpN8Ij7Wgy7bcYtOwzCGT++TTT+b3AxpqXhd 9/e5Ax92EkEpu7Z+edVqw4tSXG+KwLsC+Z70/XdFld2Y7WrFHVREQF01Pb38ptJlw3NK U0GN6aF+WL7pakP6UW4uGwuHbha+YaRAu9TZgbVB9NgL6/QaRy3uVs/OoDBoPNR2b2zx Wbjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=QlvbnldpsRFQInQQATmijjGWQn2NNKSL0l1kxp7aEOo=; b=K7kbrv05t7fojU6Znvj3+p9pls+oZGX0H5Y62/F37lbfqinUCj77DfAE2aSaro7wcf ixoSz0aFnkAmu74zrdoQ9p5jZzCwAxtzZkv7xgyGD50B8gDg6qWJujXL9hVQx0V2d/yo 3yoMzVK1NXbaJRV8sBoOEiCyN3TdWYcsWZQwLO+I+4L4QnbQ3J7CBUjwR9/OE/XKyGJp ICOWJinVSz2dl+xVc+84bjL72fbz/veeysn2QZrizCZ4F1QnmVtfEdTEpIyzOAiuPwHH sAIc7iR7dYMOirQ4GRGdCrkqCf4Ya6EI8d3/RROV8UtisrR3cQ2bbFHe195VPpKNRAEs BJHg== X-Gm-Message-State: ALoCoQkhD/xKE1BagRO90Zk7nMwDX4JtQLiGwMnEwXkXJ//FJ+EvAfBZgmZNFAcBiUpWMj3PF5U+8tmITV2L92kfP443+3NQrQ== X-Received: by 10.25.42.16 with SMTP id q16mr13353071lfq.58.1453403087981; Thu, 21 Jan 2016 11:04:47 -0800 (PST) Received: from localhost.localdomain (ppp46-138-151-163.pppoe.spdop.ru. [46.138.151.163]) by smtp.gmail.com with ESMTPSA id m21sm382496lfe.29.2016.01.21.11.04.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 21 Jan 2016 11:04:47 -0800 (PST) From: Dmitry Osipenko To: QEMU Developers , qemu-arm@nongnu.org Date: Thu, 21 Jan 2016 22:03:49 +0300 Message-Id: <3ceca99fa19a5251a9ed121a4645c59fdad61150.1453402860.git.digetx@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:4010:c07::241 Cc: Peter Maydell , Peter Crosthwaite Subject: [Qemu-devel] [PATCH v11 6/7] hw/ptimer: Legalize running with delta = load = 0 and abort on period = 0 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently ptimer would print error message and clear enable flag for an arming timer that has delta = load = 0. That actually could be a valid case for some hardware, like instant IRQ trigger for oneshot timer or continuous in periodic mode. Support those cases by removing the error message and stopping the timer when delta = 0. Abort execution when period = 0 instead of printing the error message, otherwise there is a chance to miss that error. In addition, don't re-load oneshot timer when delta = 0 and remove duplicated code from ptimer_tick(), since ptimer_reload would invoke trigger and stop the timer. Signed-off-by: Dmitry Osipenko Reviewed-by: Peter Crosthwaite --- hw/core/ptimer.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c index 142cc64..cec59e1 100644 --- a/hw/core/ptimer.c +++ b/hw/core/ptimer.c @@ -39,11 +39,14 @@ static void ptimer_reload(ptimer_state *s) if (s->delta == 0) { ptimer_trigger(s); + } + + if (s->delta == 0 && s->enabled == 1) { s->delta = s->limit; } - if (s->delta == 0 || s->period == 0) { - fprintf(stderr, "Timer with period zero, disabling\n"); - s->enabled = 0; + + if (s->delta == 0) { + ptimer_stop(s); return; } @@ -72,27 +75,22 @@ static void ptimer_reload(ptimer_state *s) static void ptimer_tick(void *opaque) { ptimer_state *s = (ptimer_state *)opaque; - ptimer_trigger(s); s->delta = 0; - if (s->enabled == 2) { - s->enabled = 0; - } else { - ptimer_reload(s); - } + ptimer_reload(s); } uint64_t ptimer_get_count(ptimer_state *s) { uint64_t counter; - if (s->enabled) { + if (s->enabled && s->delta != 0) { int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); int64_t next = s->next_event; bool expired = (now - next >= 0); bool oneshot = (s->enabled == 2); /* Figure out the current counter value. */ - if (s->period == 0 || (expired && (oneshot || use_icount))) { + if (expired && (oneshot || use_icount)) { /* Prevent timer underflowing if it should already have triggered. */ counter = 0; @@ -164,10 +162,7 @@ void ptimer_run(ptimer_state *s, int oneshot) { bool was_disabled = !s->enabled; - if (was_disabled && s->period == 0) { - fprintf(stderr, "Timer with period zero, disabling\n"); - return; - } + g_assert(s->period != 0); s->enabled = oneshot ? 2 : 1; if (was_disabled) { s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); @@ -190,6 +185,7 @@ void ptimer_stop(ptimer_state *s) /* Set counter increment interval in nanoseconds. */ void ptimer_set_period(ptimer_state *s, int64_t period) { + g_assert(period != 0); s->delta = ptimer_get_count(s); s->period = period; s->period_frac = 0; @@ -202,6 +198,7 @@ void ptimer_set_period(ptimer_state *s, int64_t period) /* Set counter frequency in Hz. */ void ptimer_set_freq(ptimer_state *s, uint32_t freq) { + g_assert(freq != 0); s->delta = ptimer_get_count(s); s->period = 1000000000ll / freq; s->period_frac = (1000000000ll << 32) / freq;