On Mon, Mar 9, 2020 at 12:18 PM Peter Maydell <peter.mayd...@linaro.org> wrote:
> On Tue, 3 Mar 2020 at 20:15, Niek Linnenbank <nieklinnenb...@gmail.com> > wrote: > > On Tue, Mar 3, 2020 at 1:09 PM Alex Bennée <alex.ben...@linaro.org> > wrote: > >> Niek Linnenbank <nieklinnenb...@gmail.com> writes: > >> > +static void allwinner_cpucfg_cpu_reset(AwCpuCfgState *s, uint8_t > cpu_id) > >> > +{ > >> > + int ret; > >> > + > >> > + trace_allwinner_cpucfg_cpu_reset(cpu_id, s->entry_addr); > >> > + > >> > + ret = arm_set_cpu_on(cpu_id, s->entry_addr, 0, > >> > + CPU_EXCEPTION_LEVEL_ON_RESET, false); > >> > >> According to the arm_set_cpu_on code: > >> > >> if (!target_aa64 && arm_feature(&target_cpu->env, > ARM_FEATURE_AARCH64)) { > >> /* > >> * For now we don't support booting an AArch64 CPU in AArch32 > mode > >> * TODO: We should add this support later > >> */ > >> qemu_log_mask(LOG_UNIMP, > >> "[ARM]%s: Starting AArch64 CPU %" PRId64 > >> " in AArch32 mode is not supported yet\n", > >> __func__, cpuid); > >> return QEMU_ARM_POWERCTL_INVALID_PARAM; > >> } > >> > >> Do you really want to reboot in aarch32 mode on a reset? If so we should > >> fix the TODO. > > > > The Allwinner H3 has four ARM Cortex-A7 cores and are 32-bit, so in the > > early version I filled the @target_aa64 parameter with false to > > keep it in 32-bit mode. And for usage in the current Allwinner H3 SoC > > that is sufficient, but as soon as a potential new SoC implementation > > with a 64-bit CPU starts to use this module, the hardcoded @target_aa64 > > parameter will become a problem. > > > Maybe I should just use some function to check if the current emulated > > CPU its 32-bit or 64-bit and use that for @target_aa64? > > If the intended behaviour is "just power on the CPU into EL3 > in the aarch32/aarch64 state it would naturally have out of reset" > then you can get the right value to pass to target_aa64 like this: > > ARMCPU *target_cpu = ARM_CPU(arm_get_cpu_by_id(cpu_id)); > > if (!target_cpu) { > /* > * handle the case of "guest wrote bogus value to RST_CTRL > * field, probably by returning doing nothing > */ > } > target_aa64 = arm_feature(&target_cpu->env, ARM_FEATURE_AARCH64); > > Thanks for explaining Peter. This solution is working fine. I'm including it in the v7 respin. Regards, Niek > Or if the required behaviour for a 64-bit CPU is more complicated > you can just assert or something with a comment that this would need > updating if we ever modelled a 64-bit Allwinner SoC. > > thanks > -- PMM > -- Niek Linnenbank