aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2019-07-05 17:42:16 +0200
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2019-07-06 21:25:32 +0200
commit7f95104d91ccfb26f802feb5300838b41bc5fbb1 (patch)
tree20a820fb1e3a9b98aa134a74b8a84228c263ec60
parentb23ffcbe02dc7182d910ab081bd6d33a5b540777 (diff)
downloadu-boot-7f95104d91ccfb26f802feb5300838b41bc5fbb1.zip
u-boot-7f95104d91ccfb26f802feb5300838b41bc5fbb1.tar.gz
u-boot-7f95104d91ccfb26f802feb5300838b41bc5fbb1.tar.bz2
efi_loader: detach runtime in ExitBootServices()
Linux can be called with a command line parameter efi=novamap, cf. commit 4e46c2a95621 ("efi/arm/arm64: Allow SetVirtualAddressMap() to be omitted"). In this case SetVirtualAddressMap() is not called after ExitBootServices(). OpenBSD 32bit does not call SetVirtualAddressMap() either. Runtime services must be set to an implementation supported at runtime in ExitBootServices(). Reported-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Suggested-by: Alexander Graf <agraf@csgraf.de> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
-rw-r--r--include/efi_loader.h2
-rw-r--r--lib/efi_loader/efi_boottime.c3
-rw-r--r--lib/efi_loader/efi_runtime.c2
3 files changed, 6 insertions, 1 deletions
diff --git a/include/efi_loader.h b/include/efi_loader.h
index 8d75dde..db4763f 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -333,6 +333,8 @@ void efi_variables_boot_exit_notify(void);
efi_status_t efi_root_node_register(void);
/* Called by bootefi to initialize runtime */
efi_status_t efi_initialize_system_table(void);
+/* efi_runtime_detach() - detach unimplemented runtime functions */
+void efi_runtime_detach(void);
/* Called by bootefi to make console interface available */
efi_status_t efi_console_register(void);
/* Called by bootefi to make all disk storage accessible as EFI objects */
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index ba4c1e5..c2f8980 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -1973,6 +1973,9 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
board_quiesce_devices();
+ /* Patch out unsupported runtime function */
+ efi_runtime_detach();
+
/* Fix up caches for EFI payloads if necessary */
efi_exit_caches();
diff --git a/lib/efi_loader/efi_runtime.c b/lib/efi_loader/efi_runtime.c
index dcbe824..7a64dd4 100644
--- a/lib/efi_loader/efi_runtime.c
+++ b/lib/efi_loader/efi_runtime.c
@@ -398,7 +398,7 @@ static bool efi_is_runtime_service_pointer(void *p)
/**
* efi_runtime_detach() - detach unimplemented runtime functions
*/
-static __efi_runtime void efi_runtime_detach(void)
+void efi_runtime_detach(void)
{
efi_runtime_services.reset_system = efi_reset_system;
efi_runtime_services.get_time = efi_get_time;