#include <linux/efi.h>
#include <linux/module.h>
#include <linux/pstore.h>
#include <linux/slab.h>
#include <linux/ucs2_string.h>
MODULE_IMPORT_NS(…);
#define DUMP_NAME_LEN …
static unsigned int record_size = …;
module_param(record_size, uint, 0444);
MODULE_PARM_DESC(…) …;
#define PSTORE_EFI_ATTRIBUTES …
static bool pstore_disable = … IS_ENABLED(…);
static int efivars_pstore_init(void);
static void efivars_pstore_exit(void);
static int efi_pstore_disable_set(const char *val, const struct kernel_param *kp)
{ … }
static const struct kernel_param_ops pstore_disable_ops = …;
module_param_cb(…);
__MODULE_PARM_TYPE(…) …;
static int efi_pstore_open(struct pstore_info *psi)
{ … }
static int efi_pstore_close(struct pstore_info *psi)
{ … }
static inline u64 generic_id(u64 timestamp, unsigned int part, int count)
{ … }
static int efi_pstore_read_func(struct pstore_record *record,
efi_char16_t *varname)
{ … }
static ssize_t efi_pstore_read(struct pstore_record *record)
{ … }
static int efi_pstore_write(struct pstore_record *record)
{
char name[DUMP_NAME_LEN];
efi_char16_t efi_name[DUMP_NAME_LEN];
efi_status_t status;
int i;
record->id = generic_id(record->time.tv_sec, record->part,
record->count);
memset(name, 0, sizeof(name));
snprintf(name, sizeof(name), "dump-type%u-%u-%d-%lld-%c",
record->type, record->part, record->count,
(long long)record->time.tv_sec,
record->compressed ? 'C' : 'D');
for (i = 0; i < DUMP_NAME_LEN; i++)
efi_name[i] = name[i];
if (efivar_trylock())
return -EBUSY;
status = efivar_set_variable_locked(efi_name, &LINUX_EFI_CRASH_GUID,
PSTORE_EFI_ATTRIBUTES,
record->size, record->psi->buf,
true);
efivar_unlock();
return efi_status_to_err(status);
};
static int efi_pstore_erase(struct pstore_record *record)
{ … }
static struct pstore_info efi_pstore_info = …;
static int efivars_pstore_init(void)
{ … }
static void efivars_pstore_exit(void)
{ … }
module_init(…) …;
module_exit(efivars_pstore_exit);
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_ALIAS(…) …;