From patchwork Mon Nov 11 13:58:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 179084 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp6688686ilf; Mon, 11 Nov 2019 06:00:07 -0800 (PST) X-Google-Smtp-Source: APXvYqyQkKyOM3pn8HZB64WXRJKqqFmQ4A0h+pMWzrdaIdPFu+pbFCd9osiXEtPLCMY9rULo4dlD X-Received: by 2002:a17:906:3b07:: with SMTP id g7mr5946207ejf.114.1573480807778; Mon, 11 Nov 2019 06:00:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573480807; cv=none; d=google.com; s=arc-20160816; b=0WabJ4jUzbn6TRJxSzXRrFOsMWciMKFZbDjftOtLXfhJUYuRcXHopJ2vjinnL0GuQw TzyfjTmAh8KziaxtAcibrxhJ/ef5GeHX3SocnmQ69mkUcL9xYksA8IkgPHwbVvzTSlFS 3EBVSOsqFsXIlq1amZN4nMnOnvkCvRCEoBwe0PcTR5AGvKQqQdPdVMDg93/HGL6lqF8U ipEI9lcSIyuDstMh4bWQJP6UWEydHpNKycMkHOz5+hDyr2dRcTXwiBGZnaCPmS+0Noo0 AH+b7ZvD59PhG1XJZV1LBArii+WOBr+0zfqTxCA/chtDtg3JN8T4Hnk9g7h+f+X/6xat my6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=jXiECD5vexW+GXBCZCMbsqDmlGQb1rFrS+VaoexST1k=; b=A/5NVwdvO5q69qDCQ0YOliqH7H/N2RkubCL7alp265JlDD1W2Bu4sy4UJJ54QvoEst ZRA5gc7+QC4/afJDdcxwjOi5x9brh11cJdSWaxKNtagvMrgnSTytyHH3QQUUcfuy7TNv IVyyFDraJ85DyKx1OiqRlYYxf0wuIJo1wflMFaAphLsy9WmjnAj+j3mJu6k3plUqM/1H 7nzyRb+JNhmZDXLMCVPemxz++ZpmFB0nE9oeROcJKnw3sxSVTLjer5VR6uXwMNqSr1zR I9IHr7oV5H7nhHvrPaB2uWEsZEUOLnvSEvpTXK0jC0hKZiyz4gXw3gWagkiWuXvPceVg 7GpA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Q8E+XXuC; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id ks2si9623502ejb.396.2019.11.11.06.00.07 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Nov 2019 06:00:07 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Q8E+XXuC; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:53214 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUAEg-0002JN-2Q for patch@linaro.org; Mon, 11 Nov 2019 09:00:06 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:49532) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUACo-000846-KV for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iUACm-0006Lt-A9 for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:10 -0500 Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]:37706) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iUACm-0006LY-38 for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:08 -0500 Received: by mail-wr1-x429.google.com with SMTP id t1so14760177wrv.4 for ; Mon, 11 Nov 2019 05:58:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=jXiECD5vexW+GXBCZCMbsqDmlGQb1rFrS+VaoexST1k=; b=Q8E+XXuCerjFaqFA+kurlwE++6y0DUCg3gJvWrF5Q3Iay8JhBbUfCwud7dNk3MmPMe 0FwncSTHrp1wHKahqA2zhhMS+Np6QaLrjPE7khckLII34CNQQwgOtDwhEtwTuCgbwNTg bsDV/0+ES4cxLLgkl1RWPNXR7sVdvRpO98ewzlj2zYUweu7Z7U9/N0jJDccbLBTJUKJ/ CbKZzWdNvSu9DSBQvvu3uDpGiCvzPd93pMyrqrCrTbIjR0BqynIeG4FWBx9eaBZrYuMB yFt2oVOFeeZ+/5cAOtUiUc54G7VoN3WKTCVx2xynbh3XyfGBSltpi++EgbJO6bDSKWZd f7zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=jXiECD5vexW+GXBCZCMbsqDmlGQb1rFrS+VaoexST1k=; b=B4bYdho5kV3qH5h3SfydzQX6sHB1rgZkfMv23YzoxkkCr7Qc1nJVjipMMDnDvpBNBK CW5PnxDLqyB/LkrJCVfat6uzjTzQKLEcKiUDHftmDbsVgu38HqltR6uu/mPmVeFdD0yA pxewOg1JDQXMbjj0JzQ6T8IuKV7wA7zYQD9FH+jTGEYYmgxh5e2TbTnftx1pZ7YZOTfd HAkpwzgZfOgqhfQ20j1V3h3wehKdEhO5HQwXH83HLX/+ZHQgto+DuV9+xl+skM1A4Vc9 WAF64bY1nAdYW565cM6vkTTmB7wXWC3/TCXXGgfsM6BGbMibwbR0osBd9CZVV4in4aqx Cunw== X-Gm-Message-State: APjAAAVW0OKqrrZPs94vHUeK0e3qXik0nDGKzAvxHLKtnVignlkX2yw/ gsme4pPK6rFHG2x1Ls69+s6VyKta1KnC8g== X-Received: by 2002:adf:e386:: with SMTP id e6mr19916068wrm.397.1573480686584; Mon, 11 Nov 2019 05:58:06 -0800 (PST) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id t29sm20544857wrb.53.2019.11.11.05.58.05 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2019 05:58:06 -0800 (PST) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 1/3] ptimer: Remove old ptimer_init_with_bh() API Date: Mon, 11 Nov 2019 13:58:01 +0000 Message-Id: <20191111135803.14414-2-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191111135803.14414-1-peter.maydell@linaro.org> References: <20191111135803.14414-1-peter.maydell@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::429 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Now all the users of ptimers have converted to the transaction-based API, we can remove ptimer_init_with_bh() and all the code paths that are used only by bottom-half based ptimers, and tidy up the documentation comments to consider the transaction-based API the only possibility. The code changes result from: * s->bh no longer exists * s->callback is now always non-NULL Signed-off-by: Peter Maydell Reviewed-by: Richard Henderson Message-id: 20191025142411.17085-1-peter.maydell@linaro.org --- include/hw/ptimer.h | 45 +++++++++++----------- hw/core/ptimer.c | 91 ++++++++------------------------------------- 2 files changed, 36 insertions(+), 100 deletions(-) -- 2.20.1 diff --git a/include/hw/ptimer.h b/include/hw/ptimer.h index 4c321f65dcb..412763fffb2 100644 --- a/include/hw/ptimer.h +++ b/include/hw/ptimer.h @@ -10,15 +10,24 @@ #include "qemu/timer.h" -/* The ptimer API implements a simple periodic countdown timer. +/* + * The ptimer API implements a simple periodic countdown timer. * The countdown timer has a value (which can be read and written via * ptimer_get_count() and ptimer_set_count()). When it is enabled * using ptimer_run(), the value will count downwards at the frequency * which has been configured using ptimer_set_period() or ptimer_set_freq(). - * When it reaches zero it will trigger a QEMU bottom half handler, and + * When it reaches zero it will trigger a callback function, and * can be set to either reload itself from a specified limit value * and keep counting down, or to stop (as a one-shot timer). * + * A transaction-based API is used for modifying ptimer state: all calls + * to functions which modify ptimer state must be between matched calls to + * ptimer_transaction_begin() and ptimer_transaction_commit(). + * When ptimer_transaction_commit() is called it will evaluate the state + * of the timer after all the changes in the transaction, and call the + * callback if necessary. (See the ptimer_init() documentation for the full + * list of state-modifying functions and detailed semantics of the callback.) + * * Forgetting to set the period/frequency (or setting it to zero) is a * bug in the QEMU device and will cause warning messages to be printed * to stderr when the guest attempts to enable the timer. @@ -72,7 +81,7 @@ * ptimer_set_count() or ptimer_set_limit() will not trigger the timer * (though it will cause a reload). Only a counter decrement to "0" * will cause a trigger. Not compatible with NO_IMMEDIATE_TRIGGER; - * ptimer_init_with_bh() will assert() that you don't set both. + * ptimer_init() will assert() that you don't set both. */ #define PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT (1 << 5) @@ -80,17 +89,6 @@ typedef struct ptimer_state ptimer_state; typedef void (*ptimer_cb)(void *opaque); -/** - * ptimer_init_with_bh - Allocate and return a new ptimer - * @bh: QEMU bottom half which is run on timer expiry - * @policy: PTIMER_POLICY_* bits specifying behaviour - * - * The ptimer returned must be freed using ptimer_free(). - * The ptimer takes ownership of @bh and will delete it - * when the ptimer is eventually freed. - */ -ptimer_state *ptimer_init_with_bh(QEMUBH *bh, uint8_t policy_mask); - /** * ptimer_init - Allocate and return a new ptimer * @callback: function to call on ptimer expiry @@ -127,8 +125,7 @@ ptimer_state *ptimer_init(ptimer_cb callback, * ptimer_free - Free a ptimer * @s: timer to free * - * Free a ptimer created using ptimer_init_with_bh() (including - * deleting the bottom half which it is using). + * Free a ptimer created using ptimer_init(). */ void ptimer_free(ptimer_state *s); @@ -164,7 +161,7 @@ void ptimer_transaction_commit(ptimer_state *s); * may be more appropriate. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_set_period(ptimer_state *s, int64_t period); @@ -180,7 +177,7 @@ void ptimer_set_period(ptimer_state *s, int64_t period); * precise to fractions of a nanosecond, avoiding rounding errors. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_set_freq(ptimer_state *s, uint32_t freq); @@ -210,7 +207,7 @@ uint64_t ptimer_get_limit(ptimer_state *s); * reload the counter when their reload register is written to. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_set_limit(ptimer_state *s, uint64_t limit, int reload); @@ -234,7 +231,7 @@ uint64_t ptimer_get_count(ptimer_state *s); * point in the future. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_set_count(ptimer_state *s, uint64_t count); @@ -243,15 +240,15 @@ void ptimer_set_count(ptimer_state *s, uint64_t count); * @s: ptimer * @oneshot: non-zero if this timer should only count down once * - * Start a ptimer counting down; when it reaches zero the bottom half - * passed to ptimer_init_with_bh() will be invoked. + * Start a ptimer counting down; when it reaches zero the callback function + * passed to ptimer_init() will be invoked. * If the @oneshot argument is zero, * the counter value will then be reloaded from the limit and it will * start counting down again. If @oneshot is non-zero, then the counter * will disable itself when it reaches zero. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_run(ptimer_state *s, int oneshot); @@ -266,7 +263,7 @@ void ptimer_run(ptimer_state *s, int oneshot); * restarted. * * This function will assert if it is called outside a - * ptimer_transaction_begin/commit block, unless this is a bottom-half ptimer. + * ptimer_transaction_begin/commit block. */ void ptimer_stop(ptimer_state *s); diff --git a/hw/core/ptimer.c b/hw/core/ptimer.c index 7239b8227cc..b5a54e25369 100644 --- a/hw/core/ptimer.c +++ b/hw/core/ptimer.c @@ -29,7 +29,6 @@ struct ptimer_state int64_t last_event; int64_t next_event; uint8_t policy_mask; - QEMUBH *bh; QEMUTimer *timer; ptimer_cb callback; void *callback_opaque; @@ -46,12 +45,7 @@ struct ptimer_state /* Use a bottom-half routine to avoid reentrancy issues. */ static void ptimer_trigger(ptimer_state *s) { - if (s->bh) { - replay_bh_schedule_event(s->bh); - } - if (s->callback) { - s->callback(s->callback_opaque); - } + s->callback(s->callback_opaque); } static void ptimer_reload(ptimer_state *s, int delta_adjust) @@ -296,15 +290,10 @@ uint64_t ptimer_get_count(ptimer_state *s) void ptimer_set_count(ptimer_state *s, uint64_t count) { - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); s->delta = count; if (s->enabled) { - if (!s->callback) { - s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - ptimer_reload(s, 0); - } else { - s->need_reload = true; - } + s->need_reload = true; } } @@ -312,7 +301,7 @@ void ptimer_run(ptimer_state *s, int oneshot) { bool was_disabled = !s->enabled; - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); if (was_disabled && s->period == 0) { if (!qtest_enabled()) { @@ -322,12 +311,7 @@ void ptimer_run(ptimer_state *s, int oneshot) } s->enabled = oneshot ? 2 : 1; if (was_disabled) { - if (!s->callback) { - s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - ptimer_reload(s, 0); - } else { - s->need_reload = true; - } + s->need_reload = true; } } @@ -335,7 +319,7 @@ void ptimer_run(ptimer_state *s, int oneshot) is immediately restarted. */ void ptimer_stop(ptimer_state *s) { - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); if (!s->enabled) return; @@ -343,42 +327,30 @@ void ptimer_stop(ptimer_state *s) s->delta = ptimer_get_count(s); timer_del(s->timer); s->enabled = 0; - if (s->callback) { - s->need_reload = false; - } + s->need_reload = false; } /* Set counter increment interval in nanoseconds. */ void ptimer_set_period(ptimer_state *s, int64_t period) { - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); s->delta = ptimer_get_count(s); s->period = period; s->period_frac = 0; if (s->enabled) { - if (!s->callback) { - s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - ptimer_reload(s, 0); - } else { - s->need_reload = true; - } + s->need_reload = true; } } /* Set counter frequency in Hz. */ void ptimer_set_freq(ptimer_state *s, uint32_t freq) { - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); s->delta = ptimer_get_count(s); s->period = 1000000000ll / freq; s->period_frac = (1000000000ll << 32) / freq; if (s->enabled) { - if (!s->callback) { - s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - ptimer_reload(s, 0); - } else { - s->need_reload = true; - } + s->need_reload = true; } } @@ -386,17 +358,12 @@ void ptimer_set_freq(ptimer_state *s, uint32_t freq) count = limit. */ void ptimer_set_limit(ptimer_state *s, uint64_t limit, int reload) { - assert(s->in_transaction || !s->callback); + assert(s->in_transaction); s->limit = limit; if (reload) s->delta = limit; if (s->enabled && reload) { - if (!s->callback) { - s->next_event = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); - ptimer_reload(s, 0); - } else { - s->need_reload = true; - } + s->need_reload = true; } } @@ -407,7 +374,7 @@ uint64_t ptimer_get_limit(ptimer_state *s) void ptimer_transaction_begin(ptimer_state *s) { - assert(!s->in_transaction || !s->callback); + assert(!s->in_transaction); s->in_transaction = true; s->need_reload = false; } @@ -448,37 +415,12 @@ const VMStateDescription vmstate_ptimer = { } }; -ptimer_state *ptimer_init_with_bh(QEMUBH *bh, uint8_t policy_mask) -{ - ptimer_state *s; - - s = (ptimer_state *)g_malloc0(sizeof(ptimer_state)); - s->bh = bh; - s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, ptimer_tick, s); - s->policy_mask = policy_mask; - - /* - * These two policies are incompatible -- trigger-on-decrement implies - * a timer trigger when the count becomes 0, but no-immediate-trigger - * implies a trigger when the count stops being 0. - */ - assert(!((policy_mask & PTIMER_POLICY_TRIGGER_ONLY_ON_DECREMENT) && - (policy_mask & PTIMER_POLICY_NO_IMMEDIATE_TRIGGER))); - return s; -} - ptimer_state *ptimer_init(ptimer_cb callback, void *callback_opaque, uint8_t policy_mask) { ptimer_state *s; - /* - * The callback function is mandatory; so we use it to distinguish - * old-style QEMUBH ptimers from new transaction API ptimers. - * (ptimer_init_with_bh() allows a NULL bh pointer and at least - * one device (digic-timer) passes NULL, so it's not the case - * that either s->bh != NULL or s->callback != NULL.) - */ + /* The callback function is mandatory. */ assert(callback); s = g_new0(ptimer_state, 1); @@ -499,9 +441,6 @@ ptimer_state *ptimer_init(ptimer_cb callback, void *callback_opaque, void ptimer_free(ptimer_state *s) { - if (s->bh) { - qemu_bh_delete(s->bh); - } timer_free(s->timer); g_free(s); } From patchwork Mon Nov 11 13:58:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 179085 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp6689571ilf; Mon, 11 Nov 2019 06:00:46 -0800 (PST) X-Google-Smtp-Source: APXvYqworcmBKvo2EiklHO2727cr+m48g/brXKf55oBj66JQMay0N+YbICvgM7HlnshbXW8T3fnl X-Received: by 2002:a17:906:25c5:: with SMTP id n5mr22306325ejb.126.1573480846221; Mon, 11 Nov 2019 06:00:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573480846; cv=none; d=google.com; s=arc-20160816; b=gREwzHuoQyZvjW7wG4LrfJTuO4ABYD3j0GdC4SnUwDc5TVritj90+n1xneEvlUNB2H jvt93orU3m3nEWy3Rim3rZZcbub/oXvkH/kdxlfZc/Hh3I9nifz+CDqQnRfZhDllOQU1 pdEd7n+dXPQlIAHTfjmut8WD+QCF27au1QMk3Y2zmhxT8WZltBruzcO9+YQTgnVw+uRL cft1shjRcncOYZUi7bVNeV/EndRFER7BsJ9NY/W/SugVZOFw5imrRDz106PwuGgKn7jt hfyCfmz37Yw7VPQbKx3PBw4bf90q8Nldth8ps3fh3G97UVOeaF3dz6wbzCHOwvcnxnDs F9jQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=5DB4X5iLJ3/d2bMWVzrjXamq+8t2V0zWZe29T7uLP0g=; b=ckVFhnlmpnx58wuisuCEwAO/ERVwUPQ9bLZlt+EBf7rjy6jyKqnNjBR8K07gHd6+fN AvtGud4oabY3dLQxbGQsY5L89DiRp6fh0XYEAkFEMpaJo+aJ90VIDMmQRgv49qqENAPy N5IactoiNbtd7RMLOONvplOidbms8FoyyWItA3jnqnhL6mWUD9xC0MJr9b4wYeKYSzHp inVcH23vBVVAnVgPNJwJI/pvSWojs6Te5sJxDZBbd8h++B+7U+MTb/JKFI21us4+sMEg v5poKPHhFwzEZKmU/Ngoqy+ElrFSAupMcVyfg1+OJumVuVQ33SR8XbWcpkYT3E/Y74CI fOLQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=zsizGan9; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id gg4si9657964ejb.236.2019.11.11.06.00.45 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Nov 2019 06:00:46 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=zsizGan9; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:53200 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUAFJ-0002En-21 for patch@linaro.org; Mon, 11 Nov 2019 09:00:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:49536) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUACo-000847-Rx for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:12 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iUACn-0006MZ-EI for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:10 -0500 Received: from mail-wr1-x431.google.com ([2a00:1450:4864:20::431]:36800) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iUACn-0006MA-83 for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:09 -0500 Received: by mail-wr1-x431.google.com with SMTP id r10so14766227wrx.3 for ; Mon, 11 Nov 2019 05:58:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=5DB4X5iLJ3/d2bMWVzrjXamq+8t2V0zWZe29T7uLP0g=; b=zsizGan93VrdOUhqwbTx2GvHZt2QzNQayEhTg0mOQRFNKsk9rUI9qn8uW/ODAFabrL UIaBkbOb2RdHNyaTJwlEDueFoJYNGHorNXD9sFdd50QrKsu/Q1JWKA7t/K13nhVTJPf7 giXr6Zf8m/+l0V7zwjbsQU9IUfrkrEAUYn2fPYouLMfdL3CtTjvXgqb/BNLgW91ExaKj FrRn7opK7Hr9I22aNSXl4MYv27h7lKJKa24DcaJSR2iLNsUZ6e1ygVUof7pMqNwXGoGb TNY4OPT2pFogottzQVW89MCK1HbWDzycB55iitMljSSWWZmAiZ1wsPc+Lpi836HArd4W VsCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=5DB4X5iLJ3/d2bMWVzrjXamq+8t2V0zWZe29T7uLP0g=; b=hv+agWs8Lx3ECimV93vLYm/OA3FDO0makVsIgXOOs6hss59DIbm0jjpp0/Uhsa2GDj jW5vdunNzFa11gzAWHxjkwXMau0a9uVtKesYfB50PiBkazfbDlkCNQapWqtgKVnXVq+0 x+Y6YMwDYhZUWW5B2KxyhY+WKmw4dbDRIYGzZrSe/T1ymgjc/HJa3vIPGFlbMWz5PPOv yB0zAkP3MjsfkCCjmwcLIAYp7+95tznTtfs+mPE8A56/Uuhhl4ddTeLPpipsayOJrwvx 2rL8Ww8kqjIbvQ1S4RmhUTcoG8cGo1JecrvAIuLpq/ICTPws4EJepiqiqxd7//umcVqA AWrw== X-Gm-Message-State: APjAAAUod5zxPSexFVY6Ifzp7njZ3bGMXvm3LaZnhG2cN0F6whTF9wPj 8R4uX6UHdUZTzuHRe0bQM7AqMfcc9y9eJw== X-Received: by 2002:a5d:48c8:: with SMTP id p8mr1001385wrs.318.1573480688051; Mon, 11 Nov 2019 05:58:08 -0800 (PST) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id t29sm20544857wrb.53.2019.11.11.05.58.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2019 05:58:06 -0800 (PST) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 2/3] Remove unassigned_access CPU hook Date: Mon, 11 Nov 2019 13:58:02 +0000 Message-Id: <20191111135803.14414-3-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191111135803.14414-1-peter.maydell@linaro.org> References: <20191111135803.14414-1-peter.maydell@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::431 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" All targets have now migrated away from the old unassigned_access hook to the new do_transaction_failed hook. This means we can remove the core-code infrastructure for that hook and the code that calls it. Signed-off-by: Peter Maydell Reviewed-by: Philippe Mathieu-Daudé Reviewed-by: Alistair Francis Message-id: 20191108173732.11816-1-peter.maydell@linaro.org --- include/hw/core/cpu.h | 24 ------------------------ accel/tcg/cputlb.c | 2 -- memory.c | 7 ------- 3 files changed, 33 deletions(-) -- 2.20.1 diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h index e1c383ba846..77c6f052990 100644 --- a/include/hw/core/cpu.h +++ b/include/hw/core/cpu.h @@ -72,10 +72,6 @@ typedef enum MMUAccessType { typedef struct CPUWatchpoint CPUWatchpoint; -typedef void (*CPUUnassignedAccess)(CPUState *cpu, hwaddr addr, - bool is_write, bool is_exec, int opaque, - unsigned size); - struct TranslationBlock; /** @@ -87,8 +83,6 @@ struct TranslationBlock; * @reset_dump_flags: #CPUDumpFlags to use for reset logging. * @has_work: Callback for checking if there is work to do. * @do_interrupt: Callback for interrupt handling. - * @do_unassigned_access: Callback for unassigned access handling. - * (this is deprecated: new targets should use do_transaction_failed instead) * @do_unaligned_access: Callback for unaligned access handling, if * the target defines #TARGET_ALIGNED_ONLY. * @do_transaction_failed: Callback for handling failed memory transactions @@ -175,7 +169,6 @@ typedef struct CPUClass { int reset_dump_flags; bool (*has_work)(CPUState *cpu); void (*do_interrupt)(CPUState *cpu); - CPUUnassignedAccess do_unassigned_access; void (*do_unaligned_access)(CPUState *cpu, vaddr addr, MMUAccessType access_type, int mmu_idx, uintptr_t retaddr); @@ -415,12 +408,6 @@ struct CPUState { * we store some rarely used information in the CPU context. */ uintptr_t mem_io_pc; - /* - * This is only needed for the legacy cpu_unassigned_access() hook; - * when all targets using it have been converted to use - * cpu_transaction_failed() instead it can be removed. - */ - MMUAccessType mem_io_access_type; int kvm_fd; struct KVMState *kvm_state; @@ -896,17 +883,6 @@ void cpu_interrupt(CPUState *cpu, int mask); #ifdef NEED_CPU_H #ifdef CONFIG_SOFTMMU -static inline void cpu_unassigned_access(CPUState *cpu, hwaddr addr, - bool is_write, bool is_exec, - int opaque, unsigned size) -{ - CPUClass *cc = CPU_GET_CLASS(cpu); - - if (cc->do_unassigned_access) { - cc->do_unassigned_access(cpu, addr, is_write, is_exec, opaque, size); - } -} - static inline void cpu_unaligned_access(CPUState *cpu, vaddr addr, MMUAccessType access_type, int mmu_idx, uintptr_t retaddr) diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c index 68487dceb54..98221948d63 100644 --- a/accel/tcg/cputlb.c +++ b/accel/tcg/cputlb.c @@ -931,8 +931,6 @@ static uint64_t io_readx(CPUArchState *env, CPUIOTLBEntry *iotlbentry, cpu_io_recompile(cpu, retaddr); } - cpu->mem_io_access_type = access_type; - if (mr->global_locking && !qemu_mutex_iothread_locked()) { qemu_mutex_lock_iothread(); locked = true; diff --git a/memory.c b/memory.c index c952eabb5d2..06484c2bff2 100644 --- a/memory.c +++ b/memory.c @@ -1257,10 +1257,6 @@ static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, #ifdef DEBUG_UNASSIGNED printf("Unassigned mem read " TARGET_FMT_plx "\n", addr); #endif - if (current_cpu != NULL) { - bool is_exec = current_cpu->mem_io_access_type == MMU_INST_FETCH; - cpu_unassigned_access(current_cpu, addr, false, is_exec, 0, size); - } return 0; } @@ -1270,9 +1266,6 @@ static void unassigned_mem_write(void *opaque, hwaddr addr, #ifdef DEBUG_UNASSIGNED printf("Unassigned mem write " TARGET_FMT_plx " = 0x%"PRIx64"\n", addr, val); #endif - if (current_cpu != NULL) { - cpu_unassigned_access(current_cpu, addr, true, false, 0, size); - } } static bool unassigned_mem_accepts(void *opaque, hwaddr addr, From patchwork Mon Nov 11 13:58:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Maydell X-Patchwork-Id: 179083 Delivered-To: patch@linaro.org Received: by 2002:a92:38d5:0:0:0:0:0 with SMTP id g82csp6687115ilf; Mon, 11 Nov 2019 05:58:32 -0800 (PST) X-Google-Smtp-Source: APXvYqzim9wLLfpWfUEnulY20uQPZUq5Lhd/dEHHjXYpRV3TJug2sLeIlEqzTNymscb1CKF5pUM/ X-Received: by 2002:ac8:395a:: with SMTP id t26mr26355856qtb.22.1573480712727; Mon, 11 Nov 2019 05:58:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573480712; cv=none; d=google.com; s=arc-20160816; b=qNyhoqmzuWsG6Q+QyZz1S1ulr3Q6+C71Hp+MCtwdsbKxLUfgEg5d4xAo/MbdyQ2+rl mgnyMtWYKVpCWuUYNEVoI8QvSlGquv+c1ndZoZwOtc1r8UnROxgfU+Ija0yaxh4yZgFp QbHQNZ5+Dx5vK8qlo+TcNuO7hZVyheRhVuW9+STBmNKcA2JpoehDQbz3dcotbNeAyON+ 0JxMyn18ct1evCGkMgbm90z2z4CrUuSYEpeAclWpFazwYf4NvU+Igv6JVm/VXjNtguZF IbR0qORFgXTfB3+Hs4zfi3toIYfIzvURlLsP4iOwg5NbqMY1aTGO3fjSiC8reew+gXt/ wk8g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:to:from :dkim-signature; bh=zqttdI7AYiMTfwfogd55wTlfq+dMx85ZrMiofI4wvOY=; b=aDCX7g4i5uIWwcygGrZi0R288gAEJGEt+4Iwn9bZINzTJ7w4/0Ox0MwbHPgYlTg/2t CeVcjWw1hRFg6S/zYFD9EEhFvqRW9LljuCUmDViTFHgfO4MA9QIwR5uGKpOxLCblLP1u 54oWJxz7Mpsj3pOESGZsNTDuOf9llUICiysWixLRxEgT72G8LLxg0LOCVhItwB4yDjnx Xt3y+VK8LiLN1AWPQxTVfpooUmM1yvRIQM4jxJgPyI/K4Z6dmp5wnn8Q/+5boX8uFdJt r2lSBY1Zs1kz9tvZXNva17ovi1Gl+XGeEmhV9tGtXPQC1jwgC1gthi3f6iX/9jfF2II0 Phhg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="V5/q5MqD"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [209.51.188.17]) by mx.google.com with ESMTPS id z3si2063510qvg.104.2019.11.11.05.58.32 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 11 Nov 2019 05:58:32 -0800 (PST) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b="V5/q5MqD"; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom="qemu-devel-bounces+patch=linaro.org@nongnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:53172 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUADA-00087O-3H for patch@linaro.org; Mon, 11 Nov 2019 08:58:32 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:49551) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iUACp-00084w-Ri for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iUACo-0006N7-JU for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:11 -0500 Received: from mail-wm1-x335.google.com ([2a00:1450:4864:20::335]:54801) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iUACo-0006Mj-CP for qemu-devel@nongnu.org; Mon, 11 Nov 2019 08:58:10 -0500 Received: by mail-wm1-x335.google.com with SMTP id z26so13411646wmi.4 for ; Mon, 11 Nov 2019 05:58:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=zqttdI7AYiMTfwfogd55wTlfq+dMx85ZrMiofI4wvOY=; b=V5/q5MqDtIhQ56BGbul2DWkfEKmAnpB77XmmcGVCoi6qWus2BSKFZSDqDc4NPequLU 5+UgSRInOolONuJCZhgTHWwFl8gVI1E9YFi8tkcv+kLFv0kGj5aU/UqzrH7ZtO7fzg5e hjU3x9tSM936ftznbvXPVvGUXqwjhuALZpoMfnk7NECohGIRDZDYQHivCLzANvDSWmCi FZBFaALAM2PBjjrdZjq5/leg4sRxBDuLHFnJysGI39El/awHVurPo8lqc2MPaf7gGu7s DTGfd9QKXHvVBImqz0aDw/sXH8coiqgeT6bCwV34OwOOFC7bQuqjXLGrzSIi8B/gtMXj u9SQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zqttdI7AYiMTfwfogd55wTlfq+dMx85ZrMiofI4wvOY=; b=S4rYAbLqNRfvArypIDDXx6X/WqkOtjR4e25h2TVxlMNJIrZJ/8Z/kLz7cv6yQ/OxJe X6uJ45NoD8WEitadBf+NwQkpUcg7830GJzIwik3LX6AfWDXjqQ27uQhoqXbFWg02KrOc rDK4U1dMrKEdOKL2brSQPb5PluT+RDzdGlwbZfTuPWoJWyhyvaKjc+VixkbhdX2XSJhb m3S9TO7dDEU46m95rFMbEBlaBFoDq5lWE6JCPTvrdWQO4DQnevG+JFS7UbdQPjvh4OoW Lu3/D7szgjmerYJLCyjs3A2r3HdFGJ4oIPE+Gvfra4vZhdxYTRNE15urcjhxzOiccwwX pajQ== X-Gm-Message-State: APjAAAUlbJlmvaoOgp0oNM/b2XEHrtobWpx8cnwZdBDdruHt1AcN+57i zmeavSqGTieNVW4GCgyfkQOhdElbGjxS8w== X-Received: by 2002:a05:600c:c5:: with SMTP id u5mr19772610wmm.35.1573480689034; Mon, 11 Nov 2019 05:58:09 -0800 (PST) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id t29sm20544857wrb.53.2019.11.11.05.58.08 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Nov 2019 05:58:08 -0800 (PST) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 3/3] hw/arm/boot: Set NSACR.{CP11, CP10} in dummy SMC setup routine Date: Mon, 11 Nov 2019 13:58:03 +0000 Message-Id: <20191111135803.14414-4-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191111135803.14414-1-peter.maydell@linaro.org> References: <20191111135803.14414-1-peter.maydell@linaro.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::335 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" From: Clement Deschamps The boot.c code usually puts the CPU into NS mode directly when it is booting a kernel. Since fc1120a7f5f2d4b6 this has included a requirement to set NSACR to give NS state access to the FPU; we fixed that for the usual code path in ece628fcf6. However, it is also possible for a board model to request an alternative mode of booting, where its 'board_setup' code hook runs in Secure state and is responsible for doing the S->NS transition after it has done whatever work it must do in Secure state. In this situation the board_setup code now also needs to update NSACR. This affects all boards which set info->secure_board_setup, which is currently the 'raspi' and 'highbank' families. They both use the common arm_write_secure_board_setup_dummy_smc(). Set the NSACR CP11 and CP10 bits in the code written by that function, to allow FPU access in Non-Secure state when using dummy SMC setup routine. Otherwise an AArch32 kernel booted on the highbank or raspi boards will UNDEF as soon as it tries to use the FPU. Update the comment describing secure_board_setup to note the new requirements on users of it. This fixes a kernel panic when booting raspbian on raspi2. Successfully tested with: 2017-01-11-raspbian-jessie-lite.img 2018-11-13-raspbian-stretch-lite.img 2019-07-10-raspbian-buster-lite.img Fixes: fc1120a7f5 Signed-off-by: Clement Deschamps Tested-by: Laurent Bonnans Message-id: 20191104151137.81931-1-clement.deschamps@greensocs.com Reviewed-by: Peter Maydell [PMM: updated comment to boot.h to note new requirement on users of secure_board_setup; edited/rewrote commit message] Signed-off-by: Peter Maydell --- include/hw/arm/boot.h | 7 +++++-- hw/arm/boot.c | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) -- 2.20.1 diff --git a/include/hw/arm/boot.h b/include/hw/arm/boot.h index 7f4d0ca7cdf..ce2b48b88bc 100644 --- a/include/hw/arm/boot.h +++ b/include/hw/arm/boot.h @@ -107,9 +107,12 @@ struct arm_boot_info { void (*write_board_setup)(ARMCPU *cpu, const struct arm_boot_info *info); - /* If set, the board specific loader/setup blob will be run from secure + /* + * If set, the board specific loader/setup blob will be run from secure * mode, regardless of secure_boot. The blob becomes responsible for - * changing to non-secure state if implementing a non-secure boot + * changing to non-secure state if implementing a non-secure boot, + * including setting up EL3/Secure registers such as the NSACR as + * required by the Linux booting ABI before the switch to non-secure. */ bool secure_board_setup; diff --git a/hw/arm/boot.c b/hw/arm/boot.c index ef6724960c0..8fb4a63606f 100644 --- a/hw/arm/boot.c +++ b/hw/arm/boot.c @@ -240,6 +240,9 @@ void arm_write_secure_board_setup_dummy_smc(ARMCPU *cpu, }; uint32_t board_setup_blob[] = { /* board setup addr */ + 0xee110f51, /* mrc p15, 0, r0, c1, c1, 2 ;read NSACR */ + 0xe3800b03, /* orr r0, #0xc00 ;set CP11, CP10 */ + 0xee010f51, /* mcr p15, 0, r0, c1, c1, 2 ;write NSACR */ 0xe3a00e00 + (mvbar_addr >> 4), /* mov r0, #mvbar_addr */ 0xee0c0f30, /* mcr p15, 0, r0, c12, c0, 1 ;set MVBAR */ 0xee110f11, /* mrc p15, 0, r0, c1 , c1, 0 ;read SCR */