summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2024-09-11 10:09:53 +0200
committerGitHub <noreply@github.com>2024-09-11 10:09:53 +0200
commita5d0f74e623634efdc54549d2b04a9d6e17ce5ee (patch)
treed90f02f4732cc9c85b2086f79c06b685804a719e
parentChange OS X to macOS in BOOT.md (#34358) (diff)
parentstub: add StubDevicePartUUID/StubImageIdentifier (diff)
downloadsystemd-a5d0f74e623634efdc54549d2b04a9d6e17ce5ee.tar.xz
systemd-a5d0f74e623634efdc54549d2b04a9d6e17ce5ee.zip
Merge pull request #34348 from poettering/stub-efivar-tweaks
sd-stub: report stub location in efi vars
-rw-r--r--man/systemd-boot.xml27
-rw-r--r--man/systemd-stub.xml31
-rw-r--r--src/boot/bootctl-status.c5
-rw-r--r--src/boot/efi/export-vars.c7
-rw-r--r--src/boot/efi/stub.c13
-rw-r--r--src/fundamental/efivars-fundamental.h1
6 files changed, 63 insertions, 21 deletions
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 @@
<varlistentry>
<term><varname>LoaderDevicePartUUID</varname></term>
- <listitem><para>Contains the partition UUID of the EFI System Partition the boot loader was run from. Set by
- the boot
- loader. <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
- uses this information to automatically find the disk booted from, in order to discover various other partitions
- on the same disk automatically.</para>
+ <listitem><para>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
+ <command>systemd-stub</command> will set this too, if not set yet, to support systems that directly
+ boot into a unified kernel image, bypassing any boot loader.)
+ <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ uses this information to automatically find the disk booted from, in order to discover various other
+ partitions on the same disk automatically.</para>
- <xi:include href="version-info.xml" xpointer="v240"/></listitem>
+ <xi:include href="version-info.xml" xpointer="v220"/></listitem>
</varlistentry>
<varlistentry>
@@ -516,12 +518,15 @@
<varlistentry>
<term><varname>LoaderImageIdentifier</varname></term>
- <listitem><para>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
- <citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> to view this
- data.</para>
+ <listitem><para>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
+ <varname>LoaderDevicePartUUID</varname>, see above). Set by the boot loader. (Note that
+ <command>systemd-stub</command> will set this too, if not set yet, to support systems that directly
+ boot into a unified kernel image, bypassing any boot loader.) Use
+ <citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> to view
+ this data.</para>
- <xi:include href="version-info.xml" xpointer="v240"/></listitem>
+ <xi:include href="version-info.xml" xpointer="v220"/></listitem>
</varlistentry>
<varlistentry>
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 @@
<varlistentry>
<term><varname>LoaderDevicePartUUID</varname></term>
- <listitem><para>Contains the partition UUID of the EFI System Partition the EFI image was run
- from. <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ <listitem><para>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 <command>systemd-stub</command>. 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.
+ <citerefentry><refentrytitle>systemd-gpt-auto-generator</refentrytitle><manvolnum>8</manvolnum></citerefentry>
uses this information to automatically find the disk booted from, in order to discover various other
partitions on the same disk automatically.</para>
- <xi:include href="version-info.xml" xpointer="v250"/></listitem>
+ <xi:include href="version-info.xml" xpointer="v224"/></listitem>
</varlistentry>
<varlistentry>
@@ -481,12 +485,27 @@
<varlistentry>
<term><varname>LoaderImageIdentifier</varname></term>
- <listitem><para>The path of EFI executable, relative to the EFI System Partition's root
- directory. Use
+ <listitem><para>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
+ <varname>LoaderDevicePartUUID</varname>, 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
<citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> to view
this data.</para>
- <xi:include href="version-info.xml" xpointer="v250"/></listitem>
+ <xi:include href="version-info.xml" xpointer="v237"/></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><varname>StubDevicePartUUID</varname></term>
+ <term><varname>StubImageIdentifier</varname></term>
+
+ <listitem><para>Similar to <varname>LoaderDevicePartUUID</varname> and
+ <varname>StubImageIdentifier</varname>, 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.</para>
+
+ <xi:include href="version-info.xml" xpointer="v257"/></listitem>
</varlistentry>
<varlistentry>
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,