ipanic.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #if !defined(__AEE_IPANIC_H__)
  2. #define __AEE_IPANIC_H__
  3. #include <generated/autoconf.h>
  4. #include <linux/kallsyms.h>
  5. #include <linux/kmsg_dump.h>
  6. /* #include "staging/android/logger.h" */
  7. #include <mt-plat/aee.h>
  8. #include "ipanic_version.h"
  9. #define AEE_IPANIC_PLABEL "expdb"
  10. #ifdef CONFIG_MTK_GPT_SCHEME_SUPPORT
  11. #define AEE_EXPDB_PATH "/dev/block/platform/mtk-msdc.0/by-name/expdb"
  12. #else
  13. #define AEE_EXPDB_PATH "/dev/expdb"
  14. #endif
  15. #define IPANIC_MODULE_TAG "KERNEL-PANIC"
  16. #define AEE_IPANIC_MAGIC 0xaee0dead
  17. #define AEE_IPANIC_PHDR_VERSION 0x10
  18. #define IPANIC_NR_SECTIONS 32
  19. #if (AEE_IPANIC_PHDR_VERSION >= 0x10)
  20. #define IPANIC_USERSPACE_READ 1
  21. #endif
  22. #define AEE_LOG_LEVEL 8
  23. #define LOG_DEBUG(fmt, ...) \
  24. do { \
  25. if (aee_in_nested_panic()) \
  26. aee_nested_printf(fmt, ##__VA_ARGS__); \
  27. else \
  28. pr_debug(fmt, ##__VA_ARGS__); \
  29. } while (0)
  30. #define LOG_ERROR(fmt, ...) \
  31. do { \
  32. if (aee_in_nested_panic()) \
  33. aee_nested_printf(fmt, ##__VA_ARGS__); \
  34. else \
  35. pr_err(fmt, ##__VA_ARGS__); \
  36. } while (0)
  37. #define LOGV(fmt, msg...)
  38. #define LOGD LOG_DEBUG
  39. #define LOGI LOG_DEBUG
  40. #define LOGW LOG_ERROR
  41. #define LOGE LOG_ERROR
  42. struct ipanic_data_header {
  43. u32 type; /* data type(0-31) */
  44. u32 valid; /* set to 1 when dump succeded */
  45. u32 offset; /* offset in EXPDB partition */
  46. u32 used; /* valid data size */
  47. u32 total; /* allocated partition size */
  48. u32 encrypt; /* data encrypted */
  49. u64 id;
  50. /* u32 raw; raw data or plain text */
  51. /* u32 compact; data and header in same block, to save space */
  52. u8 name[32];
  53. };
  54. struct ipanic_header {
  55. /* The magic/version field cannot be moved or resize */
  56. u32 magic;
  57. u32 version; /* ipanic version */
  58. u32 size; /* ipanic_header size */
  59. u32 datas; /* bitmap of data sections dumped */
  60. u32 dhblk; /* data header blk size, 0 if no dup data headers */
  61. u32 blksize;
  62. u32 partsize; /* expdb partition total size */
  63. u32 bufsize;
  64. u64 buf;
  65. struct ipanic_data_header data_hdr[IPANIC_NR_SECTIONS];
  66. };
  67. #define IPANIC_MMPROFILE_LIMIT 0x220000
  68. struct ipanic_ops {
  69. struct aee_oops *(*oops_copy)(void);
  70. void (*oops_free)(struct aee_oops *oops, int erase);
  71. };
  72. void register_ipanic_ops(struct ipanic_ops *op);
  73. struct aee_oops *ipanic_oops_copy(void);
  74. void ipanic_oops_free(struct aee_oops *oops, int erase);
  75. void ipanic_block_scramble(u8 *buf, int buflen);
  76. /* for WDT timeout case : dump timer/schedule/irq/softirq etc... debug information */
  77. extern void aee_wdt_dump_info(void);
  78. extern int mt_dump_wq_debugger(void);
  79. void aee_disable_api(void);
  80. int panic_dump_android_log(char *buf, size_t size, int type);
  81. /* User space process support functions */
  82. #define MAX_NATIVEINFO (32 * 1024)
  83. #define MAX_NATIVEHEAP 2048
  84. extern char NativeInfo[MAX_NATIVEINFO]; /* check that 32k is enought?? */
  85. extern unsigned long User_Stack[MAX_NATIVEHEAP]; /* 8K Heap */
  86. int DumpNativeInfo(void);
  87. /*
  88. * Since ipanic_detail and usersapce info size is not known
  89. * until run time, we do a guess here
  90. */
  91. #define IPANIC_DETAIL_USERSPACE_SIZE (100 * 1024)
  92. #if 1
  93. #ifdef CONFIG_MTK_AEE_IPANIC_TYPES
  94. #define IPANIC_DT_DUMP CONFIG_MTK_AEE_IPANIC_TYPES
  95. #else
  96. #define IPANIC_DT_DUMP 0x0fffffff
  97. #endif
  98. #define IPANIC_DT_ENCRYPT 0xfffffffe
  99. enum IPANIC_DT {
  100. IPANIC_DT_HEADER = 0,
  101. IPANIC_DT_KERNEL_LOG = 1,
  102. IPANIC_DT_WDT_LOG,
  103. IPANIC_DT_WQ_LOG,
  104. IPANIC_DT_CURRENT_TSK = 6,
  105. IPANIC_DT_OOPS_LOG,
  106. IPANIC_DT_MINI_RDUMP = 8,
  107. IPANIC_DT_MMPROFILE,
  108. IPANIC_DT_MAIN_LOG,
  109. IPANIC_DT_SYSTEM_LOG,
  110. IPANIC_DT_EVENTS_LOG,
  111. IPANIC_DT_RADIO_LOG,
  112. IPANIC_DT_LAST_LOG,
  113. IPANIC_DT_ATF_LOG,
  114. IPANIC_DT_DISP_LOG,
  115. IPANIC_DT_RAM_DUMP = 28,
  116. IPANIC_DT_SHUTDOWN_LOG = 30,
  117. IPANIC_DT_RESERVED31 = 31,
  118. };
  119. struct ipanic_memory_block {
  120. unsigned long kstart; /* start kernel addr of memory dump */
  121. unsigned long kend; /* end kernel addr of memory dump */
  122. unsigned long pos; /* next pos to dump */
  123. unsigned long reserved; /* reserved */
  124. };
  125. struct ipanic_dt_op {
  126. char string[32];
  127. int size;
  128. int (*next)(void *data, unsigned char *buffer, size_t sz_buf);
  129. };
  130. struct ipanic_atf_log_rec {
  131. size_t total_size;
  132. size_t has_read;
  133. unsigned long start_idx;
  134. };
  135. #define ipanic_dt_encrypt(x) ((IPANIC_DT_ENCRYPT >> x) & 1)
  136. #define ipanic_dt_active(x) ((IPANIC_DT_DUMP >> x) & 1)
  137. /* copy from kernel/drivers/staging/android/logger.h */
  138. /*
  139. SMP porting, we double the android buffer
  140. * and kernel buffer size for dual core
  141. */
  142. #ifdef CONFIG_SMP
  143. #ifndef __MAIN_BUF_SIZE
  144. #define __MAIN_BUF_SIZE (256 * 1024)
  145. #endif
  146. #ifndef __EVENTS_BUF_SIZE
  147. #define __EVENTS_BUF_SIZE (256 * 1024)
  148. #endif
  149. #ifndef __RADIO_BUF_SIZE
  150. #define __RADIO_BUF_SIZE (256 * 1024)
  151. #endif
  152. #ifndef __SYSTEM_BUF_SIZE
  153. #define __SYSTEM_BUF_SIZE (256 * 1024)
  154. #endif
  155. #else
  156. #ifndef __MAIN_BUF_SIZE
  157. #define __MAIN_BUF_SIZE (256 * 1024)
  158. #endif
  159. #ifndef __EVENTS_BUF_SIZE
  160. #define __EVENTS_BUF_SIZE (256 * 1024)
  161. #endif
  162. #ifndef __RADIO_BUF_SIZE
  163. #define __RADIO_BUF_SIZE (64 * 1024)
  164. #endif
  165. #ifndef __SYSTEM_BUF_SIZE
  166. #define __SYSTEM_BUF_SIZE (64 * 1024)
  167. #endif
  168. #endif
  169. #ifndef __LOG_BUF_LEN
  170. #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
  171. #endif
  172. #define OOPS_LOG_LEN __LOG_BUF_LEN
  173. #define WDT_LOG_LEN __LOG_BUF_LEN
  174. #define LAST_LOG_LEN (AEE_LOG_LEVEL == 8 ? __LOG_BUF_LEN : 32*1024)
  175. #define ATF_LOG_SIZE (32*1024)
  176. #define DISP_LOG_SIZE (30*16*1024)
  177. char *expdb_read_size(int off, int len);
  178. char *ipanic_read_size(int off, int len);
  179. int ipanic_write_size(void *buf, int off, int len);
  180. void ipanic_erase(void);
  181. struct ipanic_header *ipanic_header(void);
  182. void ipanic_msdc_init(void);
  183. int ipanic_msdc_info(struct ipanic_header *iheader);
  184. void ipanic_log_temp_init(void);
  185. void ipanic_klog_region(struct kmsg_dumper *dumper);
  186. int ipanic_klog_buffer(void *data, unsigned char *buffer, size_t sz_buf);
  187. extern int ipanic_atflog_buffer(void *data, unsigned char *buffer, size_t sz_buf);
  188. extern int panic_dump_disp_log(void *data, unsigned char *buffer, size_t sz_buf);
  189. int ipanic_mem_write(void *buf, int off, int len, int encrypt);
  190. void *ipanic_data_from_sd(struct ipanic_data_header *dheader, int encrypt);
  191. struct ipanic_header *ipanic_header_from_sd(unsigned int offset, unsigned int magic);
  192. #endif
  193. extern int card_dump_func_read(unsigned char *buf, unsigned int len, unsigned long long offset,
  194. int dev);
  195. extern int card_dump_func_write(unsigned char *buf, unsigned int len, unsigned long long offset,
  196. int dev);
  197. extern unsigned int reset_boot_up_device(int type); /* force to re-initialize the emmc host controller */
  198. /*#ifdef CONFIG_MTK_MMPROFILE_SUPPORT*/
  199. #ifdef CONFIG_MMPROFILE
  200. extern unsigned int MMProfileGetDumpSize(void);
  201. extern void MMProfileGetDumpBuffer(unsigned int Start, unsigned int *pAddr, unsigned int *pSize);
  202. #endif
  203. extern void mrdump_mini_per_cpu_regs(int cpu, struct pt_regs *regs);
  204. extern void mrdump_mini_ke_cpu_regs(struct pt_regs *regs);
  205. extern void mrdump_mini_add_misc(unsigned long addr, unsigned long size, unsigned long start,
  206. char *name);
  207. extern void mrdump_mini_ipanic_done(void);
  208. extern int mrdump_task_info(unsigned char *buffer, size_t sz_buf);
  209. extern void aee_rr_rec_exp_type(unsigned int type);
  210. extern unsigned int aee_rr_curr_exp_type(void);
  211. #ifdef CONFIG_SCHED_DEBUG
  212. extern int sysrq_sched_debug_show_at_AEE(void);
  213. #endif
  214. #endif