hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * 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>
#include <linux/pstore.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_buffer {
   uint32_t    sig;
   atomic_t    start;
   atomic_t    size;
   uint8_t     data[0];
};
 
struct persistent_ram_ecc_info {
   int block_size;
   int ecc_size;
   int symsize;
   int poly;
   uint16_t *par;
};
 
struct persistent_ram_zone {
   phys_addr_t paddr;
   size_t size;
   void *vaddr;
   struct persistent_ram_buffer *buffer;
   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;
};
 
struct ramoops_context {
   struct persistent_ram_zone **dprzs;    /* Oops dump zones */
   struct persistent_ram_zone *cprz;    /* Console zone */
   struct persistent_ram_zone **fprzs;    /* Ftrace zones */
   struct persistent_ram_zone *mprz;    /* PMSG zone */
#ifdef CONFIG_PSTORE_BOOT_LOG
   struct persistent_ram_zone **boot_przs;    /* BOOT log zones */
#endif
   phys_addr_t phys_addr;
   unsigned long size;
   unsigned int memtype;
   size_t record_size;
   size_t console_size;
   size_t ftrace_size;
   size_t pmsg_size;
#ifdef CONFIG_PSTORE_BOOT_LOG
   size_t boot_log_size;
#endif
   int dump_oops;
   u32 flags;
   struct persistent_ram_ecc_info ecc_info;
   unsigned int max_dump_cnt;
   unsigned int dump_write_cnt;
   /* _read_cnt need clear on ramoops_pstore_open */
   unsigned int dump_read_cnt;
   unsigned int console_read_cnt;
   unsigned int max_ftrace_cnt;
   unsigned int ftrace_read_cnt;
   unsigned int pmsg_read_cnt;
#ifdef CONFIG_PSTORE_BOOT_LOG
   unsigned int boot_log_read_cnt;
   unsigned int max_boot_log_cnt;
#endif
   struct pstore_info pstore;
};
 
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);
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);
 
/*
 * Ramoops platform data
 * @mem_size    memory size for ramoops
 * @mem_address    physical memory address to contain ramoops
 */
 
#define RAMOOPS_FLAG_FTRACE_PER_CPU    BIT(0)
 
struct ramoops_platform_data {
   unsigned long    mem_size;
   phys_addr_t    mem_address;
   unsigned int    mem_type;
   unsigned long    record_size;
   unsigned long    console_size;
   unsigned long    ftrace_size;
   unsigned long    pmsg_size;
#ifdef CONFIG_PSTORE_BOOT_LOG
   unsigned long    boot_log_size;
   unsigned long    max_boot_log_cnt;
#endif
   int        dump_oops;
   u32        flags;
   struct persistent_ram_ecc_info ecc_info;
};
 
#endif