Files
Chungjui Fan 85b524957f fs/pstore/ramoops: add alternate encrypted buffer support
This patch allows the ramoops to read previous logs from an
AES encrypted location while still allowing writes to the
current log.

This is used to allow the backing store to be encrypted and
then written to disk by the bootloader.  The keys to decrypt
are loaded by userspace and then pstore is remounted to
force a reload of the now decrypted backing store.
59444894 ANDROID: pstore: Use vmalloc for large allocations due to ramoops size
f122f327 fs/pstore/ramoops: Allocate decryption buffer with vmalloc
2b946394 fs/pstore: Don't reset update flag until close and use io memcpy
b71d0123 fs/pstore/ramoops: add alternate encrypted buffer support

Bug: 72662019
Bug: 78155869
Change-Id: I84bdaa01d54b2ba6c06686726bbdcf90da49042e
Signed-off-by: Chungjui Fan <chungjuifan@google.com>
2018-06-21 04:44:09 +00:00

115 lines
3.2 KiB
C

/*
* Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
* Copyright (C) 2011 Kees Cook <keescook@chromium.org>
* Copyright (C) 2011 Google, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __LINUX_PSTORE_RAM_H__
#define __LINUX_PSTORE_RAM_H__
#include <linux/compiler.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/types.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)
struct persistent_ram_buffer;
struct rs_control;
struct persistent_ram_ecc_info {
int block_size;
int ecc_size;
int symsize;
int poly;
};
struct persistent_ram_zone {
phys_addr_t paddr;
size_t size;
int memtype;
void *vaddr;
struct persistent_ram_buffer *buffer;
/* Alternate buffer */
phys_addr_t alt_paddr;
void *alt_vaddr;
struct persistent_ram_buffer *alt_buffer;
/* Common buffer size */
size_t buffer_size;
u32 flags;
raw_spinlock_t buffer_lock;
/* ECC correction */
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;
size_t old_log_alloc_size;
};
struct persistent_ram_zone *persistent_ram_new(phys_addr_t start,
phys_addr_t alt_start, size_t size,
u32 sig, struct persistent_ram_ecc_info *ecc_info,
unsigned int memtype, u32 flags);
void persistent_ram_free(struct persistent_ram_zone *prz);
void persistent_ram_zap(struct persistent_ram_zone *prz, bool use_alt);
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, bool use_alt);
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);
void ramoops_console_write_buf(const char *buf, size_t size);
/*
* Ramoops platform data
* @mem_size memory size for ramoops
* @mem_address physical memory address to contain ramoops
*/
struct ramoops_platform_data {
unsigned long mem_size;
phys_addr_t mem_address;
unsigned int mem_type;
unsigned long alt_mem_address;
unsigned long record_size;
unsigned long console_size;
unsigned long ftrace_size;
unsigned long pmsg_size;
int dump_oops;
struct persistent_ram_ecc_info ecc_info;
};
#endif