| // Copyright 2022 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef INSTALLER_EFIVAR_H_ |
| #define INSTALLER_EFIVAR_H_ |
| |
| #include <memory> |
| #include <optional> |
| #include <string> |
| #include <vector> |
| |
| #include <base/memory/free_deleter.h> |
| |
| // All the efi variables we're writing want the same set of attributes, |
| // according to the UEFI spec v2.9 section 3.3, Table 3-1 "Global Variables". |
| extern const uint32_t kBootVariableAttributes; |
| |
| // Indicates that the int is an errno passed back from libefivar. |
| using EfiVarError = int; |
| |
| // Interface to allow testing. |
| class EfiVarInterface { |
| public: |
| using Bytes = std::unique_ptr<uint8_t, base::FreeDeleter>; |
| |
| virtual bool EfiVariablesSupported() = 0; |
| |
| virtual std::optional<std::string> GetNextVariableName() = 0; |
| |
| virtual bool GetVariable(const std::string& name, |
| Bytes& data, |
| size_t* data_size) = 0; |
| |
| virtual std::optional<EfiVarError> SetVariable( |
| const std::string& name, |
| uint32_t attributes, |
| std::vector<uint8_t>& data) = 0; |
| |
| virtual bool DelVariable(const std::string& name) = 0; |
| |
| virtual bool GenerateFileDevicePathFromEsp( |
| const std::string& device_path, |
| int esp_partition, |
| const std::string& boot_file, |
| std::vector<uint8_t>& efidp_data) = 0; |
| |
| // These three don't do filesystem access, they just operate on data |
| // returned by GetVariable, so no need for virtual. |
| std::string LoadoptDesc(uint8_t* const data, size_t data_size); |
| std::vector<uint8_t> LoadoptPath(uint8_t* const data, size_t data_size); |
| bool LoadoptCreate(uint32_t loadopt_attributes, |
| std::vector<uint8_t>& efidp_data, |
| std::string& description, |
| std::vector<uint8_t>* data); |
| }; |
| |
| // Non-testing implementation. Moderately thin wrappers around libefivar, using |
| // C++ amenities rather than raw pointers that you have to free. |
| class EfiVarImpl : public EfiVarInterface { |
| public: |
| bool EfiVariablesSupported() override; |
| |
| std::optional<std::string> GetNextVariableName() override; |
| |
| bool GetVariable(const std::string& name, |
| Bytes& data, |
| size_t* data_size) override; |
| |
| std::optional<EfiVarError> SetVariable(const std::string& name, |
| uint32_t attributes, |
| std::vector<uint8_t>& data) override; |
| |
| bool DelVariable(const std::string& name) override; |
| |
| bool GenerateFileDevicePathFromEsp(const std::string& device_path, |
| int esp_partition, |
| const std::string& boot_file, |
| std::vector<uint8_t>& efidp_data) override; |
| }; |
| |
| #endif // INSTALLER_EFIVAR_H_ |