mrdump_private.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2016. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #if !defined(__MRDUMP_PRIVATE_H__)
  32. #define __MRDUMP_PRIVATE_H__
  33. #include <stdint.h>
  34. #include <platform/mt_typedefs.h>
  35. #include <platform/mt_reg_base.h>
  36. #include <dev/mrdump.h>
  37. #include <platform/mtk_mrdump.h>
  38. /* for LPAE (MTK_3LEVEL_PAGETABLE) */
  39. #include <compiler.h>
  40. #include <arch/arm/mmu.h>
  41. #define MRDUMP_GO_DUMP "MRDUMP09"
  42. #define MRDUMP_LINUX_KERNEL_MEMORY "linux-kernel-memory"
  43. /*
  44. * for ext4 and f2fs, InfoLBA (header), version 2
  45. * v1: support allocate size > 4G
  46. * v2: support timestamp
  47. */
  48. #define MRDUMP_PAF_VERSION 0x0002
  49. #define MRDUMP_PAF_INFO_LBA 4
  50. #define MRDUMP_PAF_ADDR_LBA 8
  51. #define MRDUMP_PAF_ALLOCSIZE 12
  52. #define MRDUMP_PAF_COREDUMPSIZE 20
  53. #define MRDUMP_PAF_TIMESTAMP 28
  54. #define MRDUMP_PAF_CRC32 36
  55. #define MRDUMP_LBA_DATAONLY MRDUMP_PAF_CRC32
  56. #define MRDUMP_PAF_TOTAL_SIZE 40
  57. #define KZIP_ENTRY_MAX 64
  58. #define LOCALHEADERMAGIC 0x04034b50UL
  59. #define CENTRALHEADERMAGIC 0x02014b50UL
  60. #define ZIP64ENDOFCENTRALDIRMAGIC 0x06064b50UL
  61. #define ZIP64ENDOFCENTRALDIRLOCATORMAGIC 0x07064b50UL
  62. #define ENDOFCENTRALDIRMAGIC 0x06054b50UL
  63. #define MRDUMP_CORE_HEADER_SIZE 2 * 4096
  64. struct kzip_entry {
  65. char *filename;
  66. int level;
  67. uint64_t localheader_offset;
  68. uint64_t comp_size;
  69. uint64_t uncomp_size;
  70. uint32_t crc32;
  71. };
  72. struct kzip_file {
  73. uint64_t reported_size;
  74. uint64_t wdk_kick_size;
  75. uint64_t current_size;
  76. uint32_t entries_num;
  77. struct kzip_entry zentries[KZIP_ENTRY_MAX];
  78. void *handle;
  79. int (*write_cb)(void *handle, void *buf, int size);
  80. };
  81. #define MEM_NO_MAP 0
  82. #define MEM_DO_MAP 1
  83. #define EXPDB_FILE 2
  84. struct kzip_addlist {
  85. uint64_t address;
  86. uint64_t size;
  87. uint32_t type;
  88. uint64_t memmap;
  89. uint64_t pageflags;
  90. uint32_t struct_page_size;
  91. };
  92. #define MRDUMP_CPU_MAX 12
  93. #define MRDUMP_ENABLE_COOKIE 0x590d2ba3
  94. typedef uint32_t arm32_gregset_t[18];
  95. typedef uint64_t arm64_gregset_t[34];
  96. struct arm32_ctrl_regs {
  97. uint32_t sctlr;
  98. uint64_t ttbcr;
  99. uint64_t ttbr0;
  100. uint64_t ttbr1;
  101. };
  102. struct arm64_ctrl_regs {
  103. uint32_t sctlr_el1;
  104. uint32_t sctlr_el2;
  105. uint32_t sctlr_el3;
  106. uint64_t tcr_el1;
  107. uint64_t tcr_el2;
  108. uint64_t tcr_el3;
  109. uint64_t ttbr0_el1;
  110. uint64_t ttbr0_el2;
  111. uint64_t ttbr0_el3;
  112. uint64_t ttbr1_el1;
  113. uint64_t sp_el[4];
  114. };
  115. struct mrdump_crash_record {
  116. int reboot_mode;
  117. char msg[128];
  118. uint32_t fault_cpu;
  119. union {
  120. arm32_gregset_t arm32_regs;
  121. arm64_gregset_t arm64_regs;
  122. } cpu_regs[MRDUMP_CPU_MAX];
  123. union {
  124. struct arm32_ctrl_regs arm32_creg;
  125. struct arm64_ctrl_regs arm64_creg;
  126. } cpu_creg[MRDUMP_CPU_MAX];
  127. };
  128. struct mrdump_ksyms_param {
  129. char tag[4];
  130. uint32_t flag;
  131. uint32_t crc;
  132. uint64_t start_addr;
  133. uint32_t size;
  134. uint32_t addresses_off;
  135. uint32_t num_syms_off;
  136. uint32_t names_off;
  137. uint32_t markers_off;
  138. uint32_t token_table_off;
  139. uint32_t token_index_off;
  140. } __attribute__((packed));
  141. struct mrdump_machdesc {
  142. uint32_t nr_cpus;
  143. uint64_t page_offset;
  144. uint64_t high_memory;
  145. uint64_t kimage_vaddr;
  146. uint64_t dram_start;
  147. uint64_t dram_end;
  148. uint64_t kimage_stext;
  149. uint64_t kimage_etext;
  150. uint64_t kimage_stext_real;
  151. uint64_t kimage_voffset;
  152. uint64_t kimage_sdata;
  153. uint64_t kimage_edata;
  154. uint64_t vmalloc_start;
  155. uint64_t vmalloc_end;
  156. uint64_t modules_start;
  157. uint64_t modules_end;
  158. uint64_t phys_offset;
  159. uint64_t master_page_table;
  160. uint64_t memmap;
  161. uint64_t pageflags;
  162. uint32_t struct_page_size;
  163. uint64_t dfdmem_pa; // Reserved for DFD 3.0+
  164. struct mrdump_ksyms_param kallsyms;
  165. };
  166. struct __attribute__((__packed__)) mrdump_cblock_result {
  167. char sig[9];
  168. char status[128];
  169. char log_buf[2048];
  170. };
  171. struct mrdump_control_block {
  172. char sig[8];
  173. struct mrdump_machdesc machdesc;
  174. uint32_t machdesc_crc;
  175. uint32_t enabled;
  176. uint32_t output_fs_lbaooo;
  177. struct mrdump_crash_record crash_record;
  178. };
  179. struct kzip_file *kzip_open(void *handle, int (*write_cb)(void *handle, void *p, int size));
  180. bool kzip_add_file(struct kzip_file *zf, const struct kzip_addlist *addlist, const char *zfilename);
  181. bool kzip_close(struct kzip_file *zf);
  182. struct mrdump_dev {
  183. const char *name;
  184. void *handle;
  185. bool (*read)(struct mrdump_dev *dev, uint64_t sector_addr, uint8_t *pdBuf, int32_t blockLen);
  186. bool (*write)(struct mrdump_dev *dev, uint64_t sector_addr, uint8_t *pdBuf, int32_t blockLen);
  187. uint64_t (*get_size)(struct mrdump_dev *dev);
  188. };
  189. int mrdump_null_output(const struct mrdump_control_block *kparams, const struct kzip_addlist *memlist, const struct kzip_addlist *memlist_cmm);
  190. int mrdump_ext4_output(const struct mrdump_control_block *mrdump_cb, const struct kzip_addlist *memlist, const struct kzip_addlist *memlist_cmm, struct mrdump_dev *mrdump_dev);
  191. int mrdump_partition_output(const struct mrdump_control_block *mrdump_cb, const struct kzip_addlist *memlist, const struct kzip_addlist *memlist_cmm, struct mrdump_dev *mrdump_dev);
  192. int mrdump_usb_output(const struct mrdump_control_block *mrdump_cb, const struct kzip_addlist *memlist, const struct kzip_addlist *memlist_cmm);
  193. void mrdump_core_header_init(const struct mrdump_control_block *kparams, const struct kzip_addlist *memlist);
  194. struct kzip_addlist *mrdump_memlist_fill_cmm(struct mrdump_control_block *mrdump_cblock);
  195. void mrdump_memlist_free_cmm(struct kzip_addlist *memlist);
  196. struct mrdump_dev *mrdump_dev_blkpart(const char *partname);
  197. void mrdump_partition_resize(void);
  198. void mrdump_read_expdb(void *data, int len, u64 offset_src);
  199. extern u64 physical_memory_size(void);
  200. extern void mtk_wdt_disable(void);
  201. extern void mtk_wdt_init(void);
  202. int aee_mrdump_get_info(struct mrdump_control_block *mcb);
  203. int mrdump_get_default_output_device(void);
  204. #ifdef MTK_3LEVEL_PAGETABLE
  205. vaddr_t scratch_addr(void);
  206. #endif
  207. #endif