diff --git a/man/systemd-stub.xml b/man/systemd-stub.xml index d2590e509e8..dbc85d837a9 100644 --- a/man/systemd-stub.xml +++ b/man/systemd-stub.xml @@ -496,6 +496,18 @@ + + StubDevicePartUUID + StubImageIdentifier + + Similar to LoaderDevicePartUUID and + StubImageIdentifier, but indicates the location of the unified kernel image EFI + binary rather than the location of the boot loader binary, regardless if booted via a boot loader + or not. + + + + StubInfo diff --git a/src/boot/bootctl-status.c b/src/boot/bootctl-status.c index 386f03e0dc8..192fddbf5e7 100644 --- a/src/boot/bootctl-status.c +++ b/src/boot/bootctl-status.c @@ -384,7 +384,7 @@ int verb_status(int argc, char *argv[], void *userdata) { uint64_t flag; const char *name; } stub_flags[] = { - { EFI_STUB_FEATURE_REPORT_BOOT_PARTITION, "Stub sets ESP information" }, + { EFI_STUB_FEATURE_REPORT_BOOT_PARTITION, "Stub sets loader partition information" }, { EFI_STUB_FEATURE_PICK_UP_CREDENTIALS, "Picks up credentials from boot partition" }, { EFI_STUB_FEATURE_PICK_UP_SYSEXTS, "Picks up system extension images from boot partition" }, { EFI_STUB_FEATURE_PICK_UP_CONFEXTS, "Picks up configuration extension images from boot partition" }, @@ -394,6 +394,7 @@ int verb_status(int argc, char *argv[], void *userdata) { { EFI_STUB_FEATURE_CMDLINE_SMBIOS, "Pick up .cmdline from SMBIOS Type 11" }, { EFI_STUB_FEATURE_DEVICETREE_ADDONS, "Pick up .dtb from addons" }, { EFI_STUB_FEATURE_MULTI_PROFILE_UKI, "Stub understands profile selector" }, + { EFI_STUB_FEATURE_REPORT_STUB_PARTITION, "Stub sets stub partition information" }, }; _cleanup_free_ char *fw_type = NULL, *fw_info = NULL, *loader = NULL, *loader_path = NULL, *stub = NULL; sd_id128_t loader_part_uuid = SD_ID128_NULL; diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c index 0ace97013f0..a5b1c50acbb 100644 --- a/src/boot/efi/stub.c +++ b/src/boot/efi/stub.c @@ -153,6 +153,7 @@ static void export_stub_variables(EFI_LOADED_IMAGE_PROTOCOL *loaded_image, unsig EFI_STUB_FEATURE_CMDLINE_SMBIOS | /* We support extending kernel cmdline from SMBIOS Type #11 */ EFI_STUB_FEATURE_DEVICETREE_ADDONS | /* We pick up .dtb addons */ EFI_STUB_FEATURE_MULTI_PROFILE_UKI | /* We grok the "@1" profile command line argument */ + EFI_STUB_FEATURE_REPORT_STUB_PARTITION | /* We set StubDevicePartUUID + StubImageIdentifier */ 0; assert(loaded_image); @@ -164,6 +165,18 @@ static void export_stub_variables(EFI_LOADED_IMAGE_PROTOCOL *loaded_image, unsig (void) efivar_set_uint64_le(MAKE_GUID_PTR(LOADER), u"StubFeatures", stub_features, 0); (void) efivar_set_uint64_str16(MAKE_GUID_PTR(LOADER), u"StubProfile", profile, 0); + + if (loaded_image->DeviceHandle) { + _cleanup_free_ char16_t *uuid = disk_get_part_uuid(loaded_image->DeviceHandle); + if (uuid) + efivar_set_str16(MAKE_GUID_PTR(LOADER), u"StubDevicePartUUID", uuid, 0); + } + + if (loaded_image->FilePath) { + _cleanup_free_ char16_t *s = NULL; + if (device_path_to_str(loaded_image->FilePath, &s) == EFI_SUCCESS) + efivar_set_str16(MAKE_GUID_PTR(LOADER), u"StubImageIdentifier", s, 0); + } } static bool parse_profile_from_cmdline(char16_t **cmdline, unsigned *ret_profile) { diff --git a/src/fundamental/efivars-fundamental.h b/src/fundamental/efivars-fundamental.h index e18d59ff604..f002e81b532 100644 --- a/src/fundamental/efivars-fundamental.h +++ b/src/fundamental/efivars-fundamental.h @@ -36,6 +36,7 @@ #define EFI_STUB_FEATURE_DEVICETREE_ADDONS (UINT64_C(1) << 7) #define EFI_STUB_FEATURE_PICK_UP_CONFEXTS (UINT64_C(1) << 8) #define EFI_STUB_FEATURE_MULTI_PROFILE_UKI (UINT64_C(1) << 9) +#define EFI_STUB_FEATURE_REPORT_STUB_PARTITION (UINT64_C(1) << 10) typedef enum SecureBootMode { SECURE_BOOT_UNSUPPORTED,