mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-09 03:21:51 +00:00
efi_loader: move efi_var_collect to common functions
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>
This commit is contained in:
parent
286546d33b
commit
df1076af36
3 changed files with 75 additions and 65 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue