sd-boot: add new EFI variable exposing feature set of boot loader

We keep adding new features, let's advertise to the host OS what these
are in a new variable LoaderFeatures.

It works a bit like OsIndicationsSupported, but is about Loader
features.
This commit is contained in:
Lennart Poettering 2018-10-22 16:51:46 +02:00
parent 95a18e91db
commit 5dd5f7cfa8
2 changed files with 18 additions and 0 deletions

View File

@ -301,6 +301,14 @@
loader.</para></listitem> loader.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><varname>LoaderFeatures</varname></term>
<listitem><para>A set of flags indicating the features the boot loader supports. Set by the boot loader. Use
<citerefentry><refentrytitle>bootctl</refentrytitle><manvolnum>1</manvolnum></citerefentry> to view this
data.</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><varname>LoaderFirmwareInfo</varname></term> <term><varname>LoaderFirmwareInfo</varname></term>
<term><varname>LoaderFirmwareType</varname></term> <term><varname>LoaderFirmwareType</varname></term>

View File

@ -2072,6 +2072,14 @@ static VOID config_write_entries_to_variable(Config *config) {
} }
EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) { EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
static const UINT64 loader_features =
(1ULL << 0) | /* I honour the LoaderConfigTimeout variable */
(1ULL << 1) | /* I honour the LoaderConfigTimeoutOneShot variable */
(1ULL << 2) | /* I honour the LoaderEntryDefault variable */
(1ULL << 3) | /* I honour the LoaderEntryOneShot variable */
(1ULL << 4) | /* I support boot counting */
0;
_cleanup_freepool_ CHAR16 *infostr = NULL, *typestr = NULL; _cleanup_freepool_ CHAR16 *infostr = NULL, *typestr = NULL;
CHAR8 *b; CHAR8 *b;
UINTN size; UINTN size;
@ -2095,6 +2103,8 @@ EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
typestr = PoolPrint(L"UEFI %d.%02d", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff); typestr = PoolPrint(L"UEFI %d.%02d", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
efivar_set(L"LoaderFirmwareType", typestr, FALSE); efivar_set(L"LoaderFirmwareType", typestr, FALSE);
(void) efivar_set_raw(&loader_guid, L"LoaderFeatures", &loader_features, sizeof(loader_features), FALSE);
err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, (VOID **)&loaded_image, err = uefi_call_wrapper(BS->OpenProtocol, 6, image, &LoadedImageProtocol, (VOID **)&loaded_image,
image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
if (EFI_ERROR(err)) { if (EFI_ERROR(err)) {