blob: 85064a70a1a3b1e8280ce8f68a5bd31cb0d224d2 [file] [log] [blame]
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
*/
#ifndef VARIABLE_INDEX_H
#define VARIABLE_INDEX_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <protocols/common/efi/efi_status.h>
#include <protocols/service/smm_variable/smm_variable_proto.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Implementation limits
*/
#define VARIABLE_INDEX_MAX_NAME_SIZE (32)
/**
* \brief variable_info structure definition
*
* Holds information about a stored variable.
*/
struct variable_info
{
EFI_GUID guid;
size_t name_size;
int16_t name[VARIABLE_INDEX_MAX_NAME_SIZE];
uint32_t attributes;
uint64_t uid;
};
/**
* \brief An entry in the index
*
* Represents a store variable in the variable index.
*/
struct variable_entry
{
struct variable_info info;
bool in_use;
bool dirty;
};
/**
* \brief variable_index structure definition
*
* Provides an index of stored variables to allow the uefi variable store
* contents to be enumerated.
*/
struct variable_index
{
size_t max_variables;
struct variable_entry *entries;
};
/**
* @brief Initialises a variable_index
*
* @param[in] context variable_index
* @param[in] max_variables The maximum number of stored variables
*
* @return EFI_SUCCESS if initialized successfully
*/
efi_status_t variable_index_init(
struct variable_index *context,
size_t max_variables);
/**
* @brief De-initialises a variable_index
*
* @param[in] context variable_index
*/
void variable_index_deinit(
struct variable_index *context);
/**
* @brief Returns the maximum dump size
*
* For a given maximum index size, returns the size of the
* buffer that is needed to hold all serialized variable_info
* objects.
*
* @param[in] context variable_index
*/
size_t variable_index_max_dump_size(
struct variable_index *context);
/**
* @brief Find info about a variable
*
* @param[in] context variable_index
* @param[in] guid The variable's guid
* @param[in] name_size The name parameter's size
* @param[in] name The variable's name
*
* @return Pointer to variable_info or NULL
*/
const struct variable_info *variable_index_find(
const struct variable_index *context,
const EFI_GUID *guid,
size_t name_size,
const int16_t *name);
/**
* @brief Find the next variable in the index
*
* @param[in] context variable_index
* @param[in] guid The variable's guid
* @param[in] name_size The name parameter's size
* @param[in] name The variable's name
*
* @return Pointer to variable_info or NULL
*/
const struct variable_info *variable_index_find_next(
const struct variable_index *context,
const EFI_GUID *guid,
size_t name_size,
const int16_t *name);
/**
* @brief Add a new variable to the index
*
* @param[in] context variable_index
* @param[in] guid The variable's guid
* @param[in] name_size The name parameter's size
* @param[in] name The variable's name
* @param[in] attributes The variable's attributes
*
* @return Pointer to variable_info or NULL
*/
const struct variable_info *variable_index_add(
struct variable_index *context,
const EFI_GUID *guid,
size_t name_size,
const int16_t *name,
uint32_t attributes);
/**
* @brief Remove a variable from the index
*
* Removes a variable from the index if it exists.
*
* @param[in] context variable_index
* @param[in] guid The variable's guid
* @param[in] name_size The name parameter's size
* @param[in] name The variable's name
*/
void variable_index_remove(
struct variable_index *context,
const EFI_GUID *guid,
size_t name_size,
const int16_t *name);
/**
* @brief Update variable attributes
*
* @param[in] context variable_index
* @param[in] info variable info
* @param[in] attributes The variable's attributes
*/
void variable_index_update_attributes(
struct variable_index *context,
const struct variable_info *info,
uint32_t attributes);
/**
* @brief Dump the serialized index contents for persistent backup
*
* @param[in] context variable_index
* @param[in] buffer_size Size of destination buffer
* @param[in] buffer Dump to this buffer
* @param[out] data_len Length of serialized data
*
* @return True if there is unsaved data
*/
bool variable_index_dump(
struct variable_index *context,
size_t buffer_size,
uint8_t *buffer,
size_t *data_len);
/**
* @brief Restore the serialized index contents
*
* Should be called straight after the variable index is initialized to
* restore any NV variable info from persistent storage.
*
* @param[in] context variable_index
* @param[in] data_len The length of the data to load
* @param[in] buffer Load from this buffer
*
* @return Number of bytes loaded
*/
size_t variable_index_restore(
const struct variable_index *context,
size_t data_len,
const uint8_t *buffer);
#ifdef __cplusplus
}
#endif
#endif /* VARIABLE_INDEX_H */