mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
efi_loader: add an EFI variable with the file contents
Previous patches enabled SetVariableRT using a RAM backend. Although EBBR [0] defines a variable format we can teach userspace tools and write the altered variables, it's better if we skip the ABI requirements completely. So let's add a new variable, in its own namespace called "VarToFile" which contains a binary dump of the updated RT, BS and, NV variables and will be updated when GetVariable is called. Some adjustments are needed to do that. Currently we discard BS-only variables in EBS(). We need to preserve those on the RAM backend that exposes the variables. Since BS-only variables can't appear at runtime we need to move the memory masking checks from efi_var_collect() to efi_get_next_variable_name_mem()/ efi_get_variable_mem() and do the filtering at runtime. We also need an efi_var_collect() variant available at runtime, in order to construct the "VarToFile" buffer on the fly. All users and applications (for linux) have to do when updating a variable is dd that variable in the file described by "RTStorageVolatile". Linux efivarfs uses a first 4 bytes of the output to represent attributes in little-endian format. So, storing variables works like this: $~ efibootmgr -n 0001 $~ dd if=/sys/firmware/efi/efivars/VarToFile-b2ac5fc9-92b7-4acd-aeac-11e818c3130c of=/boot/efi/ubootefi.var skip=4 bs=1 [0] https://arm-software.github.io/ebbr/index.html#document-chapter5-variable-storage Suggested-by: Ard Biesheuvel <ardb@kernel.org> # dumping all variables to a variable Co-developed-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> # contributed on efi_var_collect_mem() Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
bc3dd2493e
commit
00da8d65a3
7 changed files with 146 additions and 65 deletions
|
@ -130,6 +130,8 @@ efi_status_t efi_init_runtime_supported(void)
|
|||
EFI_RT_SUPPORTED_CONVERT_POINTER;
|
||||
|
||||
if (IS_ENABLED(CONFIG_EFI_RT_VOLATILE_STORE)) {
|
||||
u8 s = 0;
|
||||
|
||||
ret = efi_set_variable_int(u"RTStorageVolatile",
|
||||
&efi_guid_efi_rt_var_file,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
|
@ -141,6 +143,29 @@ efi_status_t efi_init_runtime_supported(void)
|
|||
log_err("Failed to set RTStorageVolatile\n");
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* This variable needs to be visible so users can read it,
|
||||
* but the real contents are going to be filled during
|
||||
* GetVariable
|
||||
*/
|
||||
ret = efi_set_variable_int(u"VarToFile",
|
||||
&efi_guid_efi_rt_var_file,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS |
|
||||
EFI_VARIABLE_READ_ONLY,
|
||||
sizeof(s),
|
||||
&s, false);
|
||||
if (ret != EFI_SUCCESS) {
|
||||
log_err("Failed to set VarToFile\n");
|
||||
efi_set_variable_int(u"RTStorageVolatile",
|
||||
&efi_guid_efi_rt_var_file,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||
EFI_VARIABLE_RUNTIME_ACCESS |
|
||||
EFI_VARIABLE_READ_ONLY,
|
||||
0, NULL, false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
rt_table->runtime_services_supported |= EFI_RT_SUPPORTED_SET_VARIABLE;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue