efi_loader: calculate crc32 for EFI tables

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>
lime2-spi
Heinrich Schuchardt 7 years ago committed by Alexander Graf
parent 0b386537a5
commit 640adadf81
  1. 5
      cmd/bootefi.c
  2. 2
      include/efi_loader.h
  3. 32
      lib/efi_loader/efi_boottime.c

@ -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)

@ -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 */

@ -164,6 +164,18 @@ const char *__efi_nesting_dec(void)
}
/**
* 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
* @check_tpl: check the TPL level
@ -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;
}

Loading…
Cancel
Save