blob: 43d346f93749309011ddf70f030be34686badfe6 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/*
2 * Copyright (c) 2018 MediaTek Inc.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files
6 * (the "Software"), to deal in the Software without restriction,
7 * including without limitation the rights to use, copy, modify, merge,
8 * publish, distribute, sublicense, and/or sell copies of the Software,
9 * and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24#if !defined(__KDUMP_H__)
25#define __KDUMP_H__
26
27#include <compiler.h>
28#include <libfdt.h>
29#include <mrdump.h>
30#include <platform/mt_reg_base.h>
31#include <stdint.h>
32
33#ifdef MTK_MRDUMP_SRAM_CB
34#include <platform/mtk_mrdump.h>
35#endif
36
37#define MRDUMP_DEV_UNKNOWN 0
38#define MRDUMP_DEV_NONE 1
39#define MRDUMP_DEV_NULL 2
40#define MRDUMP_DEV_ISTORAGE_EXT4 3
41#define MRDUMP_DEV_ISTORAGE_VFAT 4
42#define MRDUMP_DEV_USB 5
43
44#define MRDUMP_GO_DUMP "MRDUMP08"
45
46/* for dts */
47#ifdef CFG_DTB_EARLY_LOADER_SUPPORT
48
49struct mrdump_reserve_args {
50 uint32_t hi_addr;
51 uint32_t lo_addr;
52 uint32_t hi_size;
53 uint32_t lo_size;
54};
55
56#endif
57
58/*
59 * for ext4 and f2fs, InfoLBA (header), version 2
60 * v1: support allocate size > 4G
61 * v2: support timestamp
62 */
63#define MRDUMP_PAF_VERSION 0x0002
64
65#define MRDUMP_PAF_INFO_LBA 4
66#define MRDUMP_PAF_ADDR_LBA 8
67#define MRDUMP_PAF_ALLOCSIZE 12
68#define MRDUMP_PAF_COREDUMPSIZE 20
69#define MRDUMP_PAF_TIMESTAMP 28
70#define MRDUMP_PAF_CRC32 36
71#define MRDUMP_LBA_DATAONLY MRDUMP_PAF_CRC32
72#define MRDUMP_PAF_TOTAL_SIZE 40
73
74#define KZIP_ENTRY_MAX 30
75#define LOCALHEADERMAGIC 0x04034b50UL
76#define CENTRALHEADERMAGIC 0x02014b50UL
77#define ZIP64ENDOFCENTRALDIRMAGIC 0x06064b50UL
78#define ZIP64ENDOFCENTRALDIRLOCATORMAGIC 0x07064b50UL
79#define ENDOFCENTRALDIRMAGIC 0x06054b50UL
80
81#define KDUMP_CORE_HEADER_SIZE 2 * 4096
82
83struct kzip_entry {
84 char *filename;
85 int level;
86 uint64_t localheader_offset;
87 uint64_t comp_size;
88 uint64_t uncomp_size;
89 uint32_t crc32;
90};
91
92struct kzip_file {
93 uint32_t reported_size;
94 uint32_t wdk_kick_size;
95 uint64_t current_size;
96
97 uint32_t entries_num;
98 struct kzip_entry zentries[KZIP_ENTRY_MAX];
99 void *handle;
100
101 int (*write_cb)(void *handle, void *buf, int size);
102};
103
104#define MEM_NO_MAP 0
105#define MEM_DO_MAP 1
106#define EXPDB_FILE 2
107struct kzip_addlist {
108 uint64_t address;
109 uint64_t size;
110 int type;
111};
112
113#define MRDUMP_CPU_MAX 12
114
115#define MRDUMP_ENABLE_COOKIE 0x590d2ba3
116
117typedef uint32_t arm32_gregset_t[18];
118typedef uint64_t arm64_gregset_t[34];
119
120struct arm32_ctrl_regs {
121 uint32_t sctlr;
122 uint64_t ttbcr;
123 uint64_t ttbr0;
124 uint64_t ttbr1;
125};
126
127struct arm64_ctrl_regs {
128 uint32_t sctlr_el1;
129 uint32_t sctlr_el2;
130 uint32_t sctlr_el3;
131
132 uint64_t tcr_el1;
133 uint64_t tcr_el2;
134 uint64_t tcr_el3;
135
136 uint64_t ttbr0_el1;
137 uint64_t ttbr0_el2;
138 uint64_t ttbr0_el3;
139
140 uint64_t ttbr1_el1;
141
142 uint64_t sp_el[4];
143};
144
145struct mrdump_crash_record {
146 int reboot_mode;
147
148 char msg[128];
149
150 uint32_t fault_cpu;
151
152 union {
153 arm32_gregset_t arm32_regs;
154 arm64_gregset_t arm64_regs;
155 } cpu_regs[MRDUMP_CPU_MAX];
156
157 union {
158 struct arm32_ctrl_regs arm32_creg;
159 struct arm64_ctrl_regs arm64_creg;
160 } cpu_creg[MRDUMP_CPU_MAX];
161};
162
163struct mrdump_ksyms_param {
164 char tag[4];
165 uint32_t flag;
166 uint32_t crc;
167 uint64_t start_addr;
168 uint32_t size;
169 uint32_t addresses_off;
170 uint32_t num_syms_off;
171 uint32_t names_off;
172 uint32_t markers_off;
173 uint32_t token_table_off;
174 uint32_t token_index_off;
175} __attribute__((packed));
176
177struct mrdump_machdesc {
178 uint32_t nr_cpus;
179
180 uint64_t page_offset;
181 uint64_t high_memory;
182
183 uint64_t kimage_vaddr;
184 uint64_t dram_start;
185 uint64_t dram_end;
186 uint64_t kimage_stext;
187 uint64_t kimage_etext;
188 uint64_t kimage_stext_real;
189 uint64_t kimage_voffset;
190 uint64_t kimage_sdata;
191 uint64_t kimage_edata;
192
193 uint64_t vmalloc_start;
194 uint64_t vmalloc_end;
195
196 uint64_t modules_start;
197 uint64_t modules_end;
198
199 uint64_t phys_offset;
200 uint64_t master_page_table;
201
202 uint64_t memmap;
203
204 uint64_t dfdmem_pa; // Reserved for DFD 3.0+
205
206 struct mrdump_ksyms_param kallsyms;
207};
208
209struct __attribute__((__packed__)) mrdump_cblock_result {
210 char sig[9];
211 char status[128];
212 char log_buf[2048];
213};
214
215struct mrdump_control_block {
216 char sig[8];
217
218 struct mrdump_machdesc machdesc;
219 uint32_t machdesc_crc;
220
221 uint32_t enabled;
222 uint32_t output_fs_lbaooo;
223
224 struct mrdump_crash_record crash_record;
225};
226
227struct kzip_file *kzip_open(void *handle, int (*write_cb)(void *handle, void *p, int size));
228bool kzip_add_file(struct kzip_file *zf, const struct kzip_addlist *addlist, const char *zfilename);
229bool kzip_close(struct kzip_file *zf);
230
231struct mrdump_dev;
232
233struct mrdump_dev *mrdump_dev_emmc_vfat(void);
234struct mrdump_dev *mrdump_dev_emmc_ext4(void);
235struct mrdump_dev *mrdump_dev_sdcard(void);
236
237int kdump_null_output(const struct mrdump_control_block *kparams,
238 const struct kzip_addlist *memlist);
239int mrdump_ext4_output(const struct mrdump_control_block *mrdump_cb,
240 const struct kzip_addlist *memlist, struct mrdump_dev *mrdump_dev);
241int mrdump_vfat_output(const struct mrdump_control_block *mrdump_cb,
242 const struct kzip_addlist *memlist, struct mrdump_dev *mrdump_dev);
243int kdump_usb_output(const struct mrdump_control_block *mrdump_cb,
244 const struct kzip_addlist *memlist);
245
246void kdump_core_header_init(const struct mrdump_control_block *kparams,
247 const struct kzip_addlist *memlist);
248void kdump_core32_header_init(const struct mrdump_control_block *kparams,
249 const struct kzip_addlist *memlist);
250void kdump_core64_header_init(const struct mrdump_control_block *kparams,
251 const struct kzip_addlist *memlist);
252
253void mrdump_setup_cblock(void);
254void mrdump_setup_version(void);
255void mrdump_setup_boot_reason(void);
256
257extern u64 physical_memory_size(void);
258extern void mtk_wdt_disable(void);
259extern void mtk_wdt_init(void);
260extern void mrdump_read_expdb(void *data, int len, u64 offset_src);
261
262#ifdef MTK_3LEVEL_PAGETABLE
263vaddr_t scratch_addr(void);
264#endif
265
266#endif