diff options
author | Alexander Graf <agraf@suse.de> | 2016-11-17 01:02:58 +0100 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2016-11-17 11:52:21 +0100 |
commit | 69bd459d343fe1e5a68a6f187d8c99c78c6fc6ce (patch) | |
tree | f02f29ed636d7f5660869685b23232125e0636e9 /cmd | |
parent | 58ad86288fd32f1f969ac654f2074c090f0abe32 (diff) |
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')
-rw-r--r-- | cmd/bootefi.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c index ae1b713197c..ca411702bae 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); } |