efi_loader: let the variable driver patch out the runtime
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 20 Jun 2019 13:25:48 +0000 (15:25 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 6 Jul 2019 19:25:32 +0000 (21:25 +0200)
Our variable services are only provided at boottime. Therefore when
leaving boottime the variable function are replaced by dummy functions
returning EFI_UNSUPPORTED. Move this patching of the runtime table to the
variable services implementation. Executed it in ExitBootServices().

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
lib/efi_loader/efi_variable.c

index d30c4e8ef31678bba7283a897f363dc51fa7c150..8d75dde569d75d7b4ee03f9978b7c086f7a16afd 100644 (file)
@@ -327,6 +327,8 @@ extern struct list_head efi_register_notify_events;
 efi_status_t efi_init_obj_list(void);
 /* Initialize variable services */
 efi_status_t efi_init_variables(void);
+/* Notify ExitBootServices() is called */
+void efi_variables_boot_exit_notify(void);
 /* Called by bootefi to initialize root node */
 efi_status_t efi_root_node_register(void);
 /* Called by bootefi to initialize runtime */
index bf2df80c838d7e56fd3cce5f81e38e6a58a195fe..ba4c1e5765bf002a6e54590405ce6e00623f2de9 100644 (file)
@@ -1968,7 +1968,8 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
        /* Make sure that notification functions are not called anymore */
        efi_tpl = TPL_HIGH_LEVEL;
 
-       /* TODO: Should persist EFI variables here */
+       /* Notify variable services */
+       efi_variables_boot_exit_notify();
 
        board_quiesce_devices();
 
index 702136ae0eb408dd5cfcdab9f8aa07cabeffa357..bc2a23afbbae7d0d8645f66a6ecc267ad564407a 100644 (file)
@@ -408,15 +408,6 @@ static const struct efi_runtime_detach_list_struct efi_runtime_detach_list[] = {
        }, {
                .ptr = &efi_runtime_services.set_time,
                .patchto = &efi_set_time,
-       }, {
-               .ptr = &efi_runtime_services.get_variable,
-               .patchto = &efi_device_error,
-       }, {
-               .ptr = &efi_runtime_services.get_next_variable_name,
-               .patchto = &efi_device_error,
-       }, {
-               .ptr = &efi_runtime_services.set_variable,
-               .patchto = &efi_device_error,
        }
 };
 
index 6210425f5e2c9ea0c85d3011cf99c9f5a1ceb9ef..bc8ed678c9f1d56bed84f74fbd41c234b9b832dc 100644 (file)
@@ -548,6 +548,50 @@ efi_status_t __efi_runtime EFIAPI efi_query_variable_info(
        return EFI_UNSUPPORTED;
 }
 
+/**
+ * efi_get_variable_runtime() - runtime implementation of GetVariable()
+ */
+static efi_status_t __efi_runtime EFIAPI
+efi_get_variable_runtime(u16 *variable_name, const efi_guid_t *vendor,
+                        u32 *attributes, efi_uintn_t *data_size, void *data)
+{
+       return EFI_UNSUPPORTED;
+}
+
+/**
+ * efi_get_next_variable_name_runtime() - runtime implementation of
+ *                                       GetNextVariable()
+ */
+static efi_status_t __efi_runtime EFIAPI
+efi_get_next_variable_name_runtime(efi_uintn_t *variable_name_size,
+                                  u16 *variable_name, const efi_guid_t *vendor)
+{
+       return EFI_UNSUPPORTED;
+}
+
+/**
+ * efi_set_variable_runtime() - runtime implementation of SetVariable()
+ */
+static efi_status_t __efi_runtime EFIAPI
+efi_set_variable_runtime(u16 *variable_name, const efi_guid_t *vendor,
+                        u32 attributes, efi_uintn_t data_size,
+                        const void *data)
+{
+       return EFI_UNSUPPORTED;
+}
+
+/**
+ * efi_variables_boot_exit_notify() - notify ExitBootServices() is called
+ */
+void efi_variables_boot_exit_notify(void)
+{
+       efi_runtime_services.get_variable = efi_get_variable_runtime;
+       efi_runtime_services.get_next_variable_name =
+                               efi_get_next_variable_name_runtime;
+       efi_runtime_services.set_variable = efi_set_variable_runtime;
+       efi_update_table_header_crc32(&efi_runtime_services.hdr);
+}
+
 /**
  * efi_init_variables() - initialize variable services
  *