Message ID | 20240405065058.591452-1-ilias.apalodimas@linaro.org |
---|---|
State | New |
Headers | show |
Series | [v2] efi_loader: move efi_var_collect to common functions | expand |
On 4/5/24 08:50, Ilias Apalodimas wrote: > From: Ilias Apalodimas <apalos@gmail.com> > > 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> > --- > Changes since v1: > - Clean up the makefile as well > - fix checkpatch error > > lib/efi_loader/Makefile | 2 +- > lib/efi_loader/efi_var_common.c | 74 +++++++++++++++++++++++++++++++++ > lib/efi_loader/efi_var_file.c | 64 ---------------------------- > 3 files changed, 75 insertions(+), 65 deletions(-) > > diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile > index fcb0af7e7d6d..6a0ce6c32c88 100644 > --- a/lib/efi_loader/Makefile > +++ b/lib/efi_loader/Makefile > @@ -72,11 +72,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 > diff --git a/lib/efi_loader/efi_var_common.c b/lib/efi_loader/efi_var_common.c > index d528747f3fb4..4268850990f5 100644 > --- a/lib/efi_loader/efi_var_common.c > +++ b/lib/efi_loader/efi_var_common.c > @@ -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; > +} > diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c > index 532b6b40eefe..413e1794e88c 100644 > --- a/lib/efi_loader/efi_var_file.c > +++ b/lib/efi_loader/efi_var_file.c > @@ -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 > * > -- > 2.43.0 >
diff --git a/lib/efi_loader/Makefile b/lib/efi_loader/Makefile index fcb0af7e7d6d..6a0ce6c32c88 100644 --- a/lib/efi_loader/Makefile +++ b/lib/efi_loader/Makefile @@ -72,11 +72,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 diff --git a/lib/efi_loader/efi_var_common.c b/lib/efi_loader/efi_var_common.c index d528747f3fb4..4268850990f5 100644 --- a/lib/efi_loader/efi_var_common.c +++ b/lib/efi_loader/efi_var_common.c @@ -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; +} diff --git a/lib/efi_loader/efi_var_file.c b/lib/efi_loader/efi_var_file.c index 532b6b40eefe..413e1794e88c 100644 --- a/lib/efi_loader/efi_var_file.c +++ b/lib/efi_loader/efi_var_file.c @@ -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 *