
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?
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.
"msr elr_el3, lr" really make sense.
Best Regards, Alison Wang