On 15 June 2015 at 04:48, Peter Crosthwaite <crosthwaitepe...@gmail.com> wrote: > Use cpu_set_pc across the board for setting program counters. This > removes instances of system level code having to reach into the CPU > env. > > Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> > --- > hw/arm/boot.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/hw/arm/boot.c b/hw/arm/boot.c > index d036624..324ba6d 100644 > --- a/hw/arm/boot.c > +++ b/hw/arm/boot.c > @@ -168,11 +168,9 @@ static void default_write_secondary(ARMCPU *cpu, > static void default_reset_secondary(ARMCPU *cpu, > const struct arm_boot_info *info) > { > - CPUARMState *env = &cpu->env; > - > address_space_stl_notdirty(&address_space_memory, info->smp_bootreg_addr, > 0, MEMTXATTRS_UNSPECIFIED, NULL); > - env->regs[15] = info->smp_loader_start; > + cpu_set_pc(CPU(cpu), info->smp_loader_start, &error_abort); > } > > static inline bool have_dtb(const struct arm_boot_info *info) > @@ -452,12 +450,10 @@ static void do_cpu_reset(void *opaque) > if (info) { > if (!info->is_linux) { > /* Jump to the entry point. */ > - if (env->aarch64) { > - env->pc = info->entry; > - } else { > - env->regs[15] = info->entry & 0xfffffffe; > + if (!env->aarch64) { > env->thumb = info->entry & 1; > } > + cpu_set_pc(CPU(cpu), info->entry, &error_abort);
Code like this is really wanting to call a "set PC and Thumb" function, ie an interworking-aware set-pc. -- PMM