mrdump.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #if !defined(__MRDUMP_H__)
  2. #define __MRDUMP_H__
  3. #include <stdarg.h>
  4. #include <linux/elf.h>
  5. #include <linux/elfcore.h>
  6. #include <asm/ptrace.h>
  7. #include <mt-plat/aee.h>
  8. #ifdef __aarch64__
  9. #define reg_pc pc
  10. #define reg_lr regs[30]
  11. #define reg_sp sp
  12. #define reg_fp regs[29]
  13. #else
  14. #define reg_pc ARM_pc
  15. #define reg_lr ARM_lr
  16. #define reg_sp ARM_sp
  17. #define reg_ip ARM_ip
  18. #define reg_fp ARM_fp
  19. #endif
  20. #define MRDUMP_CPU_MAX 16
  21. #define MRDUMP_DEV_NULL 0
  22. #define MRDUMP_DEV_SDCARD 1
  23. #define MRDUMP_DEV_EMMC 2
  24. #define MRDUMP_FS_NULL 0
  25. #define MRDUMP_FS_VFAT 1
  26. #define MRDUMP_FS_EXT4 2
  27. #define MRDUMP_GO_DUMP "MRDUMP04"
  28. typedef uint32_t arm32_gregset_t[18];
  29. typedef uint64_t aarch64_gregset_t[34];
  30. struct mrdump_crash_record {
  31. int reboot_mode;
  32. char msg[128];
  33. char backtrace[512];
  34. uint32_t fault_cpu;
  35. union {
  36. arm32_gregset_t arm32_regs;
  37. aarch64_gregset_t aarch64_regs;
  38. } cpu_regs[MRDUMP_CPU_MAX];
  39. };
  40. struct mrdump_machdesc {
  41. uint32_t crc;
  42. uint32_t output_device;
  43. uint32_t nr_cpus;
  44. uint64_t page_offset;
  45. uint64_t high_memory;
  46. uint64_t vmalloc_start;
  47. uint64_t vmalloc_end;
  48. uint64_t modules_start;
  49. uint64_t modules_end;
  50. uint64_t phys_offset;
  51. uint64_t master_page_table;
  52. uint32_t output_fstype;
  53. uint32_t output_lbaooo;
  54. };
  55. struct mrdump_control_block {
  56. char sig[8];
  57. struct mrdump_machdesc machdesc;
  58. struct mrdump_crash_record crash_record;
  59. };
  60. /* NOTE!! any change to this struct should be compatible in aed */
  61. struct mrdump_mini_reg_desc {
  62. unsigned long reg; /* register value */
  63. unsigned long kstart; /* start kernel addr of memory dump */
  64. unsigned long kend; /* end kernel addr of memory dump */
  65. unsigned long pos; /* next pos to dump */
  66. int valid; /* 1: valid regiser, 0: invalid regiser */
  67. int pad; /* reserved */
  68. loff_t offset; /* offset in buffer */
  69. };
  70. /* it should always be smaller than MRDUMP_MINI_HEADER_SIZE */
  71. struct mrdump_mini_header {
  72. struct mrdump_mini_reg_desc reg_desc[ELF_NGREG];
  73. };
  74. #define MRDUMP_MINI_NR_SECTION 40
  75. #define MRDUMP_MINI_SECTION_SIZE (32 * 1024)
  76. #define NT_IPANIC_MISC 4095
  77. #define MRDUMP_MINI_NR_MISC 20
  78. struct mrdump_mini_elf_misc {
  79. unsigned long vaddr;
  80. unsigned long paddr;
  81. unsigned long start;
  82. unsigned long size;
  83. };
  84. #define NOTE_NAME_SHORT 12
  85. #define NOTE_NAME_LONG 20
  86. struct mrdump_mini_elf_psinfo {
  87. struct elf_note note;
  88. char name[NOTE_NAME_SHORT];
  89. struct elf_prpsinfo data;
  90. };
  91. struct mrdump_mini_elf_prstatus {
  92. struct elf_note note;
  93. char name[NOTE_NAME_SHORT];
  94. struct elf_prstatus data;
  95. };
  96. struct mrdump_mini_elf_note {
  97. struct elf_note note;
  98. char name[NOTE_NAME_LONG];
  99. struct mrdump_mini_elf_misc data;
  100. };
  101. struct mrdump_mini_elf_header {
  102. struct elfhdr ehdr;
  103. struct elf_phdr phdrs[MRDUMP_MINI_NR_SECTION];
  104. struct mrdump_mini_elf_psinfo psinfo;
  105. struct mrdump_mini_elf_prstatus prstatus[NR_CPUS + 1];
  106. struct mrdump_mini_elf_note misc[MRDUMP_MINI_NR_MISC];
  107. };
  108. #define MRDUMP_MINI_HEADER_SIZE ALIGN(sizeof(struct mrdump_mini_elf_header), PAGE_SIZE)
  109. #define MRDUMP_MINI_DATA_SIZE (MRDUMP_MINI_NR_SECTION * MRDUMP_MINI_SECTION_SIZE)
  110. #define MRDUMP_MINI_BUF_SIZE (MRDUMP_MINI_HEADER_SIZE + MRDUMP_MINI_DATA_SIZE)
  111. #ifdef CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR
  112. #define MRDUMP_MINI_BUF_PADDR (CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR + 0xf0000)
  113. #else
  114. #define MRDUMP_MINI_BUF_PADDR 0
  115. #endif
  116. #if defined(CONFIG_MTK_AEE_MRDUMP)
  117. void mrdump_reserve_memory(void);
  118. void __mrdump_create_oops_dump(AEE_REBOOT_MODE reboot_mode, struct pt_regs *regs, const char *msg,
  119. ...);
  120. void aee_kdump_reboot(AEE_REBOOT_MODE, const char *msg, ...);
  121. #else
  122. static inline void mrdump_reserve_memory(void)
  123. {
  124. }
  125. static inline void __mrdump_create_oops_dump(AEE_REBOOT_MODE reboot_mode, struct pt_regs *regs,
  126. const char *msg, ...)
  127. {
  128. }
  129. static inline void aee_kdump_reboot(AEE_REBOOT_MODE reboot_mode, const char *msg, ...)
  130. {
  131. }
  132. #endif
  133. typedef int (*mrdump_write)(void *buf, int off, int len, int encrypt);
  134. #if defined(CONFIG_MTK_AEE_IPANIC)
  135. int mrdump_mini_create_oops_dump(AEE_REBOOT_MODE reboot_mode, mrdump_write write,
  136. loff_t sd_offset, const char *msg, va_list ap);
  137. void mrdump_mini_reserve_memory(void);
  138. #else
  139. static inline int mrdump_mini_create_oops_dump(AEE_REBOOT_MODE reboot_mode, mrdump_write write,
  140. loff_t sd_offset, const char *msg, va_list ap)
  141. {
  142. return 0;
  143. }
  144. static inline void mrdump_mini_reserve_memory(void)
  145. {
  146. }
  147. #endif
  148. #endif