mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-02-16 14:08:45 +00:00
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>
This commit is contained in:
parent
0b386537a5
commit
640adadf81
3 changed files with 35 additions and 4 deletions
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue