]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
efi_loader: move efi_var_collect to common functions
authorIlias Apalodimas <apalos@gmail.com>
Fri, 5 Apr 2024 06:50:58 +0000 (09:50 +0300)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 13 Apr 2024 09:03:12 +0000 (11:03 +0200)
efi_var_collect() was initially placed in efi_var_file.c, since back
then we only supported efi variables stored in a file. Since then we
support variables stored in an RPMB as well and use that function to
collect variables that should be present at runtime.

So let's move it around in efi_var_common.c which makes more sense

Suggested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Ilias Apalodimas <apalos@gmail.com>
Reviewed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
lib/efi_loader/Makefile
lib/efi_loader/efi_var_common.c
lib/efi_loader/efi_var_file.c

index 086521fb28786ed1fb20c3f022f0ea38cea9fe99..034e366967f05feb7ba0a635c3be69d9bcdd60dd 100644 (file)
@@ -71,11 +71,11 @@ obj-y += efi_string.o
 obj-$(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) += efi_unicode_collation.o
 obj-y += efi_var_common.o
 obj-y += efi_var_mem.o
-obj-y += efi_var_file.o
 ifeq ($(CONFIG_EFI_MM_COMM_TEE),y)
 obj-y += efi_variable_tee.o
 else
 obj-y += efi_variable.o
+obj-y += efi_var_file.o
 obj-$(CONFIG_EFI_VARIABLES_PRESEED) += efi_var_seed.o
 endif
 obj-y += efi_watchdog.o
index 16b2c3d48828a03ed2593a9614982489b72643aa..aa8feffd3ec11f5181d2b3b5aa54cbaefed5b72a 100644 (file)
@@ -9,6 +9,7 @@
 #include <efi_loader.h>
 #include <efi_variable.h>
 #include <stdlib.h>
+#include <u-boot/crc.h>
 
 enum efi_secure_mode {
        EFI_MODE_SETUP,
@@ -416,3 +417,76 @@ void *efi_get_var(const u16 *name, const efi_guid_t *vendor, efi_uintn_t *size)
 
        return buf;
 }
+
+/**
+ * efi_var_collect() - Copy EFI variables mstching attributes mask
+ *
+ * @bufp:      buffer containing variable collection
+ * @lenp:      buffer length
+ * @attr_mask: mask of matched attributes
+ *
+ * Return:     Status code
+ */
+efi_status_t __maybe_unused efi_var_collect(struct efi_var_file **bufp, loff_t *lenp,
+                                           u32 check_attr_mask)
+{
+       size_t len = EFI_VAR_BUF_SIZE;
+       struct efi_var_file *buf;
+       struct efi_var_entry *var, *old_var;
+       size_t old_var_name_length = 2;
+
+       *bufp = NULL; /* Avoid double free() */
+       buf = calloc(1, len);
+       if (!buf)
+               return EFI_OUT_OF_RESOURCES;
+       var = buf->var;
+       old_var = var;
+       for (;;) {
+               efi_uintn_t data_length, var_name_length;
+               u8 *data;
+               efi_status_t ret;
+
+               if ((uintptr_t)buf + len <=
+                   (uintptr_t)var->name + old_var_name_length)
+                       return EFI_BUFFER_TOO_SMALL;
+
+               var_name_length = (uintptr_t)buf + len - (uintptr_t)var->name;
+               memcpy(var->name, old_var->name, old_var_name_length);
+               guidcpy(&var->guid, &old_var->guid);
+               ret = efi_get_next_variable_name_int(
+                               &var_name_length, var->name, &var->guid);
+               if (ret == EFI_NOT_FOUND)
+                       break;
+               if (ret != EFI_SUCCESS) {
+                       free(buf);
+                       return ret;
+               }
+               old_var_name_length = var_name_length;
+               old_var = var;
+
+               data = (u8 *)var->name + old_var_name_length;
+               data_length = (uintptr_t)buf + len - (uintptr_t)data;
+               ret = efi_get_variable_int(var->name, &var->guid,
+                                          &var->attr, &data_length, data,
+                                          &var->time);
+               if (ret != EFI_SUCCESS) {
+                       free(buf);
+                       return ret;
+               }
+               if ((var->attr & check_attr_mask) == check_attr_mask) {
+                       var->length = data_length;
+                       var = (struct efi_var_entry *)ALIGN((uintptr_t)data + data_length, 8);
+               }
+       }
+
+       buf->reserved = 0;
+       buf->magic = EFI_VAR_FILE_MAGIC;
+       len = (uintptr_t)var - (uintptr_t)buf;
+       buf->crc32 = crc32(0, (u8 *)buf->var,
+                          len - sizeof(struct efi_var_file));
+       buf->length = len;
+       *bufp = buf;
+       *lenp = len;
+
+       return EFI_SUCCESS;
+}
index 532b6b40eefee38d5b9c6cfb04488b0361e4fe50..413e1794e88cf386d38134ba2eb43d4ee3acf1d0 100644 (file)
@@ -52,70 +52,6 @@ static efi_status_t __maybe_unused efi_set_blk_dev_to_system_partition(void)
        return EFI_SUCCESS;
 }
 
-efi_status_t __maybe_unused efi_var_collect(struct efi_var_file **bufp, loff_t *lenp,
-                                           u32 check_attr_mask)
-{
-       size_t len = EFI_VAR_BUF_SIZE;
-       struct efi_var_file *buf;
-       struct efi_var_entry *var, *old_var;
-       size_t old_var_name_length = 2;
-
-       *bufp = NULL; /* Avoid double free() */
-       buf = calloc(1, len);
-       if (!buf)
-               return EFI_OUT_OF_RESOURCES;
-       var = buf->var;
-       old_var = var;
-       for (;;) {
-               efi_uintn_t data_length, var_name_length;
-               u8 *data;
-               efi_status_t ret;
-
-               if ((uintptr_t)buf + len <=
-                   (uintptr_t)var->name + old_var_name_length)
-                       return EFI_BUFFER_TOO_SMALL;
-
-               var_name_length = (uintptr_t)buf + len - (uintptr_t)var->name;
-               memcpy(var->name, old_var->name, old_var_name_length);
-               guidcpy(&var->guid, &old_var->guid);
-               ret = efi_get_next_variable_name_int(
-                               &var_name_length, var->name, &var->guid);
-               if (ret == EFI_NOT_FOUND)
-                       break;
-               if (ret != EFI_SUCCESS) {
-                       free(buf);
-                       return ret;
-               }
-               old_var_name_length = var_name_length;
-               old_var = var;
-
-               data = (u8 *)var->name + old_var_name_length;
-               data_length = (uintptr_t)buf + len - (uintptr_t)data;
-               ret = efi_get_variable_int(var->name, &var->guid,
-                                          &var->attr, &data_length, data,
-                                          &var->time);
-               if (ret != EFI_SUCCESS) {
-                       free(buf);
-                       return ret;
-               }
-               if ((var->attr & check_attr_mask) == check_attr_mask) {
-                       var->length = data_length;
-                       var = (struct efi_var_entry *)ALIGN((uintptr_t)data + data_length, 8);
-               }
-       }
-
-       buf->reserved = 0;
-       buf->magic = EFI_VAR_FILE_MAGIC;
-       len = (uintptr_t)var - (uintptr_t)buf;
-       buf->crc32 = crc32(0, (u8 *)buf->var,
-                          len - sizeof(struct efi_var_file));
-       buf->length = len;
-       *bufp = buf;
-       *lenp = len;
-
-       return EFI_SUCCESS;
-}
-
 /**
  * efi_var_to_file() - save non-volatile variables as file
  *