summaryrefslogtreecommitdiff
path: root/src/boot/efi
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-10-22 16:51:46 +0200
committerLennart Poettering <lennart@poettering.net>2018-11-16 15:47:18 +0100
commit5dd5f7cfa878a329fce5672a244ab190bfc8fcd9 (patch)
tree7e358f6b8d4c939642dbad97bebf96269f0d37df /src/boot/efi
parent95a18e91db59028cf5e1848834fa754a8dab5b23 (diff)
downloadsystemd-5dd5f7cfa878a329fce5672a244ab190bfc8fcd9.tar.gz
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.
Diffstat (limited to 'src/boot/efi')
-rw-r--r--src/boot/efi/boot.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index b2fa8f1e2a..909cf914a6 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)) {