From: Lennart Poettering Date: Mon, 22 Oct 2018 14:51:46 +0000 (+0200) Subject: sd-boot: add new EFI variable exposing feature set of boot loader X-Git-Tag: v240~305^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5dd5f7cfa878a329fce5672a244ab190bfc8fcd9;p=thirdparty%2Fsystemd.git 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. --- diff --git a/man/systemd-boot.xml b/man/systemd-boot.xml index e1d1910c910..e5374269706 100644 --- a/man/systemd-boot.xml +++ b/man/systemd-boot.xml @@ -301,6 +301,14 @@ loader. + + LoaderFeatures + + A set of flags indicating the features the boot loader supports. Set by the boot loader. Use + bootctl1 to view this + data. + + LoaderFirmwareInfo LoaderFirmwareType diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index b2fa8f1e2a5..909cf914a63 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -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) { + 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; CHAR8 *b; 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); 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, image, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (EFI_ERROR(err)) {