efi_loader: calculate crc32 for EFI tables
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 28 Jun 2018 10:45:31 +0000 (12:45 +0200)
committerAlexander Graf <agraf@suse.de>
Wed, 25 Jul 2018 13:00:24 +0000 (15:00 +0200)
For the boot and runtime services tables and for the system table the
crc32 has to be set in the header.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
cmd/bootefi.c
include/efi_loader.h
lib/efi_loader/efi_boottime.c

index 4097277c9ccc440a3eab659f3c580737dba426f8..e57e70fc61227df4f56c55b42dcf466efcc4751a 100644 (file)
@@ -44,6 +44,11 @@ efi_status_t efi_init_obj_list(void)
        if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
                return efi_obj_list_initialized;
 
+       /* Initialize system table */
+       ret = efi_initialize_system_table();
+       if (ret != EFI_SUCCESS)
+               goto out;
+
        /* Initialize EFI driver uclass */
        ret = efi_driver_init();
        if (ret != EFI_SUCCESS)
index 3cbec15c29734037398da6c8cfa9b0431b744a5f..06f74e2716ca11ccbb529ea49999e873e7c7eb75 100644 (file)
@@ -202,6 +202,8 @@ extern struct list_head efi_obj_list;
 /* List of all events */
 extern struct list_head efi_events;
 
+/* Called by bootefi to initialize runtime */
+efi_status_t efi_initialize_system_table(void);
 /* Called by bootefi to make console interface available */
 int efi_console_register(void);
 /* Called by bootefi to make all disk storage accessible as EFI objects */
index c5d45dcc954e08e81f9e058bfbfbfa4d9d4343d6..5fea8b1dbd52f49bc98a638fbffcafc929920862 100644 (file)
@@ -163,6 +163,18 @@ const char *__efi_nesting_dec(void)
        return indent_string(--nesting_level);
 }
 
+/**
+ * efi_update_table_header_crc32() - Update CRC32 in table header
+ *
+ * @table:     EFI table
+ */
+static void efi_update_table_header_crc32(struct efi_table_hdr *table)
+{
+       table->crc32 = 0;
+       table->crc32 = crc32(0, (const unsigned char *)table,
+                            table->headersize);
+}
+
 /**
  * efi_queue_event() - queue an EFI event
  * @event:     event to signal
@@ -1901,9 +1913,7 @@ static efi_status_t EFIAPI efi_exit_boot_services(efi_handle_t image_handle,
        systab.boottime = NULL;
 
        /* Recalculate CRC32 */
-       systab.hdr.crc32 = 0;
-       systab.hdr.crc32 = crc32(0, (const unsigned char *)&systab,
-                                sizeof(struct efi_system_table));
+       efi_update_table_header_crc32(&systab.hdr);
 
        /* Give the payload some time to boot */
        efi_set_watchdog(0);
@@ -3056,7 +3066,7 @@ out:
        return EFI_EXIT(r);
 }
 
-static const struct efi_boot_services efi_boot_services = {
+static struct efi_boot_services efi_boot_services = {
        .hdr = {
                .signature = EFI_BOOT_SERVICES_SIGNATURE,
                .revision = EFI_SPECIFICATION_VERSION,
@@ -3128,3 +3138,17 @@ struct efi_system_table __efi_runtime_data systab = {
        .nr_tables = 0,
        .tables = (void *)efi_conf_table,
 };
+
+/**
+ * efi_initialize_system_table() - Initialize system table
+ *
+ * Return Value:        status code
+ */
+efi_status_t efi_initialize_system_table(void)
+{
+       /* Set crc32 field in table headers */
+       efi_update_table_header_crc32(&systab.hdr);
+       efi_update_table_header_crc32(&efi_runtime_services.hdr);
+       efi_update_table_header_crc32(&efi_boot_services.hdr);
+       return EFI_SUCCESS;
+}