[U-Boot] [PATCH] armv8: Remove the codes about switching to EL1 before jumping to kernel
Huan Wang
alison.wang at nxp.com
Fri Sep 2 07:27:06 CEST 2016
> On 08/29/2016 11:29 AM, Huan Wang wrote:
> >> On 18.07.16 05:24, Huan Wang wrote:
> >>> Hi, Alex,
> >>>
> >>>
> >>>
> >>> As there is strong objection to remove the codes
> >>> about switching to EL1, I think we have to remain it, do you agree?
> >> I agree, yes.
> >>
> >>> If it is remained, I think your suggestion about
> >>> **always** jumping to ep for both switching to AArch64 and AArch32
> >>> modes will make the code hard to realize and very complicated. So I
> >>> prefer to keep the process in v4 patches. What is your opinion?
> >> I think we should still convert it to a function call based approach.
> >> You can either just convert the current flow to functions:
> >>
> >> static void enter_in_el1(...)
> >> {
> >> call_in_el1(payload_pc, payload_bits, ...); }
> >>
> >> #ifdef ENTER_PAYLOAD_IN_EL1
> >> call_in_el2(enter_in_el1, 64bit, ...); #else call_in_el2(payload_pc,
> >> payload_bits, ...); #endif
> >>
> >> Or you could add a check in the EL1 caller if you are in EL3 that you
> >> want to go to EL2 first:
> >>
> >> long call_in_el1(...)
> >> {
> >> if (current_el() == 3)
> >> return call_in_el2(call_in_el1, ...);
> >>
> >> asm_call_in_el1(...);
> >> }
> >>
> >>
> > [Alison Wang] Yes, it can work for primary core and secondary cores
> for LayerScape.
> >
> > For other ARMv8 platforms, such as
> > arch/arm/mach-exynos/soc.c,
> > void lowlevel_init(void)
> > {
> > armv8_switch_to_el2();
> > armv8_switch_to_el1();
> > }
> > Is there any appropriate ep we can transfer for these functions?
>
> First off, I'd be surprised if the sequence above even works at all, as
> you also need to set up your page tables for el2/el1 if you want to get
> into those.
>
> IMHO the best path for this case is to remove the function :). But
> double-check with the Samsung folks first. I don't see why they can't
> use the generic one.
[Alison Wang] Yes, the best way is to remove the function. Let me ask them
if we can remove it.
>
> > Even for the common arch/arm/cpu/armv8/start.S,
> > bl armv8_switch_to_el2
> > #ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> > bl armv8_switch_to_el1
> > #endif
> > The ep is hard to define.
>
> It's pretty simple. Just pass a pointer to the instruction after bl into
> the switch function:
>
> /*
> * All slaves will enter EL2 and optionally EL1.
> */
> adr x0, lowlevel_in_el2
> bl asm_call_in_el2
> b panic
> lowlevel_in_el2:
>
> #ifdef CONFIG_ARMV8_SWITCH_TO_EL1
> adr x0, lowlevel_in_el1
> bl asm_call_in_el1
> b panic
> lowlevel_in_el1:
> #endif
>
> Because you already save the real lr in a non-volatile register, all
> this does is waste a few bytes of stack compared to the previous code.
[Alison Wang] Yes, thanks for your advice.
Best Regards,
Alison Wang
More information about the U-Boot
mailing list