summaryrefslogtreecommitdiff
path: root/cmd/bootefi.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2016-11-17 00:02:58 (GMT)
committerAlexander Graf <agraf@suse.de>2016-11-17 10:52:21 (GMT)
commit69bd459d343fe1e5a68a6f187d8c99c78c6fc6ce (patch)
treef02f29ed636d7f5660869685b23232125e0636e9 /cmd/bootefi.c
parent58ad86288fd32f1f969ac654f2074c090f0abe32 (diff)
downloadu-boot-69bd459d343fe1e5a68a6f187d8c99c78c6fc6ce.tar.xz
efi_loader: AArch64: Run EFI payloads in EL2 if U-Boot runs in EL3
Some boards decided not to run ATF or other secure firmware in EL3, so they instead run U-Boot there. The uEFI spec doesn't know what EL3 is though - it only knows about EL2 and EL1. So if we see that we're running in EL3, let's get into EL2 to make payloads happy. Signed-off-by: Alexander Graf <agraf@suse.de> Reviewed-by: York Sun <york.sun@nxp.com>
Diffstat (limited to 'cmd/bootefi.c')
-rw-r--r--cmd/bootefi.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index ae1b713..ca41170 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -226,6 +226,17 @@ static unsigned long do_bootefi_exec(void *efi, void *fdt)
return status == EFI_SUCCESS ? 0 : -EINVAL;
}
+#ifdef CONFIG_ARM64
+ /* On AArch64 we need to make sure we call our payload in < EL3 */
+ if (current_el() == 3) {
+ smp_kick_all_cpus();
+ dcache_disable(); /* flush cache before switch to EL2 */
+ armv8_switch_to_el2();
+ /* Enable caches again */
+ dcache_enable();
+ }
+#endif
+
return entry(&loaded_image_info, &systab);
}