mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-18 02:44:37 +00:00

Add empty weak assembler function armv8_switch_to_el2_prep() which is jumped to just before U-Boot determines which EL it is running in and decides which path to take to boot the Linux kernel. This weak function is meant to be used by architecture specific code to implement jump to a firmware blob, which then returns right past this weak function and continues execution of U-Boot code which then boots the Linux kernel. One example of such use case is when U-Boot jump tp TFA BL31, which switches from EL3 to EL2 and then returns to U-Boot code newly running in EL2 and starts the Linux kernel. The weak function is called with caches already disabled and DM shut down. Any preparatory work or even loading of more data must be done in board_prep_linux(), this hook is meant only for the final jump to the firmware and return to U-Boot before booting Linux. Reviewed-by: Tom Rini <trini@konsulko.com> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
59 lines
1.3 KiB
ArmAsm
59 lines
1.3 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* (C) Copyright 2013
|
|
* David Feng <fenghua@phytium.com.cn>
|
|
*/
|
|
|
|
#include <asm-offsets.h>
|
|
#include <config.h>
|
|
#include <linux/linkage.h>
|
|
#include <asm/macro.h>
|
|
|
|
.pushsection .text.armv8_switch_to_el2_prep, "ax"
|
|
WEAK(armv8_switch_to_el2_prep)
|
|
ret
|
|
ENDPROC(armv8_switch_to_el2_prep)
|
|
.popsection
|
|
|
|
.pushsection .text.armv8_switch_to_el2, "ax"
|
|
ENTRY(armv8_switch_to_el2)
|
|
bl armv8_switch_to_el2_prep
|
|
nop
|
|
switch_el x6, 1f, 0f, 0f
|
|
0:
|
|
cmp x5, #ES_TO_AARCH64
|
|
b.eq 2f
|
|
/*
|
|
* When loading 32-bit kernel, it will jump
|
|
* to secure firmware again, and never return.
|
|
*/
|
|
bl armv8_el2_to_aarch32
|
|
2:
|
|
/*
|
|
* x4 is kernel entry point or switch_to_el1
|
|
* if CONFIG_ARMV8_SWITCH_TO_EL1 is defined.
|
|
* When running in EL2 now, jump to the
|
|
* address saved in x4.
|
|
*/
|
|
br x4
|
|
1: armv8_switch_to_el2_m x4, x5, x6
|
|
ENDPROC(armv8_switch_to_el2)
|
|
.popsection
|
|
|
|
.pushsection .text.armv8_switch_to_el1, "ax"
|
|
ENTRY(armv8_switch_to_el1)
|
|
switch_el x6, 0f, 1f, 0f
|
|
0:
|
|
/* x4 is kernel entry point. When running in EL1
|
|
* now, jump to the address saved in x4.
|
|
*/
|
|
br x4
|
|
1: armv8_switch_to_el1_m x4, x5, x6, x7
|
|
ENDPROC(armv8_switch_to_el1)
|
|
.popsection
|
|
|
|
.pushsection .text.armv8_el2_to_aarch32, "ax"
|
|
WEAK(armv8_el2_to_aarch32)
|
|
ret
|
|
ENDPROC(armv8_el2_to_aarch32)
|
|
.popsection
|