[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 15/26] hw/arm/armv7m: Handle disconnected clock inputs
From: |
Peter Maydell |
Subject: |
[PULL 15/26] hw/arm/armv7m: Handle disconnected clock inputs |
Date: |
Mon, 21 Feb 2022 09:27:49 +0000 |
In the armv7m object, handle clock inputs that aren't connected.
This is always an error for 'cpuclk'. For 'refclk' it is OK for this
to be disconnected, but we need to handle it by not trying to connect
a sourceless-clock to the systick device.
This fixes a bug where on the mps2-an521 and similar boards (which
do not have a refclk) the systick device incorrectly reset with
SYST_CSR.CLKSOURCE 0 ("use refclk") rather than 1 ("use CPU clock").
Cc: qemu-stable@nongnu.org
Reported-by: Richard Petri <git@rpls.de>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20220208171643.3486277-1-peter.maydell@linaro.org
---
hw/arm/armv7m.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c
index ceb76df3cd4..41cfca0f223 100644
--- a/hw/arm/armv7m.c
+++ b/hw/arm/armv7m.c
@@ -284,6 +284,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
return;
}
+ /* cpuclk must be connected; refclk is optional */
+ if (!clock_has_source(s->cpuclk)) {
+ error_setg(errp, "armv7m: cpuclk must be connected");
+ return;
+ }
+
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
s->cpu = ARM_CPU(object_new_with_props(s->cpu_type, OBJECT(s), "cpu",
@@ -420,8 +426,18 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
&s->sysreg_ns_mem);
}
- /* Create and map the systick devices */
- qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);
+ /*
+ * Create and map the systick devices. Note that we only connect
+ * refclk if it has been connected to us; otherwise the systick
+ * device gets the wrong answer for clock_has_source(refclk), because
+ * it has an immediate source (the ARMv7M's clock object) but not
+ * an ultimate source, and then it won't correctly auto-select the
+ * CPU clock as its only possible clock source.
+ */
+ if (clock_has_source(s->refclk)) {
+ qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk",
+ s->refclk);
+ }
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);
if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
return;
@@ -438,8 +454,10 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
*/
object_initialize_child(OBJECT(dev), "systick-reg-s",
&s->systick[M_REG_S], TYPE_SYSTICK);
- qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
- s->refclk);
+ if (clock_has_source(s->refclk)) {
+ qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
+ s->refclk);
+ }
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",
s->cpuclk);
--
2.25.1
- [PULL 07/26] target/arm: Move '-cpu host' code to cpu64.c, (continued)
- [PULL 07/26] target/arm: Move '-cpu host' code to cpu64.c, Peter Maydell, 2022/02/21
- [PULL 06/26] checkpatch: Ensure that TypeInfos are const, Peter Maydell, 2022/02/21
- [PULL 08/26] target/arm: Use aarch64_cpu_register() for 'host' CPU type, Peter Maydell, 2022/02/21
- [PULL 12/26] target/arm: Support PAuth extension for hvf, Peter Maydell, 2022/02/21
- [PULL 05/26] Mark remaining global TypeInfo instances as const, Peter Maydell, 2022/02/21
- [PULL 09/26] target/arm: Make KVM -cpu max exactly like -cpu host, Peter Maydell, 2022/02/21
- [PULL 11/26] target/arm: Fix '-cpu max' for HVF, Peter Maydell, 2022/02/21
- [PULL 14/26] Kconfig: Add 'imply I2C_DEVICES' on boards with available i2c bus, Peter Maydell, 2022/02/21
- [PULL 13/26] Kconfig: Add I2C_DEVICES device group, Peter Maydell, 2022/02/21
- [PULL 10/26] target/arm: Unindent unnecessary else-clause, Peter Maydell, 2022/02/21
- [PULL 15/26] hw/arm/armv7m: Handle disconnected clock inputs,
Peter Maydell <=
- [PULL 16/26] include: Move qemu_madvise() and related #defines to new qemu/madvise.h, Peter Maydell, 2022/02/21
- [PULL 17/26] include: Move qemu_mprotect_*() to new qemu/mprotect.h, Peter Maydell, 2022/02/21
- [PULL 19/26] include: Move qemu_[id]cache_* declarations to new qemu/cacheinfo.h, Peter Maydell, 2022/02/21
- [PULL 20/26] include: Move hardware version declarations to new qemu/hw-version.h, Peter Maydell, 2022/02/21
- [PULL 23/26] hw/arm: add initial mori-bmc board, Peter Maydell, 2022/02/21
- [PULL 18/26] include: Move QEMU_MAP_* constants to mmap-alloc.h, Peter Maydell, 2022/02/21
- [PULL 26/26] ui/cocoa: Fix the leak of qemu_console_get_label, Peter Maydell, 2022/02/21
- [PULL 21/26] MAINTAINERS: Add Akihiko Odaki to macOS-relateds, Peter Maydell, 2022/02/21
- [PULL 25/26] ui/cocoa: Do not alert even without block devices, Peter Maydell, 2022/02/21
- [PULL 24/26] ui/cocoa: Remove allowedFileTypes restriction in SavePanel, Peter Maydell, 2022/02/21