mirror of
https://git.proxmox.com/git/efi-boot-shim
synced 2025-06-15 12:29:09 +00:00
203 lines
6.0 KiB
C
203 lines
6.0 KiB
C
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
/*
|
|
* mock-variables.h - a mock GetVariable/SetVariable/GNVN/etc
|
|
* implementation for testing.
|
|
* Copyright Peter Jones <pjones@redhat.com>
|
|
*/
|
|
|
|
#ifndef SHIM_MOCK_VARIABLES_H_
|
|
#define SHIM_MOCK_VARIABLES_H_
|
|
|
|
#include "test.h"
|
|
|
|
EFI_STATUS EFIAPI mock_get_variable(CHAR16 *name, EFI_GUID *guid, UINT32 *attrs,
|
|
UINTN *size, VOID *data);
|
|
EFI_STATUS EFIAPI mock_get_next_variable_name(UINTN *size, CHAR16 *name,
|
|
EFI_GUID *guid);
|
|
EFI_STATUS EFIAPI mock_set_variable(CHAR16 *name, EFI_GUID *guid, UINT32 attrs,
|
|
UINTN size, VOID *data);
|
|
EFI_STATUS EFIAPI mock_query_variable_info(UINT32 attrs,
|
|
UINT64 *max_var_storage,
|
|
UINT64 *remaining_var_storage,
|
|
UINT64 *max_var_size);
|
|
|
|
EFI_STATUS EFIAPI mock_install_configuration_table(EFI_GUID *guid, VOID *table);
|
|
|
|
struct mock_variable_limits {
|
|
UINT32 attrs;
|
|
UINT64 *max_var_storage;
|
|
UINT64 *remaining_var_storage;
|
|
UINT64 *max_var_size;
|
|
EFI_STATUS status;
|
|
|
|
list_t list;
|
|
};
|
|
|
|
typedef enum {
|
|
MOCK_SORT_DESCENDING,
|
|
MOCK_SORT_PREPEND,
|
|
MOCK_SORT_APPEND,
|
|
MOCK_SORT_ASCENDING,
|
|
MOCK_SORT_MAX_SENTINEL
|
|
} mock_sort_policy_t;
|
|
|
|
extern mock_sort_policy_t mock_variable_sort_policy;
|
|
extern mock_sort_policy_t mock_config_table_sort_policy;
|
|
|
|
#define MOCK_VAR_DELETE_ATTR_ALLOW_ZERO 0x01
|
|
#define MOCK_VAR_DELETE_ATTR_ALOW_MISMATCH 0x02
|
|
|
|
extern UINT32 mock_variable_delete_attr_policy;
|
|
|
|
extern list_t mock_default_variable_limits;
|
|
extern list_t *mock_qvi_limits;
|
|
extern list_t *mock_sv_limits;
|
|
|
|
struct mock_variable {
|
|
CHAR16 *name;
|
|
EFI_GUID guid;
|
|
void *data;
|
|
size_t size;
|
|
uint32_t attrs;
|
|
|
|
list_t list;
|
|
};
|
|
|
|
extern list_t mock_variables;
|
|
|
|
static inline void
|
|
dump_mock_variables(const char * const file,
|
|
const int line,
|
|
const char * const func)
|
|
{
|
|
list_t *pos = NULL;
|
|
printf("%s:%d:%s(): dumping variables\n", file, line, func);
|
|
list_for_each(pos, &mock_variables) {
|
|
struct mock_variable *var;
|
|
|
|
var = list_entry(pos, struct mock_variable, list);
|
|
printf("%s:%d:%s(): "GUID_FMT"-%s\n", file, line, func,
|
|
GUID_ARGS(var->guid), Str2str(var->name));
|
|
}
|
|
}
|
|
|
|
static inline void
|
|
dump_mock_variables_if_wrong(const char * const file,
|
|
const int line,
|
|
const char * const func,
|
|
EFI_GUID *guid, CHAR16 *first)
|
|
{
|
|
UINTN size = 0;
|
|
CHAR16 buf[8192] = { 0, };
|
|
EFI_STATUS status;
|
|
|
|
size = sizeof(buf);
|
|
buf[0] = L'\0';
|
|
status = RT->GetNextVariableName(&size, buf, guid);
|
|
if (EFI_ERROR(status)) {
|
|
printf("%s:%d:%s() Can't dump variables: %lx\n",
|
|
__FILE__, __LINE__, __func__,
|
|
(unsigned long)status);
|
|
return;
|
|
}
|
|
buf[size] = L'\0';
|
|
if (StrCmp(buf, first) == 0)
|
|
return;
|
|
printf("%s:%d:%s():expected \"%s\" but got \"%s\". Variables:\n",
|
|
file, line, func, Str2str(first), Str2str(buf));
|
|
dump_mock_variables(file, line, func);
|
|
}
|
|
|
|
void mock_load_variables(const char *const dirname, const char *filters[],
|
|
bool filter_out);
|
|
void mock_install_query_variable_info(void);
|
|
void mock_uninstall_query_variable_info(void);
|
|
void mock_reset_variables(void);
|
|
void mock_reset_config_table(void);
|
|
void mock_finalize_vars_and_configs(void);
|
|
void mock_set_usage_limits(list_t *limit_list,
|
|
struct mock_variable_limits *limits);
|
|
void mock_set_default_usage_limits(void);
|
|
|
|
typedef enum {
|
|
NONE = 0,
|
|
CREATE,
|
|
DELETE,
|
|
APPEND,
|
|
REPLACE,
|
|
GET,
|
|
} mock_variable_op_t;
|
|
|
|
static inline const char *
|
|
format_var_op(mock_variable_op_t op)
|
|
{
|
|
static const char *var_op_names[] = {
|
|
"NONE",
|
|
"CREATE",
|
|
"DELETE",
|
|
"APPEND",
|
|
"REPLACE",
|
|
"GET",
|
|
NULL
|
|
};
|
|
|
|
return var_op_names[op];
|
|
}
|
|
|
|
typedef EFI_STATUS (mock_set_variable_pre_hook_t)(CHAR16 *name, EFI_GUID *guid,
|
|
UINT32 attrs, UINTN size,
|
|
VOID *data);
|
|
extern mock_set_variable_pre_hook_t *mock_set_variable_pre_hook;
|
|
|
|
typedef void (mock_set_variable_post_hook_t)(CHAR16 *name, EFI_GUID *guid,
|
|
UINT32 attrs, UINTN size,
|
|
VOID *data, EFI_STATUS *status,
|
|
mock_variable_op_t op,
|
|
const char * const file,
|
|
const int line,
|
|
const char * const func);
|
|
extern mock_set_variable_post_hook_t *mock_set_variable_post_hook;
|
|
|
|
typedef EFI_STATUS (mock_get_variable_pre_hook_t)(CHAR16 *name, EFI_GUID *guid,
|
|
UINT32 *attrs, UINTN *size,
|
|
VOID *data);
|
|
extern mock_get_variable_pre_hook_t *mock_get_variable_pre_hook;
|
|
|
|
typedef void (mock_get_variable_post_hook_t)(CHAR16 *name, EFI_GUID *guid,
|
|
UINT32 *attrs, UINTN *size,
|
|
VOID *data, EFI_STATUS *status,
|
|
const char * const file,
|
|
const int line,
|
|
const char * const func);
|
|
extern mock_get_variable_post_hook_t *mock_get_variable_post_hook;
|
|
|
|
typedef EFI_STATUS (mock_get_next_variable_name_pre_hook_t)(UINTN *size,
|
|
CHAR16 *name,
|
|
EFI_GUID *guid);
|
|
extern mock_get_next_variable_name_pre_hook_t
|
|
*mock_get_next_variable_name_pre_hook;
|
|
|
|
typedef void (mock_get_next_variable_name_post_hook_t)(
|
|
UINTN *size, CHAR16 *name, EFI_GUID *guid,
|
|
EFI_STATUS *status, const char * const file,
|
|
const int line, const char * const func);
|
|
extern mock_get_next_variable_name_post_hook_t
|
|
*mock_get_next_variable_name_post_hook;
|
|
|
|
typedef EFI_STATUS (mock_query_variable_info_pre_hook_t)(
|
|
UINT32 attrs, UINT64 *max_var_storage,
|
|
UINT64 *remaining_var_storage, UINT64 *max_var_size);
|
|
extern mock_query_variable_info_pre_hook_t *mock_query_variable_info_pre_hook;
|
|
|
|
typedef void (mock_query_variable_info_post_hook_t)(
|
|
UINT32 attrs, UINT64 *max_var_storage, UINT64 *remaining_var_storage,
|
|
UINT64 *max_var_size, EFI_STATUS *status, const char * const file,
|
|
const int line, const char * const func);
|
|
extern mock_query_variable_info_post_hook_t *mock_query_variable_info_post_hook;
|
|
|
|
#define MOCK_CONFIG_TABLE_ENTRIES 1024
|
|
extern EFI_CONFIGURATION_TABLE mock_config_table[MOCK_CONFIG_TABLE_ENTRIES];
|
|
|
|
#endif /* !SHIM_MOCK_VARIABLES_H_ */
|
|
// vim:fenc=utf-8:tw=75:noet
|