From: Lennart Poettering Date: Wed, 26 Jun 2024 08:48:49 +0000 (+0200) Subject: stub: split out call that loads embedded device tree X-Git-Tag: v257-rc1~1041^2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dcac1e4a9ba231d8e88d36dbecf3d8b6c9b07cb2;p=thirdparty%2Fsystemd.git stub: split out call that loads embedded device tree --- diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c index ae5d783e96a..2bea86ff99a 100644 --- a/src/boot/efi/stub.c +++ b/src/boot/efi/stub.c @@ -818,13 +818,34 @@ static void export_pcr_variables( (void) efivar_set_uint_string(MAKE_GUID_PTR(LOADER), u"StubPcrInitRDConfExts", TPM2_PCR_KERNEL_CONFIG, 0); } +static void install_embedded_devicetree( + EFI_LOADED_IMAGE_PROTOCOL *loaded_image, + const PeSectionVector sections[static _UNIFIED_SECTION_MAX], + struct devicetree_state *dt_state) { + + EFI_STATUS err; + + assert(loaded_image); + assert(sections); + assert(dt_state); + + if (!PE_SECTION_VECTOR_IS_SET(sections + UNIFIED_SECTION_DTB)) + return; + + err = devicetree_install_from_memory( + dt_state, + (const uint8_t*) loaded_image->ImageBase + sections[UNIFIED_SECTION_DTB].memory_offset, + sections[UNIFIED_SECTION_DTB].size); + if (err != EFI_SUCCESS) + log_error_status(err, "Error loading embedded devicetree, igoring: %m"); +} + static EFI_STATUS run(EFI_HANDLE image) { _cleanup_(initrds_free) struct iovec initrds[_INITRD_MAX] = {}; void **dt_bases_addons_global = NULL, **dt_bases_addons_uki = NULL; char16_t **dt_filenames_addons_global = NULL, **dt_filenames_addons_uki = NULL; _cleanup_free_ size_t *dt_sizes_addons_global = NULL, *dt_sizes_addons_uki = NULL; - size_t dt_size = 0, n_dts_addons_global = 0, n_dts_addons_uki = 0; - EFI_PHYSICAL_ADDRESS dt_base = 0; + size_t n_dts_addons_global = 0, n_dts_addons_uki = 0; _cleanup_(devicetree_cleanup) struct devicetree_state dt_state = {}; EFI_LOADED_IMAGE_PROTOCOL *loaded_image; PeSectionVector sections[ELEMENTSOF(unified_sections)] = {}; @@ -920,18 +941,8 @@ static EFI_STATUS run(EFI_HANDLE image) { generate_sidecar_initrds(loaded_image, initrds, ¶meters_measured, &sysext_measured, &confext_measured); - if (PE_SECTION_VECTOR_IS_SET(sections + UNIFIED_SECTION_DTB)) { - dt_size = sections[UNIFIED_SECTION_DTB].size; - dt_base = POINTER_TO_PHYSICAL_ADDRESS(loaded_image->ImageBase) + sections[UNIFIED_SECTION_DTB].memory_offset; - } - /* First load the base device tree, then fix it up using addons - global first, then per-UKI. */ - if (dt_size > 0) { - err = devicetree_install_from_memory( - &dt_state, PHYSICAL_ADDRESS_TO_POINTER(dt_base), dt_size); - if (err != EFI_SUCCESS) - log_error_status(err, "Error loading embedded devicetree: %m"); - } + install_embedded_devicetree(loaded_image, sections, &dt_state); int dtb_measured; dtb_install_addons(&dt_state,