96 lines
3.7 KiB
Diff
96 lines
3.7 KiB
Diff
From bbf8235eb297047521ac83b594389d70ecfb38df Mon Sep 17 00:00:00 2001
|
|
From: Lennart Poettering <lennart@poettering.net>
|
|
Date: Wed, 14 Dec 2022 18:48:52 +0100
|
|
Subject: [PATCH] efi: add common implementation for loop finding EFI
|
|
configuration tables
|
|
|
|
(cherry picked from commit a04709c1ac81b28b1a4144166991ac56be94cfcd)
|
|
|
|
Related: RHEL-16952
|
|
---
|
|
src/boot/efi/devicetree.c | 11 ++---------
|
|
src/boot/efi/random-seed.c | 6 +-----
|
|
src/boot/efi/util.c | 8 ++++++++
|
|
src/boot/efi/util.h | 2 ++
|
|
4 files changed, 13 insertions(+), 14 deletions(-)
|
|
|
|
diff --git a/src/boot/efi/devicetree.c b/src/boot/efi/devicetree.c
|
|
index daba5582aa..12015fce6b 100644
|
|
--- a/src/boot/efi/devicetree.c
|
|
+++ b/src/boot/efi/devicetree.c
|
|
@@ -8,13 +8,6 @@
|
|
|
|
#define FDT_V1_SIZE (7*4)
|
|
|
|
-static void *get_dtb_table(void) {
|
|
- for (UINTN i = 0; i < ST->NumberOfTableEntries; i++)
|
|
- if (efi_guid_equal(&ST->ConfigurationTable[i].VendorGuid, &EfiDtbTableGuid))
|
|
- return ST->ConfigurationTable[i].VendorTable;
|
|
- return NULL;
|
|
-}
|
|
-
|
|
static EFI_STATUS devicetree_allocate(struct devicetree_state *state, UINTN size) {
|
|
UINTN pages = DIV_ROUND_UP(size, EFI_PAGE_SIZE);
|
|
EFI_STATUS err;
|
|
@@ -81,7 +74,7 @@ EFI_STATUS devicetree_install(struct devicetree_state *state, EFI_FILE *root_dir
|
|
assert(root_dir);
|
|
assert(name);
|
|
|
|
- state->orig = get_dtb_table();
|
|
+ state->orig = find_configuration_table(&EfiDtbTableGuid);
|
|
if (!state->orig)
|
|
return EFI_UNSUPPORTED;
|
|
|
|
@@ -121,7 +114,7 @@ EFI_STATUS devicetree_install_from_memory(struct devicetree_state *state,
|
|
assert(state);
|
|
assert(dtb_buffer && dtb_length > 0);
|
|
|
|
- state->orig = get_dtb_table();
|
|
+ state->orig = find_configuration_table(&EfiDtbTableGuid);
|
|
if (!state->orig)
|
|
return EFI_UNSUPPORTED;
|
|
|
|
diff --git a/src/boot/efi/random-seed.c b/src/boot/efi/random-seed.c
|
|
index 6070145778..332f537d91 100644
|
|
--- a/src/boot/efi/random-seed.c
|
|
+++ b/src/boot/efi/random-seed.c
|
|
@@ -146,11 +146,7 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) {
|
|
/* Some basic domain separation in case somebody uses this data elsewhere */
|
|
sha256_process_bytes(HASH_LABEL, sizeof(HASH_LABEL) - 1, &hash);
|
|
|
|
- for (size_t i = 0; i < ST->NumberOfTableEntries; ++i)
|
|
- if (efi_guid_equal(&ST->ConfigurationTable[i].VendorGuid, &(const EFI_GUID) LINUX_EFI_RANDOM_SEED_TABLE_GUID)) {
|
|
- previous_seed_table = ST->ConfigurationTable[i].VendorTable;
|
|
- break;
|
|
- }
|
|
+ previous_seed_table = find_configuration_table(&(const EFI_GUID) LINUX_EFI_RANDOM_SEED_TABLE_GUID);
|
|
if (!previous_seed_table) {
|
|
size = 0;
|
|
sha256_process_bytes(&size, sizeof(size), &hash);
|
|
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
|
|
index 1f07fbc38c..0a6bb59dce 100644
|
|
--- a/src/boot/efi/util.c
|
|
+++ b/src/boot/efi/util.c
|
|
@@ -747,3 +747,11 @@ bool in_hypervisor(void) {
|
|
return !!(ecx & 0x80000000U);
|
|
}
|
|
#endif
|
|
+
|
|
+void *find_configuration_table(const EFI_GUID *guid) {
|
|
+ for (UINTN i = 0; i < ST->NumberOfTableEntries; i++)
|
|
+ if (efi_guid_equal(&ST->ConfigurationTable[i].VendorGuid, guid))
|
|
+ return ST->ConfigurationTable[i].VendorTable;
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
|
|
index a076f48dba..88fc60c17e 100644
|
|
--- a/src/boot/efi/util.h
|
|
+++ b/src/boot/efi/util.h
|
|
@@ -221,3 +221,5 @@ static inline bool in_hypervisor(void) {
|
|
static inline bool efi_guid_equal(const EFI_GUID *a, const EFI_GUID *b) {
|
|
return memcmp(a, b, sizeof(EFI_GUID)) == 0;
|
|
}
|
|
+
|
|
+void *find_configuration_table(const EFI_GUID *guid);
|