Skip to content

Commit badc619

Browse files
tlendackyIngo Molnar
authored andcommitted
efi/x86: Add RNG seed EFI table to unencrypted mapping check
When booting with SME active, EFI tables must be mapped unencrypted since they were built by UEFI in unencrypted memory. Update the list of tables to be checked during early_memremap() processing to account for the EFI RNG seed table. Signed-off-by: Tom Lendacky <[email protected]> Signed-off-by: Ard Biesheuvel <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Cc: [email protected] Cc: Ingo Molnar <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Heinrich Schuchardt <[email protected]> Link: https://lore.kernel.org/r/b64385fc13e5d7ad4b459216524f138e7879234f.1582662842.git.thomas.lendacky@amd.com Link: https://lore.kernel.org/r/[email protected]
1 parent f10e80a commit badc619

File tree

3 files changed

+13
-8
lines changed

3 files changed

+13
-8
lines changed

arch/x86/platform/efi/efi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ static const unsigned long * const efi_tables[] = {
9090
#endif
9191
&efi.tpm_log,
9292
&efi.tpm_final_log,
93+
&efi_rng_seed,
9394
};
9495

9596
u64 efi_setup; /* efi setup_data physical address */

drivers/firmware/efi/efi.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct efi __read_mostly efi = {
4545
};
4646
EXPORT_SYMBOL(efi);
4747

48-
static unsigned long __ro_after_init rng_seed = EFI_INVALID_TABLE_ADDR;
48+
unsigned long __ro_after_init efi_rng_seed = EFI_INVALID_TABLE_ADDR;
4949
static unsigned long __initdata mem_reserve = EFI_INVALID_TABLE_ADDR;
5050
static unsigned long __initdata rt_prop = EFI_INVALID_TABLE_ADDR;
5151

@@ -451,7 +451,7 @@ static const efi_config_table_type_t common_tables[] __initconst = {
451451
{SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
452452
{EFI_SYSTEM_RESOURCE_TABLE_GUID, "ESRT", &efi.esrt},
453453
{EFI_MEMORY_ATTRIBUTES_TABLE_GUID, "MEMATTR", &efi_mem_attr_table},
454-
{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &rng_seed},
454+
{LINUX_EFI_RANDOM_SEED_TABLE_GUID, "RNG", &efi_rng_seed},
455455
{LINUX_EFI_TPM_EVENT_LOG_GUID, "TPMEventLog", &efi.tpm_log},
456456
{LINUX_EFI_TPM_FINAL_LOG_GUID, "TPMFinalLog", &efi.tpm_final_log},
457457
{LINUX_EFI_MEMRESERVE_TABLE_GUID, "MEMRESERVE", &mem_reserve},
@@ -519,19 +519,20 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
519519
pr_cont("\n");
520520
set_bit(EFI_CONFIG_TABLES, &efi.flags);
521521

522-
if (rng_seed != EFI_INVALID_TABLE_ADDR) {
522+
if (efi_rng_seed != EFI_INVALID_TABLE_ADDR) {
523523
struct linux_efi_random_seed *seed;
524524
u32 size = 0;
525525

526-
seed = early_memremap(rng_seed, sizeof(*seed));
526+
seed = early_memremap(efi_rng_seed, sizeof(*seed));
527527
if (seed != NULL) {
528528
size = seed->size;
529529
early_memunmap(seed, sizeof(*seed));
530530
} else {
531531
pr_err("Could not map UEFI random seed!\n");
532532
}
533533
if (size > 0) {
534-
seed = early_memremap(rng_seed, sizeof(*seed) + size);
534+
seed = early_memremap(efi_rng_seed,
535+
sizeof(*seed) + size);
535536
if (seed != NULL) {
536537
pr_notice("seeding entropy pool\n");
537538
add_bootloader_randomness(seed->bits, seed->size);
@@ -923,15 +924,16 @@ static int update_efi_random_seed(struct notifier_block *nb,
923924
if (!kexec_in_progress)
924925
return NOTIFY_DONE;
925926

926-
seed = memremap(rng_seed, sizeof(*seed), MEMREMAP_WB);
927+
seed = memremap(efi_rng_seed, sizeof(*seed), MEMREMAP_WB);
927928
if (seed != NULL) {
928929
size = min(seed->size, EFI_RANDOM_SEED_SIZE);
929930
memunmap(seed);
930931
} else {
931932
pr_err("Could not map UEFI random seed!\n");
932933
}
933934
if (size > 0) {
934-
seed = memremap(rng_seed, sizeof(*seed) + size, MEMREMAP_WB);
935+
seed = memremap(efi_rng_seed, sizeof(*seed) + size,
936+
MEMREMAP_WB);
935937
if (seed != NULL) {
936938
seed->size = size;
937939
get_random_bytes(seed->bits, seed->size);
@@ -949,7 +951,7 @@ static struct notifier_block efi_random_seed_nb = {
949951

950952
static int __init register_update_efi_random_seed(void)
951953
{
952-
if (rng_seed == EFI_INVALID_TABLE_ADDR)
954+
if (efi_rng_seed == EFI_INVALID_TABLE_ADDR)
953955
return 0;
954956
return register_reboot_notifier(&efi_random_seed_nb);
955957
}

include/linux/efi.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,8 @@ typedef struct {
526526
efi_time_t time_of_revocation;
527527
} efi_cert_x509_sha256_t;
528528

529+
extern unsigned long __ro_after_init efi_rng_seed; /* RNG Seed table */
530+
529531
/*
530532
* All runtime access to EFI goes through this structure:
531533
*/

0 commit comments

Comments
 (0)