]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: enable QueryVariableInfo at runtime for file backed variables
authorIlias Apalodimas <ilias.apalodimas@linaro.org>
Thu, 25 Apr 2024 05:18:19 +0000 (08:18 +0300)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Wed, 1 May 2024 05:40:05 +0000 (07:40 +0200)
Since commit c28d32f946f0 ("efi_loader: conditionally enable SetvariableRT")
we are enabling the last bits of missing runtime services.
Add support for QueryVariableInfo which we already support at boottime
and we just need to mark some fucntions available at runtime and move
some checks around.

It's worth noting that pointer checks for maxmimum and remaining
variable storage aren't when we store variables on the RPMB, since the
Secure World backend is already performing them.

Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
lib/efi_loader/efi_runtime.c
lib/efi_loader/efi_var_common.c
lib/efi_loader/efi_variable.c
lib/efi_loader/efi_variable_tee.c
lib/efi_selftest/efi_selftest_variables_runtime.c

index 73831c527e00929d46348a9c44524604a4439339..011bcd04836d6e6b339a0c66b63deaa7c6e02e1a 100644 (file)
@@ -129,6 +129,10 @@ efi_status_t efi_init_runtime_supported(void)
                                EFI_RT_SUPPORTED_SET_VIRTUAL_ADDRESS_MAP |
                                EFI_RT_SUPPORTED_CONVERT_POINTER;
 
+       if (IS_ENABLED(CONFIG_EFI_VARIABLE_FILE_STORE))
+               rt_table->runtime_services_supported |=
+                       EFI_RT_SUPPORTED_QUERY_VARIABLE_INFO;
+
        if (IS_ENABLED(CONFIG_EFI_RT_VOLATILE_STORE)) {
                u8 s = 0;
 
index 961139f005afca4f43c06bdae7c2db7ce69c97da..ea8d2a4cf98c74413ef5148df0c881900ba3420c 100644 (file)
@@ -1,4 +1,3 @@
-// SPDX-License-Identifier: GPL-2.0+
 /*
  * UEFI runtime variable services
  *
@@ -163,11 +162,6 @@ efi_status_t EFIAPI efi_query_variable_info(
        EFI_ENTRY("%x %p %p %p", attributes, maximum_variable_storage_size,
                  remaining_variable_storage_size, maximum_variable_size);
 
-       if (!maximum_variable_storage_size ||
-           !remaining_variable_storage_size ||
-           !maximum_variable_size)
-               return EFI_EXIT(EFI_INVALID_PARAMETER);
-
        ret = efi_query_variable_info_int(attributes,
                                          maximum_variable_storage_size,
                                          remaining_variable_storage_size,
index 0cbed53d1dbf4e89410a5882e7114107dbf5df73..1cc02acb3b26287c9586f76fb10d6a91a8d99ff1 100644 (file)
@@ -406,12 +406,15 @@ efi_status_t efi_set_variable_int(const u16 *variable_name,
        return EFI_SUCCESS;
 }
 
-efi_status_t efi_query_variable_info_int(u32 attributes,
-                                        u64 *maximum_variable_storage_size,
-                                        u64 *remaining_variable_storage_size,
-                                        u64 *maximum_variable_size)
+efi_status_t __efi_runtime
+efi_query_variable_info_int(u32 attributes,
+                           u64 *maximum_variable_storage_size,
+                           u64 *remaining_variable_storage_size,
+                           u64 *maximum_variable_size)
 {
-       if (attributes == 0)
+       if (!maximum_variable_storage_size ||
+           !remaining_variable_storage_size ||
+           !maximum_variable_size || !attributes)
                return EFI_INVALID_PARAMETER;
 
        /* EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS is deprecated */
@@ -460,7 +463,17 @@ static efi_status_t __efi_runtime EFIAPI efi_query_variable_info_runtime(
                        u64 *remaining_variable_storage_size,
                        u64 *maximum_variable_size)
 {
-       return EFI_UNSUPPORTED;
+       if (!(attributes & EFI_VARIABLE_RUNTIME_ACCESS))
+               return EFI_INVALID_PARAMETER;
+       if ((attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS |
+                          EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS |
+                          EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS)))
+               return EFI_UNSUPPORTED;
+
+       return efi_query_variable_info_int(attributes,
+                                          maximum_variable_storage_size,
+                                          remaining_variable_storage_size,
+                                          maximum_variable_size);
 }
 
 /**
index 4f1aa298da13d788f0cf94e398d9d679caf47481..8b6b0a39086992a5913344896b6b2689c9f2f8ef 100644 (file)
@@ -873,6 +873,11 @@ efi_status_t efi_query_variable_info_int(u32 attributes,
        efi_status_t ret;
        u8 *comm_buf;
 
+       if (!max_variable_storage_size ||
+           !remain_variable_storage_size ||
+           !max_variable_size || !attributes)
+               return EFI_INVALID_PARAMETER;
+
        payload_size = sizeof(*mm_query_info);
        comm_buf = setup_mm_hdr((void **)&mm_query_info, payload_size,
                                SMM_VARIABLE_FUNCTION_QUERY_VARIABLE_INFO,
index afa91be62c85210e71cc5ad8e651795f455cd70e..5794a7b2d40568c5728d89627b76f95501ae3648 100644 (file)
@@ -60,9 +60,17 @@ static int execute(void)
        ret = runtime->query_variable_info(EFI_VARIABLE_BOOTSERVICE_ACCESS,
                                           &max_storage, &rem_storage,
                                           &max_size);
-       if (ret != EFI_UNSUPPORTED) {
-               efi_st_error("QueryVariableInfo failed\n");
-               return EFI_ST_FAILURE;
+
+       if (IS_ENABLED(CONFIG_EFI_VARIABLE_FILE_STORE)) {
+               if (ret != EFI_SUCCESS) {
+                       efi_st_error("QueryVariableInfo failed\n");
+                       return EFI_ST_FAILURE;
+               }
+       } else {
+               if (ret != EFI_UNSUPPORTED) {
+                       efi_st_error("QueryVariableInfo failed\n");
+                       return EFI_ST_FAILURE;
+               }
        }
 
        ret = runtime->set_variable(u"efi_st_var0", &guid_vendor0,