On Sat, Aug 2, 2014 at 9:41 AM, Peter Crosthwaite <crosthwaitepe...@gmail.com> wrote: > ARMv7M has it's own bootloader (separate from the regular ARM > bootloader) that is elf aware. It is able to load elfs but it does > not set the program counter to the elf entry point. Make it more > consistent with the regular ARM bootloader by setting the program > counter to the given elf entry point. > > Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> > --- > hw/arm/armv7m.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c > index 397e8df..d1b983f 100644 > --- a/hw/arm/armv7m.c > +++ b/hw/arm/armv7m.c > @@ -155,11 +155,18 @@ static void armv7m_bitband_init(void) > > /* Board init. */ > > +typedef struct ARMV7MResetArgs { > + ARMCPU *cpu; > + uint32_t reset_pc; > +} ARMV7MResetArgs; > + > static void armv7m_reset(void *opaque) > { > - ARMCPU *cpu = opaque; > + ARMV7MResetArgs *args = opaque; > > - cpu_reset(CPU(cpu)); > + cpu_reset(CPU(args->cpu)); > + args->cpu->env.regs[15] = args->reset_pc; > + args->cpu->env.thumb = args->reset_pc & 1; > }
This breaks a simple test case that I have. It now starts at a an address one one bit larger but causes the program to hang. If the 'cpu_reset(CPU(args->cpu))' is moved to the end of the function the test boots (the same as it did before). > > /* Init CPU and memory for a v7-M based board. > @@ -183,6 +190,7 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem, > MemoryRegion *sram = g_new(MemoryRegion, 1); > MemoryRegion *flash = g_new(MemoryRegion, 1); > MemoryRegion *hack = g_new(MemoryRegion, 1); > + ARMV7MResetArgs reset_args; > > flash_size *= 1024; > sram_size *= 1024; > @@ -259,7 +267,12 @@ qemu_irq *armv7m_init(MemoryRegion *address_space_mem, > vmstate_register_ram_global(hack); > memory_region_add_subregion(address_space_mem, 0xfffff000, hack); > > - qemu_register_reset(armv7m_reset, cpu); > + reset_args = (ARMV7MResetArgs) { > + .cpu = cpu, > + .reset_pc = entry, > + }; > + qemu_register_reset(armv7m_reset, > + g_memdup(&reset_args, sizeof(reset_args))); > return pic; > } > > -- > 1.9.1 >