mirror of
https://xff.cz/git/u-boot/
synced 2025-09-26 21:11:18 +02: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:
committed by
Alexander Graf
parent
0b386537a5
commit
640adadf81
@@ -44,6 +44,11 @@ efi_status_t efi_init_obj_list(void)
|
|||||||
if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
|
if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
|
||||||
return efi_obj_list_initialized;
|
return efi_obj_list_initialized;
|
||||||
|
|
||||||
|
/* Initialize system table */
|
||||||
|
ret = efi_initialize_system_table();
|
||||||
|
if (ret != EFI_SUCCESS)
|
||||||
|
goto out;
|
||||||
|
|
||||||
/* Initialize EFI driver uclass */
|
/* Initialize EFI driver uclass */
|
||||||
ret = efi_driver_init();
|
ret = efi_driver_init();
|
||||||
if (ret != EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
|
@@ -202,6 +202,8 @@ extern struct list_head efi_obj_list;
|
|||||||
/* List of all events */
|
/* List of all events */
|
||||||
extern struct list_head efi_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 */
|
/* Called by bootefi to make console interface available */
|
||||||
int efi_console_register(void);
|
int efi_console_register(void);
|
||||||
/* Called by bootefi to make all disk storage accessible as EFI objects */
|
/* 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);
|
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
|
* efi_queue_event() - queue an EFI event
|
||||||
* @event: event to signal
|
* @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;
|
systab.boottime = NULL;
|
||||||
|
|
||||||
/* Recalculate CRC32 */
|
/* Recalculate CRC32 */
|
||||||
systab.hdr.crc32 = 0;
|
efi_update_table_header_crc32(&systab.hdr);
|
||||||
systab.hdr.crc32 = crc32(0, (const unsigned char *)&systab,
|
|
||||||
sizeof(struct efi_system_table));
|
|
||||||
|
|
||||||
/* Give the payload some time to boot */
|
/* Give the payload some time to boot */
|
||||||
efi_set_watchdog(0);
|
efi_set_watchdog(0);
|
||||||
@@ -3056,7 +3066,7 @@ out:
|
|||||||
return EFI_EXIT(r);
|
return EFI_EXIT(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct efi_boot_services efi_boot_services = {
|
static struct efi_boot_services efi_boot_services = {
|
||||||
.hdr = {
|
.hdr = {
|
||||||
.signature = EFI_BOOT_SERVICES_SIGNATURE,
|
.signature = EFI_BOOT_SERVICES_SIGNATURE,
|
||||||
.revision = EFI_SPECIFICATION_VERSION,
|
.revision = EFI_SPECIFICATION_VERSION,
|
||||||
@@ -3128,3 +3138,17 @@ struct efi_system_table __efi_runtime_data systab = {
|
|||||||
.nr_tables = 0,
|
.nr_tables = 0,
|
||||||
.tables = (void *)efi_conf_table,
|
.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;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user