efi_loader: remove NULL entries from runtime detach list
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 29 Jun 2019 00:00:16 +0000 (02:00 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 6 Jul 2019 19:25:32 +0000 (21:25 +0200)
Some entries in the system table are set to NULL in ExitBootServices(). We
had them in the runtime detach list to avoid relocation of NULL. Let's
instead assign the pointers dynamically in efi_initialize_system_table() to
avoid the relocation entry.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_runtime.c

index e62410c57fad774918e766c3b1244d60b05f3816..bf2df80c838d7e56fd3cce5f81e38e6a58a195fe 100644 (file)
@@ -3620,11 +3620,7 @@ struct efi_system_table __efi_runtime_data systab = {
        },
        .fw_vendor = firmware_vendor,
        .fw_revision = FW_VERSION << 16 | FW_PATCHLEVEL << 8,
-       .con_in = &efi_con_in,
-       .con_out = &efi_con_out,
-       .std_err = &efi_con_out,
        .runtime = &efi_runtime_services,
-       .boottime = &efi_boot_services,
        .nr_tables = 0,
        .tables = NULL,
 };
@@ -3644,6 +3640,15 @@ efi_status_t efi_initialize_system_table(void)
                                sizeof(struct efi_configuration_table),
                                (void **)&systab.tables);
 
+       /*
+        * These entries will be set to NULL in ExitBootServices(). To avoid
+        * relocation in SetVirtualAddressMap(), set them dynamically.
+        */
+       systab.con_in = &efi_con_in;
+       systab.con_out = &efi_con_out;
+       systab.std_err = &efi_con_out;
+       systab.boottime = &efi_boot_services;
+
        /* Set CRC32 field in table headers */
        efi_update_table_header_crc32(&systab.hdr);
        efi_update_table_header_crc32(&efi_runtime_services.hdr);
index dd91880ad6099f2de7a2daea4564a24f52317af2..c56230cad32f57af722ac32d4328720a2a17fc72 100644 (file)
@@ -408,22 +408,6 @@ static const struct efi_runtime_detach_list_struct efi_runtime_detach_list[] = {
        }, {
                .ptr = &efi_runtime_services.set_time,
                .patchto = &efi_set_time,
-       }, {
-               /* Clean up system table */
-               .ptr = &systab.con_in,
-               .patchto = NULL,
-       }, {
-               /* Clean up system table */
-               .ptr = &systab.con_out,
-               .patchto = NULL,
-       }, {
-               /* Clean up system table */
-               .ptr = &systab.std_err,
-               .patchto = NULL,
-       }, {
-               /* Clean up system table */
-               .ptr = &systab.boottime,
-               .patchto = NULL,
        }, {
                .ptr = &efi_runtime_services.get_variable,
                .patchto = &efi_device_error,