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 <frederic.kon...@adacore.com> --- 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