efi_loader: ARM: don't attempt to enter non-secure mode twice
authorMark Kettenis <kettenis@openbsd.org>
Fri, 15 Jun 2018 21:47:13 +0000 (23:47 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 25 Jul 2018 12:57:43 +0000 (14:57 +0200)
Multiple EFI binaries may be executed in sequence.  So if we already
are in non-secure mode after running the first one we should skip
the switching code since it no longer works once we're non-secure.

Signed-off-by: Mark Kettenis <kettenis@openbsd.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
cmd/bootefi.c

index c8c2564512244ab29b4c2739fdf8db00a64a382c..bbfea919da8d1c0f6d7d7c9b60c5484cd1f28d1c 100644 (file)
@@ -200,6 +200,8 @@ static efi_status_t efi_run_in_el2(EFIAPI efi_status_t (*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)
@@ -207,6 +209,8 @@ static efi_status_t efi_run_in_hyp(EFIAPI efi_status_t (*entry)(
        /* Enable caches again */
        dcache_enable();
 
+       is_nonsec = true;
+
        return efi_do_enter(image_handle, st, entry);
 }
 #endif
@@ -368,7 +372,7 @@ static efi_status_t do_bootefi_exec(void *efi,
 #endif
 
 #ifdef CONFIG_ARMV7_NONSEC
-       if (armv7_boot_nonsec()) {
+       if (armv7_boot_nonsec() && !is_nonsec) {
                dcache_disable();       /* flush cache before switch to HYP */
 
                armv7_init_nonsec();