[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v1 2/3] arm: fix the armv7m reset state
From: |
KONRAD Frederic |
Subject: |
[Qemu-devel] [PATCH v1 2/3] arm: fix the armv7m reset state |
Date: |
Thu, 29 Jun 2017 11:28:52 +0200 |
This fixes an odd bug when a ROM is present somewhere and an alias @0x00000000
is pointing to the ROM. The "if (rom)" test fails and we don't get a valid reset
state. QEMU later crashes with an exception because the ARMv7-M starts with the
ARM instruction set. (eg: PC & 0x01 is 0).
This patch uses memory_region_get_offset_within_address_space introduced before
to check if an alias doesn't point to a flash somewhere.
Signed-off-by: KONRAD Frederic <address@hidden>
---
target/arm/cpu.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 28a9141..b8afd97 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -201,6 +201,20 @@ static void arm_cpu_reset(CPUState *s)
/* Load the initial SP and PC from the vector table at address 0 */
rom = rom_ptr(0);
+
+ if (!rom) {
+ /* Sometimes address 0x00000000 is an alias to a flash which
+ * actually have a ROM.
+ */
+ MemoryRegionSection section;
+ hwaddr offset = 0;
+
+ section = memory_region_find(s->as->root, 0, 8);
+ offset = memory_region_get_offset_within_address_space(section.mr);
+ memory_region_unref(section.mr);
+ rom = rom_ptr(offset);
+ }
+
if (rom) {
/* Address zero is covered by ROM which hasn't yet been
* copied into physical memory.
--
1.8.3.1
[Qemu-devel] [PATCH v1 1/3] add memory_region_get_offset_within_address_space, KONRAD Frederic, 2017/06/29
[Qemu-devel] [PATCH v1 3/3] armv7m_systick: abort instead of locking on a bad rate, KONRAD Frederic, 2017/06/29