aboutsummaryrefslogtreecommitdiff
path: root/hw/intc
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-02-15 09:56:39 +0000
committerPeter Maydell <peter.maydell@linaro.org>2019-02-15 09:56:39 +0000
commit935fe442dc234c7b3fa52d346ced7a614696107e (patch)
tree40dfd52da94a2497fa66aea2f78e3f19d75de957 /hw/intc
parent6ea564872238a25de2bdac8a61c485df6bcce9d6 (diff)
downloadqemu-935fe442dc234c7b3fa52d346ced7a614696107e.zip
qemu-935fe442dc234c7b3fa52d346ced7a614696107e.tar.gz
qemu-935fe442dc234c7b3fa52d346ced7a614696107e.tar.bz2
hw/intc/armv7m_nvic: Allow byte accesses to SHPR1
The code for handling the NVIC SHPR1 register intends to permit byte and halfword accesses (as the architecture requires). However the 'case' line for it only lists the base address of the register, so attempts to access bytes other than the first one end up in the "bad write" default logic. This bug was added accidentally when we split out the SHPR1 logic from SHPR2 and SHPR3 to support v6M. Fixes: 7c9140afd594 ("nvic: Handle ARMv6-M SCS reserved registers") Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- The Zephyr RTOS happens to access SHPR1 byte at a time, which is how I spotted this.
Diffstat (limited to 'hw/intc')
-rw-r--r--hw/intc/armv7m_nvic.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/hw/intc/armv7m_nvic.c b/hw/intc/armv7m_nvic.c
index 790a3d9..ab822f4 100644
--- a/hw/intc/armv7m_nvic.c
+++ b/hw/intc/armv7m_nvic.c
@@ -1841,7 +1841,7 @@ static MemTxResult nvic_sysreg_read(void *opaque, hwaddr addr,
}
}
break;
- case 0xd18: /* System Handler Priority (SHPR1) */
+ case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
val = 0;
break;
@@ -1956,7 +1956,7 @@ static MemTxResult nvic_sysreg_write(void *opaque, hwaddr addr,
}
nvic_irq_update(s);
return MEMTX_OK;
- case 0xd18: /* System Handler Priority (SHPR1) */
+ case 0xd18 ... 0xd1b: /* System Handler Priority (SHPR1) */
if (!arm_feature(&s->cpu->env, ARM_FEATURE_M_MAIN)) {
return MEMTX_OK;
}