diff --git a/man/systemd-boot.xml b/man/systemd-boot.xml
index cc4504926c..0da919b127 100644
--- a/man/systemd-boot.xml
+++ b/man/systemd-boot.xml
@@ -429,13 +429,15 @@
LoaderDevicePartUUID
- Contains the partition UUID of the EFI System Partition the boot loader was run from. Set by
- the boot
- loader. systemd-gpt-auto-generator8
- uses this information to automatically find the disk booted from, in order to discover various other partitions
- on the same disk automatically.
+ Contains the partition UUID of the partition the boot loader has been started from on
+ the current boot (usually a EFI System Partition). Set by the boot loader. (Note that
+ systemd-stub will set this too, if not set yet, to support systems that directly
+ boot into a unified kernel image, bypassing any boot loader.)
+ systemd-gpt-auto-generator8
+ uses this information to automatically find the disk booted from, in order to discover various other
+ partitions on the same disk automatically.
-
+
@@ -516,12 +518,15 @@
LoaderImageIdentifier
- The path of executable of the boot loader used for the current boot, relative to the EFI System
- Partition's root directory. Set by the boot loader. Use
- bootctl1 to view this
- data.
+ The file system path to the EFI executable of the boot loader for the current boot,
+ relative to the partition's root directory (i.e. relative to the partition indicated by
+ LoaderDevicePartUUID, see above). Set by the boot loader. (Note that
+ systemd-stub will set this too, if not set yet, to support systems that directly
+ boot into a unified kernel image, bypassing any boot loader.) Use
+ bootctl1 to view
+ this data.
-
+
diff --git a/man/systemd-stub.xml b/man/systemd-stub.xml
index 9f87f19f4c..dbc85d837a 100644
--- a/man/systemd-stub.xml
+++ b/man/systemd-stub.xml
@@ -459,12 +459,16 @@
LoaderDevicePartUUID
- Contains the partition UUID of the EFI System Partition the EFI image was run
- from. systemd-gpt-auto-generator8
+ Contains the partition UUID of the partition the boot loader has been started from on
+ the current boot (usually a EFI System Partition). If already set by the boot loader, this will
+ remain untouched by systemd-stub. If not set yet, this will be set to the
+ partition UUID of the partition the unified kernel is started from, in order to support systems that
+ directly boot into a unified kernel image, bypassing any boot loader.
+ systemd-gpt-auto-generator8
uses this information to automatically find the disk booted from, in order to discover various other
partitions on the same disk automatically.
-
+
@@ -481,12 +485,27 @@
LoaderImageIdentifier
- The path of EFI executable, relative to the EFI System Partition's root
- directory. Use
+ The file system path to the EFI executable of the boot loader for the current boot,
+ relative to the partition's root directory (i.e. relative to the partition indicated by
+ LoaderDevicePartUUID, see above). If not set yet, this will be set to the file
+ system path of the EFI executable of the booted unified kernel, in order to support systems that
+ directly boot into a unified kernel image, bypassing any boot loader. Use
bootctl1 to view
this data.
-
+
+
+
+
+ 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.
+
+
diff --git a/src/boot/bootctl-status.c b/src/boot/bootctl-status.c
index 113d27410f..192fddbf5e 100644
--- a/src/boot/bootctl-status.c
+++ b/src/boot/bootctl-status.c
@@ -378,12 +378,13 @@ int verb_status(int argc, char *argv[], void *userdata) {
{ EFI_LOADER_FEATURE_SECUREBOOT_ENROLL, "Enroll SecureBoot keys" },
{ EFI_LOADER_FEATURE_RETAIN_SHIM, "Retain SHIM protocols" },
{ EFI_LOADER_FEATURE_MENU_DISABLE, "Menu can be disabled" },
+ { EFI_LOADER_FEATURE_MULTI_PROFILE_UKI, "Multi-Profile UKIs are supported" },
};
static const struct {
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" },
@@ -392,6 +393,8 @@ int verb_status(int argc, char *argv[], void *userdata) {
{ EFI_STUB_FEATURE_CMDLINE_ADDONS, "Pick up .cmdline from addons" },
{ 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/export-vars.c b/src/boot/efi/export-vars.c
index 3f59922a7e..12fbd10b05 100644
--- a/src/boot/efi/export-vars.c
+++ b/src/boot/efi/export-vars.c
@@ -10,7 +10,8 @@ void export_common_variables(EFI_LOADED_IMAGE_PROTOCOL *loaded_image) {
assert(loaded_image);
/* Export the device path this image is started from, if it's not set yet */
- if (efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", NULL, NULL) != EFI_SUCCESS) {
+ if (loaded_image->DeviceHandle &&
+ efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", NULL, NULL) != EFI_SUCCESS) {
_cleanup_free_ char16_t *uuid = disk_get_part_uuid(loaded_image->DeviceHandle);
if (uuid)
efivar_set_str16(MAKE_GUID_PTR(LOADER), u"LoaderDevicePartUUID", uuid, 0);
@@ -22,8 +23,8 @@ void export_common_variables(EFI_LOADED_IMAGE_PROTOCOL *loaded_image) {
* in which case there's simple nothing to set for us. (The UEFI spec doesn't really say who's wrong
* here, i.e. whether FilePath may be NULL or not, hence handle this gracefully and check if FilePath
* is non-NULL explicitly.) */
- if (efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderImageIdentifier", NULL, NULL) != EFI_SUCCESS &&
- loaded_image->FilePath) {
+ if (loaded_image->FilePath &&
+ efivar_get_raw(MAKE_GUID_PTR(LOADER), u"LoaderImageIdentifier", NULL, NULL) != EFI_SUCCESS) {
_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"LoaderImageIdentifier", s, 0);
diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c
index 0ace97013f..a5b1c50acb 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 e18d59ff60..f002e81b53 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,