summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-01-08 18:13:06 +0100
committerAlexander Graf <agraf@suse.de>2019-02-13 09:40:06 +0100
commitf6c6df7ebc12fdaab252c5869732cef6fa48d864 (patch)
treea9dd4b1d6b4a9304e17dc37042e63174d211cfc2 /cmd
parentb4f471f18e68b340e5b968e2d611b83f709a78ce (diff)
efi_loader: refactor switch to non-secure mode
Refactor the switch from supervisor to hypervisor to a new function called at the beginning of do_bootefi(). Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'cmd')
-rw-r--r--cmd/bootefi.c71
1 files changed, 4 insertions, 67 deletions
diff --git a/cmd/bootefi.c b/cmd/bootefi.c
index bcdd29ebed..ee685d8644 100644
--- a/cmd/bootefi.c
+++ b/cmd/bootefi.c
@@ -5,8 +5,9 @@
* Copyright (c) 2016 Alexander Graf
*/
-#include <charset.h>
#include <common.h>
+#include <bootm.h>
+#include <charset.h>
#include <command.h>
#include <dm.h>
#include <efi_loader.h>
@@ -21,11 +22,6 @@
#include <asm-generic/unaligned.h>
#include <linux/linkage.h>
-#ifdef CONFIG_ARMV7_NONSEC
-#include <asm/armv7.h>
-#include <asm/secure.h>
-#endif
-
DECLARE_GLOBAL_DATA_PTR;
static struct efi_device_path *bootefi_image_path;
@@ -151,34 +147,6 @@ static efi_status_t efi_do_enter(
return ret;
}
-#ifdef CONFIG_ARM64
-static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*entry)(
- efi_handle_t image_handle, struct efi_system_table *st),
- efi_handle_t image_handle, struct efi_system_table *st)
-{
- /* Enable caches again */
- dcache_enable();
-
- return efi_do_enter(image_handle, st, entry);
-}
-#endif
-
-#ifdef CONFIG_ARMV7_NONSEC
-static bool is_nonsec;
-
-static efi_status_t efi_run_in_hyp(EFIAPI efi_status_t (*entry)(
- efi_handle_t image_handle, struct efi_system_table *st),
- efi_handle_t image_handle, struct efi_system_table *st)
-{
- /* Enable caches again */
- dcache_enable();
-
- is_nonsec = true;
-
- return efi_do_enter(image_handle, st, entry);
-}
-#endif
-
/*
* efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
*
@@ -358,39 +326,6 @@ static efi_status_t do_bootefi_exec(void *efi,
goto err_prepare;
}
-#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 */
-
- /* Move into EL2 and keep running there */
- armv8_switch_to_el2((ulong)entry,
- (ulong)&image_obj->header,
- (ulong)&systab, 0, (ulong)efi_run_in_el2,
- ES_TO_AARCH64);
-
- /* Should never reach here, efi exits with longjmp */
- while (1) { }
- }
-#endif
-
-#ifdef CONFIG_ARMV7_NONSEC
- if (armv7_boot_nonsec() && !is_nonsec) {
- dcache_disable(); /* flush cache before switch to HYP */
-
- armv7_init_nonsec();
- secure_ram_addr(_do_nonsec_entry)(
- efi_run_in_hyp,
- (uintptr_t)entry,
- (uintptr_t)&image_obj->header,
- (uintptr_t)&systab);
-
- /* Should never reach here, efi exits with longjmp */
- while (1) { }
- }
-#endif
-
ret = efi_do_enter(&image_obj->header, &systab, entry);
err_prepare:
@@ -476,6 +411,8 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/* Allow unaligned memory access */
allow_unaligned();
+ switch_to_non_secure_mode();
+
/* Initialize EFI drivers */
r = efi_init_obj_list();
if (r != EFI_SUCCESS) {