From mboxrd@z Thu Jan 1 00:00:00 1970 From: Huan Wang Date: Fri, 2 Sep 2016 05:27:06 +0000 Subject: [U-Boot] [PATCH] armv8: Remove the codes about switching to EL1 before jumping to kernel In-Reply-To: <57C833A3.6070503@suse.de> References: <1467872700-45942-1-git-send-email-b18965@freescale.com> <577E4092.8070007@suse.de> <57C833A3.6070503@suse.de> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de > 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