/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright ( C ) 2010 Marco Stornelli < marco . stornelli @ gmail . com >
* Copyright ( C ) 2011 Kees Cook < keescook @ chromium . org >
* Copyright ( C ) 2011 Google , Inc .
*/
#include <linux/pstore_ram.h>
/*
* Choose whether access to the RAM zone requires locking or not . If a zone
* can be written to from different CPUs like with ftrace for example , then
* PRZ_FLAG_NO_LOCK is used . For all other cases , locking is required .
*/
#define PRZ_FLAG_NO_LOCK BIT(0 )
/*
* If a PRZ should only have a single - boot lifetime , this marks it as
* getting wiped after its contents get copied out after boot .
*/
#define PRZ_FLAG_ZAP_OLD BIT(1 )
/**
* struct persistent_ram_zone - Details of a persistent RAM zone ( PRZ )
* used as a pstore backend
*
* @ paddr : physical address of the mapped RAM area
* @ size : size of mapping
* @ label : unique name of this PRZ
* @ type : frontend type for this PRZ
* @ flags : holds PRZ_FLAGS_ * bits
*
* @ buffer_lock :
* locks access to @ buffer " size " bytes and " start " offset
* @ buffer :
* pointer to actual RAM area managed by this PRZ
* @ buffer_size :
* bytes in @ buffer - > data ( not including any trailing ECC bytes )
*
* @ par_buffer :
* pointer into @ buffer - > data containing ECC bytes for @ buffer - > data
* @ par_header :
* pointer into @ buffer - > data containing ECC bytes for @ buffer header
* ( i . e . all fields up to @ data )
* @ rs_decoder :
* RSLIB instance for doing ECC calculations
* @ corrected_bytes :
* ECC corrected bytes accounting since boot
* @ bad_blocks :
* ECC uncorrectable bytes accounting since boot
* @ ecc_info :
* ECC configuration details
*
* @ old_log :
* saved copy of @ buffer - > data prior to most recent wipe
* @ old_log_size :
* bytes contained in @ old_log
*
*/
struct persistent_ram_zone {
phys_addr_t paddr;
size_t size;
void *vaddr;
char *label;
enum pstore_type_id type;
u32 flags;
raw_spinlock_t buffer_lock;
struct persistent_ram_buffer *buffer;
size_t buffer_size;
char *par_buffer;
char *par_header;
struct rs_control *rs_decoder;
int corrected_bytes;
int bad_blocks;
struct persistent_ram_ecc_info ecc_info;
char *old_log;
size_t old_log_size;
};
struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
u32 sig, struct persistent_ram_ecc_info *ecc_info,
unsigned int memtype, u32 flags, char *label);
void persistent_ram_free(struct persistent_ram_zone **_prz);
void persistent_ram_zap(struct persistent_ram_zone *prz);
int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,
unsigned int count);
int persistent_ram_write_user(struct persistent_ram_zone *prz,
const void __user *s, unsigned int count);
void persistent_ram_save_old(struct persistent_ram_zone *prz);
size_t persistent_ram_old_size(struct persistent_ram_zone *prz);
void *persistent_ram_old(struct persistent_ram_zone *prz);
void persistent_ram_free_old(struct persistent_ram_zone *prz);
ssize_t persistent_ram_ecc_string(struct persistent_ram_zone *prz,
char *str, size_t len);
Messung V0.5 in Prozent C=96 H=100 G=97
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland