From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 04/30] hw/core/resettable: fix reset level counting
Date: Tue, 25 Oct 2022 17:39:26 +0100 [thread overview]
Message-ID: <20221025163952.4131046-5-peter.maydell@linaro.org> (raw)
In-Reply-To: <20221025163952.4131046-1-peter.maydell@linaro.org>
From: Damien Hedde <damien.hedde@greensocs.com>
The code for handling the reset level count in the Resettable code
has two issues:
The reset count is only decremented for the 1->0 case. This means
that if there's ever a nested reset that takes the count to 2 then it
will never again be decremented. Eventually the count will exceed
the '50' limit in resettable_phase_enter() and QEMU will trip over
the assertion failure. The repro case in issue 1266 is an example of
this that happens now the SCSI subsystem uses three-phase reset.
Secondly, the count is decremented only after the exit phase handler
is called. Moving the reset count decrement from "just after" to
"just before" calling the exit phase handler allows
resettable_is_in_reset() to return false during the handler
execution.
This simplifies reset handling in resettable devices. Typically, a
function that updates the device state will just need to read the
current reset state and not anymore treat the "in a reset-exit
transition" as a special case.
Note that the semantics change to the *_is_in_reset() functions
will have no effect on the current codebase, because only two
devices (hw/char/cadence_uart.c and hw/misc/zynq_sclr.c) currently
call those functions, and in neither case do they do it from the
device's exit phase methed.
Fixes: 4a5fc890 ("scsi: Use device_cold_reset() and bus_cold_reset()")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1266
Signed-off-by: Damien Hedde <damien.hedde@greensocs.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reported-by: Michael Peter <michael.peter@hensoldt-cyber.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-id: 20221020142749.3357951-1-peter.maydell@linaro.org
Buglink: https://bugs.launchpad.net/qemu/+bug/1905297
Reported-by: Michael Peter <michael.peter@hensoldt-cyber.com>
[PMM: adjust the docs paragraph changed to get the name of the
'enter' phase right and to clarify exactly when the count is
adjusted; rewrite the commit message]
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
docs/devel/reset.rst | 8 +++++---
hw/core/resettable.c | 3 +--
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/docs/devel/reset.rst b/docs/devel/reset.rst
index abea1102dc4..7cc6a6b3140 100644
--- a/docs/devel/reset.rst
+++ b/docs/devel/reset.rst
@@ -210,9 +210,11 @@ Polling the reset state
Resettable interface provides the ``resettable_is_in_reset()`` function.
This function returns true if the object parameter is currently under reset.
-An object is under reset from the beginning of the *init* phase to the end of
-the *exit* phase. During all three phases, the function will return that the
-object is in reset.
+An object is under reset from the beginning of the *enter* phase (before
+either its children or its own enter method is called) to the *exit*
+phase. During *enter* and *hold* phase only, the function will return that the
+object is in reset. The state is changed after the *exit* is propagated to
+its children and just before calling the object's own *exit* method.
This function may be used if the object behavior has to be adapted
while in reset state. For example if a device has an irq input,
diff --git a/hw/core/resettable.c b/hw/core/resettable.c
index 96a99ce39ea..c3df75c6ba8 100644
--- a/hw/core/resettable.c
+++ b/hw/core/resettable.c
@@ -201,12 +201,11 @@ static void resettable_phase_exit(Object *obj, void *opaque, ResetType type)
resettable_child_foreach(rc, obj, resettable_phase_exit, NULL, type);
assert(s->count > 0);
- if (s->count == 1) {
+ if (--s->count == 0) {
trace_resettable_phase_exit_exec(obj, obj_typename, !!rc->phases.exit);
if (rc->phases.exit && !resettable_get_tr_func(rc, obj)) {
rc->phases.exit(obj);
}
- s->count = 0;
}
s->exit_phase_in_progress = false;
trace_resettable_phase_exit_end(obj, obj_typename, s->count);
--
2.25.1
next prev parent reply other threads:[~2022-10-25 16:52 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-25 16:39 [PULL 00/30] target-arm queue Peter Maydell
2022-10-25 16:39 ` [PULL 01/30] target/arm: Implement FEAT_E0PD Peter Maydell
2022-10-25 16:39 ` [PULL 02/30] hw/arm/virt: Fix devicetree warnings about the virtio-iommu node Peter Maydell
2022-10-25 16:39 ` [PULL 03/30] target/arm: honor HCR_E2H and HCR_TGE in arm_excp_unmasked() Peter Maydell
2022-10-25 16:39 ` Peter Maydell [this message]
2022-10-25 16:39 ` [PULL 05/30] hw/hyperv/hyperv.c: Use device_cold_reset() instead of device_legacy_reset() Peter Maydell
2022-10-25 16:39 ` [PULL 06/30] target/imx: reload cmp timer outside of the reload ptimer transaction Peter Maydell
2022-10-25 16:39 ` [PULL 07/30] target/arm: Introduce regime_is_stage2 Peter Maydell
2022-10-25 16:39 ` [PULL 08/30] target/arm: Add ptw_idx to S1Translate Peter Maydell
2022-10-31 23:14 ` Philippe Mathieu-Daudé
2022-11-01 10:10 ` Philippe Mathieu-Daudé
2022-11-01 16:57 ` Philippe Mathieu-Daudé
2022-10-25 16:39 ` [PULL 09/30] target/arm: Add isar predicates for FEAT_HAFDBS Peter Maydell
2022-10-25 16:39 ` [PULL 10/30] target/arm: Extract HA and HD in aa64_va_parameters Peter Maydell
2022-10-25 16:39 ` [PULL 11/30] target/arm: Move S1_ptw_translate outside arm_ld[lq]_ptw Peter Maydell
2022-10-25 16:39 ` [PULL 12/30] target/arm: Add ARMFault_UnsuppAtomicUpdate Peter Maydell
2022-10-25 16:39 ` [PULL 13/30] target/arm: Remove loop from get_phys_addr_lpae Peter Maydell
2022-10-25 16:39 ` [PULL 14/30] target/arm: Fix fault reporting in get_phys_addr_lpae Peter Maydell
2022-10-25 16:39 ` [PULL 15/30] target/arm: Don't shift attrs " Peter Maydell
2022-10-25 16:39 ` [PULL 16/30] target/arm: Consider GP an attribute " Peter Maydell
2022-10-25 16:39 ` [PULL 17/30] target/arm: Tidy merging of attributes from descriptor and table Peter Maydell
2022-10-25 16:39 ` [PULL 18/30] target/arm: Implement FEAT_HAFDBS, access flag portion Peter Maydell
2022-10-25 16:39 ` [PULL 19/30] target/arm: Implement FEAT_HAFDBS, dirty bit portion Peter Maydell
2022-10-25 16:39 ` [PULL 20/30] target/arm: Use the max page size in a 2-stage ptw Peter Maydell
2022-10-25 16:39 ` [PULL 21/30] reset: allow registering handlers that aren't called by snapshot loading Peter Maydell
2022-10-25 16:39 ` [PULL 22/30] device-tree: add re-randomization helper function Peter Maydell
2022-10-25 16:39 ` [PULL 23/30] x86: do not re-randomize RNG seed on snapshot load Peter Maydell
2022-10-25 16:39 ` [PULL 24/30] arm: re-randomize rng-seed on reboot Peter Maydell
2022-10-25 16:39 ` [PULL 25/30] riscv: " Peter Maydell
2022-10-25 16:39 ` [PULL 26/30] m68k/virt: do not re-randomize RNG seed on snapshot load Peter Maydell
2022-10-25 16:39 ` [PULL 27/30] m68k/q800: " Peter Maydell
2022-10-25 16:39 ` [PULL 28/30] mips/boston: re-randomize rng-seed on reboot Peter Maydell
2022-10-25 16:39 ` [PULL 29/30] openrisc: " Peter Maydell
2022-10-25 16:39 ` [PULL 30/30] rx: " Peter Maydell
2022-10-26 14:49 ` [PULL 00/30] target-arm queue Stefan Hajnoczi
2022-10-26 15:26 ` Jason A. Donenfeld
2022-10-26 14:51 ` Stefan Hajnoczi
2022-10-27 10:36 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221025163952.4131046-5-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).