Skip to content
  • Ilias Apalodimas's avatar
    efi_loader: add an EFI variable with the file contents · 00da8d65
    Ilias Apalodimas authored and Heinrich Schuchardt's avatar Heinrich Schuchardt committed
    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: default avatarHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
    Signed-off-by: default avatarIlias Apalodimas <ilias.apalodimas@linaro.org>
    00da8d65