• Matt Fleming's avatar
    efivars: efivar_entry API · e14ab23d
    Matt Fleming authored
    There isn't really a formal interface for dealing with EFI variables
    or struct efivar_entry. Historically, this has led to various bits of
    code directly accessing the generic EFI variable ops, which inherently
    ties it to specific EFI variable operations instead of indirectly
    using whatever ops were registered with register_efivars(). This lead
    to the efivarfs code only working with the generic EFI variable ops
    and not CONFIG_GOOGLE_SMI.
    
    Encapsulate everything that needs to access '__efivars' inside an
    efivar_entry_* API and use the new API in the pstore, sysfs and
    efivarfs code.
    
    Much of the efivars code had to be rewritten to use this new API. For
    instance, it is now up to the users of the API to build the initial
    list of EFI variables in their efivar_init() callback function. The
    variable list needs to be passed to efivar_init() which allows us to
    keep work arounds for things like implementation bugs in
    GetNextVariable() in a central location.
    
    Allowing users of the API to use a callback function to build the list
    greatly benefits the efivarfs code which needs to allocate inodes and
    dentries for every variable.  It previously did this in a racy way
    because the code ran without holding the variable spinlock. Both the
    sysfs and efivarfs code maintain their own lists which means the two
    interfaces can be running simultaneously without interference, though
    it should be noted that because no synchronisation is performed it is
    very easy to create inconsistencies. efibootmgr doesn't currently use
    efivarfs and users are likely to also require the old sysfs interface,
    so it makes sense to allow both to be built.
    Reviewed-by: default avatarTom Gundersen <teg@jklm.no>
    Tested-by: default avatarTom Gundersen <teg@jklm.no>
    Cc: Seiji Aguchi <seiji.aguchi@hds.com>
    Cc: Matthew Garrett <mjg59@srcf.ucam.org>
    Cc: Jeremy Kerr <jk@ozlabs.org>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Mike Waychison <mikew@google.com>
    Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
    e14ab23d
efivars.c 62.9 KB