efi_loader: detach runtime in ExitBootServices()
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Fri, 5 Jul 2019 15:42:16 +0000 (17:42 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 6 Jul 2019 19:25:32 +0000 (21:25 +0200)
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>
include/efi_loader.h
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_runtime.c

index 8d75dde569d75d7b4ee03f9978b7c086f7a16afd..db4763fc9b768924d53c90bafd5d1ae4f72ab2d7 100644 (file)
@@ -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 */
index ba4c1e5765bf002a6e54590405ce6e00623f2de9..c2f89805c76776fe4a2bff2f9d6aea1a9b882469 100644 (file)
@@ -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();
 
index dcbe824451ebd481ba8ce4f505ac65e34d614035..7a64dd42ca7f3f698b3f96dc3cf8006e67aa79d0 100644 (file)
@@ -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;