mrdump_dbgscript.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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. #include <stdarg.h>
  32. #include <stdint.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include "aee.h"
  36. #include "mrdump_private.h"
  37. /* mdrump string file to uart log*/
  38. /* #define DEBUG_MRDUMP_PRINTF */
  39. #define MRDUMP_STR_BUFF_LEN (1024*100) /* 100Kib*/
  40. static struct _mrdump_string_buf {
  41. char* buf;
  42. int len;
  43. int wpos;
  44. } mrdump_string_buf = {
  45. .buf = NULL,
  46. .len = 0,
  47. .wpos = 0
  48. };
  49. extern int g_is_64bit_kernel;
  50. static void init_mrdump_string_buf(void)
  51. {
  52. dprintf(CRITICAL, "%s\n", __func__);
  53. if (mrdump_string_buf.buf) {
  54. dprintf(CRITICAL, "[ERROR]MT-RAMDUMP: mrdump_string_buf has already initialized(mrdump_string_wbuf.buf!=NULL)\n");
  55. return;
  56. }
  57. mrdump_string_buf.buf = malloc(MRDUMP_STR_BUFF_LEN);
  58. if (!mrdump_string_buf.buf) {
  59. dprintf(CRITICAL, "[ERROR]MT-RAMDUMP: faild to allocate mrdump_string_buf\n");
  60. return;
  61. }
  62. memset(mrdump_string_buf.buf, 0, MRDUMP_STR_BUFF_LEN);
  63. mrdump_string_buf.len = MRDUMP_STR_BUFF_LEN;
  64. mrdump_string_buf.wpos = 0;
  65. }
  66. static void uninit_mrdump_string_buf(void)
  67. {
  68. dprintf(CRITICAL, "%s\n", __func__);
  69. if(mrdump_string_buf.buf)
  70. free(mrdump_string_buf.buf);
  71. memset(&mrdump_string_buf, 0, sizeof(mrdump_string_buf));
  72. }
  73. static int mrdump_vsprintf(const char *fmt, va_list ap)
  74. {
  75. int wcnt, wmax;
  76. char* buf;
  77. if(mrdump_string_buf.buf == NULL)
  78. return 0;
  79. if(mrdump_string_buf.len<=mrdump_string_buf.wpos) {
  80. dprintf(CRITICAL, "Error: exceed mrdump_string_buf(%d,%d)\n", mrdump_string_buf.len, mrdump_string_buf.wpos);
  81. return 0;
  82. }
  83. buf = &mrdump_string_buf.buf[mrdump_string_buf.wpos];
  84. wmax = mrdump_string_buf.len-mrdump_string_buf.wpos;
  85. wcnt = vsnprintf(buf, wmax, fmt, ap);
  86. if(wcnt < 0) {
  87. dprintf(CRITICAL, "Error: invalid wcnt(%d)\n", wcnt);
  88. return 0;
  89. }
  90. mrdump_string_buf.wpos += wcnt;
  91. #ifdef DEBUG_MRDUMP_PRINTF /* cmm to uart log */
  92. dputs(CRITICAL,buf);
  93. #endif
  94. return wcnt;
  95. }
  96. static int mrdump_printf(const char *fmt, ...)
  97. {
  98. int w;
  99. va_list args;
  100. va_start(args, fmt);
  101. w = mrdump_vsprintf(fmt, args);
  102. va_end(args);
  103. return w;
  104. }
  105. static struct mrdump_machdesc* aee_get_machdesc_from_cb(struct mrdump_control_block *mrdump_cblock)
  106. {
  107. if (mrdump_cblock)
  108. return &mrdump_cblock->machdesc;
  109. dprintf(CRITICAL, "Error: aee_get_machdesc_from_cb\n");
  110. return NULL;
  111. }
  112. static struct mrdump_ksyms_param* aee_get_ksyms_from_cb(struct mrdump_control_block *mrdump_cblock)
  113. {
  114. struct mrdump_machdesc* mach;
  115. if (mrdump_cblock) {
  116. mach = &mrdump_cblock->machdesc;
  117. if(mach)
  118. return &mach->kallsyms;
  119. }
  120. dprintf(CRITICAL, "Error: aee_get_ksyms_from_cb\n");
  121. return NULL;
  122. }
  123. static void print_file_dialog_cmm(char* title, char* msg, char* file_path)
  124. {
  125. mrdump_printf(" dialog.view\n");
  126. mrdump_printf(" (\n");
  127. mrdump_printf(" header \"%s\"\n", title);
  128. mrdump_printf(" pos 0. 0. 30. 3.\n");
  129. mrdump_printf(" box \"%s\"\n", msg);
  130. mrdump_printf(" pos 1. 1. 20. 1.\n");
  131. mrdump_printf("%s: defedit \"\" \"\"\n", file_path);
  132. mrdump_printf(" pos 22. 1. 7. 1.\n");
  133. mrdump_printf(" button \"Browse...\"\n");
  134. mrdump_printf(" (\n");
  135. mrdump_printf(" dialog.file \"*.*\"\n");
  136. mrdump_printf(" entry %%line &file\n");
  137. mrdump_printf(" dialog.set %s \"&file\"\n", file_path);
  138. mrdump_printf(" )\n");
  139. mrdump_printf(" pos 6. 3. 7. 1.\n");
  140. mrdump_printf(" defbutton \"Ok\"\n");
  141. mrdump_printf(" ( \n");
  142. mrdump_printf(" &%s=dialog.string(%s)\n", file_path, file_path);
  143. mrdump_printf(" continue\n");
  144. mrdump_printf(" )\n");
  145. mrdump_printf(" pos 17. 3. 7. 1.\n");
  146. mrdump_printf(" button \"Cancel\" \"continue\"\n");
  147. mrdump_printf(" )\n");
  148. mrdump_printf(" STOP\n");
  149. mrdump_printf(" dialog.end\n");
  150. }
  151. extern bool ram_console_get_kaslr_offset(uint64_t* kaslr_offset);
  152. static void print_pre_cmm(struct mrdump_control_block *mrdump_cblock)
  153. {
  154. struct mrdump_machdesc* machd = aee_get_machdesc_from_cb(mrdump_cblock);
  155. uint64_t kaslr_offset = 0;
  156. bool kaslr_valid;
  157. kaslr_valid = ram_console_get_kaslr_offset(&kaslr_offset);
  158. mrdump_printf("B::AREA\n");
  159. mrdump_printf("local &vmlinux_file\n");
  160. mrdump_printf("&vmlinux_file=\".\\vmlinux\"\n");
  161. mrdump_printf("IF OS.FILE(\"&vmlinux_file\")!=TRUE()\n");
  162. mrdump_printf("(\n");
  163. print_file_dialog_cmm("Load Vmlinux", "File path", "vmlinux_file");
  164. mrdump_printf(")\n\n");
  165. mrdump_printf("local &ramdump_elf_core_file\n");
  166. mrdump_printf("&ramdump_elf_core_file=\".\\SYS_COREDUMP\"\n");
  167. mrdump_printf("IF OS.FILE(\"&ramdump_elf_core_file\")!=TRUE()\n");
  168. mrdump_printf("(\n");
  169. print_file_dialog_cmm("Load RAMDUMP(Core ELF)", "File path", "ramdump_elf_core_file");
  170. mrdump_printf(")\n\n");
  171. /*T32 cmm: pre-setting*/
  172. mrdump_printf("sys.res\n");
  173. mrdump_printf("sys.cpu %s\n", g_is_64bit_kernel ? "CortexA53":"CortexA7MPCore");
  174. mrdump_printf("sys.config.cn %d\n", machd->nr_cpus);
  175. mrdump_printf("core.num %d\n", machd->nr_cpus);
  176. mrdump_printf("sys.o mmuspaces on\n");
  177. mrdump_printf("sys.u\n");
  178. mrdump_printf("title os.pwd()\n\n");
  179. mrdump_printf("d.load.e &vmlinux_file 0x%llx\n", kaslr_offset);
  180. mrdump_printf("&vmlinux_banner=V.STRING(linux_banner)\n");
  181. mrdump_printf("&vmlinux_banner_len=STRing.LENgth(\"&vmlinux_banner\")\n");
  182. mrdump_printf("&vmlinux_build_time=STRing.SPLIT(V.STRING(&linux_banner[200]),\"#\", -1)\n");
  183. mrdump_printf("d.load.e &ramdump_elf_core_file /nc /ny /physload\n\n");
  184. if(kaslr_valid)
  185. mrdump_printf("PRINT \"OK!, kaslr_offset is valid\"\n");
  186. else
  187. mrdump_printf("PRINT %%ERROR \"kaslr_offset IS NOT valid\"\n");
  188. mrdump_printf("\n");
  189. }
  190. static void print_post_cmm(struct mrdump_control_block *mrdump_cblock)
  191. {
  192. struct mrdump_crash_record* cr;
  193. struct mrdump_machdesc* mach;
  194. if (mrdump_cblock) {
  195. mach = &mrdump_cblock->machdesc;
  196. cr = &mrdump_cblock->crash_record;
  197. }
  198. else {
  199. mrdump_printf(";error mrdump_core_context_to_klog : mrdump_cblock=NULL\n");
  200. return;
  201. }
  202. mrdump_printf("; select fault cpu\n");
  203. mrdump_printf("core.select %u\n", cr->fault_cpu);
  204. /* the common address range for all processes and is everything above the process address range
  205. whole kernel address space including module */
  206. if (g_is_64bit_kernel) {
  207. mrdump_printf("mmu.format linuxswap3 swapper_pg_dir 0x%016llx--0xffffffffffffffff 0x%016llx\n",
  208. mach->page_offset, mach->dram_start);
  209. /* 0xFFFFFF8000000000--0xFFFFFFFFFFFFFFFF */
  210. mrdump_printf("trans.common 0x%016llx--0xffffffffffffffff \n",
  211. MIN(mach->page_offset, mach->modules_start));
  212. }
  213. else {
  214. mrdump_printf("mmu.format linuxswap3 swapper_pg_dir 0x%08x--0xffffffff 0x%x\n",
  215. (uint32_t)(mach->page_offset & 0xffffffff), (uint32_t)(mach->dram_start & 0xffffffff));
  216. /* trans.common 0xBF000000--0xFFFFFFFF */
  217. mrdump_printf("trans.common 0x%08x--0xffffffff \n",
  218. (uint32_t)(MIN(mach->page_offset, mach->modules_start) & 0xffffffff));
  219. }
  220. mrdump_printf("trans.tw on\n");
  221. mrdump_printf("trans.on\n");
  222. mrdump_printf("mmu.scan\n\n");
  223. /* show kernel pagetable */
  224. mrdump_printf("mmu.list.pagetable 0x%llx\n\n", mach->page_offset);
  225. if (g_is_64bit_kernel) {
  226. mrdump_printf("; load the awareness for Linux-3.x on ARM\n");
  227. mrdump_printf("TASK.CONFIG ~~/demo/arm64/kernel/linux/linux-3.x/linux3.t32\n");
  228. mrdump_printf("; load Linux menu:\n");
  229. mrdump_printf("MENU.ReProgram ~~/demo/arm64/kernel/linux/linux-3.x/linux.men\n");
  230. mrdump_printf("task.dmesg\n\n");
  231. }
  232. else {
  233. mrdump_printf("; load the awareness for Linux-3.x on ARM\n");
  234. mrdump_printf("TASK.CONFIG ~~/demo/arm/kernel/linux/linux-3.x/linux3.t32\n");
  235. mrdump_printf("; load Linux menu:\n");
  236. mrdump_printf("MENU.ReProgram ~~/demo/arm/kernel/linux/linux-3.x/linux.men\n");
  237. mrdump_printf("task.dmesg\n\n");
  238. }
  239. }
  240. static void print_verify_view_cmm(struct mrdump_crash_record* cr)
  241. {
  242. /* verify linux_banner */
  243. mrdump_printf("&ramdump_banner=V.STRING(linux_banner)\n");
  244. mrdump_printf("&t32_max_strlen=255.\n");
  245. mrdump_printf("IF &vmlinux_banner_len>=&t32_max_strlen\n");
  246. mrdump_printf("(\n");
  247. mrdump_printf("\t&ramdump_build_time=STRing.SPLIT(V.STRING(&linux_banner[200]),\"#\", -1)\n\n");
  248. mrdump_printf("\tPRINT %%ERROR \"vmlinux banner : [#&vmlinux_build_time] &vmlinux_banner\"\n");
  249. mrdump_printf("\tPRINT %%ERROR \"ramdump banner : [#&ramdump_build_time] &ramdump_banner\"\n\n");
  250. mrdump_printf("\tIF (\"&vmlinux_banner\"!=\"&ramdump_banner\")\n");
  251. mrdump_printf("\t(\n");
  252. mrdump_printf("\t PRINT %%ERROR \"!!!!!!!!! No maching vmlinux symbol and dump binary...\"\n");
  253. mrdump_printf("\t PRINT %%ERROR \"or check your mmu settting...\"\n");
  254. mrdump_printf("\t ENDDO\n");
  255. mrdump_printf("\t)\n\n");
  256. mrdump_printf("\tIF (\"&ramdump_build_time\"!=\"&vmlinux_build_time\")\n");
  257. mrdump_printf("\t(\n");
  258. mrdump_printf("\t PRINT %%ERROR \"!!!!!!!!! No maching build time !!!!!!!!!\"\n");
  259. mrdump_printf("\t PRINT %%ERROR \"check binary and vmlinux build time\"\n");
  260. mrdump_printf("\t PRINT %%ERROR \"Symbole build time : #&vmlinux_build_time\"\n");
  261. mrdump_printf("\t PRINT %%ERROR \"RAMDUM build time : #&ramdump_build_time\"\n");
  262. mrdump_printf("\t)\n\n");
  263. mrdump_printf(")\n");
  264. mrdump_printf("ELSE\n");
  265. mrdump_printf("(\n");
  266. mrdump_printf("\tPRINT %%ERROR \"vmlinux banner : &vmlinux_banner\"\n");
  267. mrdump_printf("\tPRINT %%ERROR \"ramdump banner : &ramdump_banner\"\n");
  268. mrdump_printf("\tIF (\"&vmlinux_banner\"!=\"&ramdump_banner\")\n");
  269. mrdump_printf("\t(\n");
  270. mrdump_printf("\t\tPRINT %%ERROR \"!!!!!!!!! No maching vmlinux symbol and dump binary...\"\n");
  271. mrdump_printf("\t\tPRINT %%ERROR \"or check your mmu settting...\"\n");
  272. mrdump_printf("\t\tENDDO\n");
  273. mrdump_printf("\t)\n");
  274. mrdump_printf(")\n");
  275. /* windows layout */
  276. mrdump_printf(";y.l.sec\n");
  277. mrdump_printf("l\nr\nf\n");
  278. mrdump_printf("WinPOS 0.0 0.0 100. 6. 0. 0. W000\n");
  279. mrdump_printf("AREA\n");
  280. mrdump_printf("ENDDO\n");
  281. }
  282. static void print_arm64regs_cmm(struct mrdump_crash_record* cr, int nr_cpu)
  283. {
  284. char msg[128+32];
  285. struct arm64_ctrl_regs* pcore_sysr;
  286. uint64_t* pcore_cpur;
  287. int i, cpu;
  288. if (!cr)
  289. return;
  290. if (snprintf(msg, sizeof(msg), ";%s\n", cr->msg)>0)
  291. mrdump_printf(msg);
  292. for (cpu=0; cpu<nr_cpu; cpu++) {
  293. mrdump_printf("; CPU%d's Registers\n", cpu);
  294. mrdump_printf("core.select %d\n", cpu);
  295. /* print cpu registers */
  296. pcore_cpur = &cr->cpu_regs[cpu].arm64_regs[0];
  297. for(i=0; i<31; i++) {
  298. mrdump_printf("R.S X%d 0x%016llx\n", i, pcore_cpur[i]);
  299. }
  300. mrdump_printf("R.S SP 0x%016llx\n", pcore_cpur[i++]);
  301. mrdump_printf("R.S PC 0x%016llx\n", pcore_cpur[i++]);
  302. mrdump_printf("R.S CPSR 0x%llx\n", pcore_cpur[i++]/*pstate*/);
  303. mrdump_printf("; END CPU Regs\n");
  304. /*MMU registers*/
  305. pcore_sysr = &cr->cpu_creg[cpu].arm64_creg;
  306. mrdump_printf("; CPU%d's MMU & System Control Registers\n", cpu);
  307. mrdump_printf("PER.Set SPR:0x30200 %%QUAD 0x%016llx ;TTBR0_EL1\n", pcore_sysr->ttbr0_el1);
  308. mrdump_printf("PER.Set SPR:0x34200 %%QUAD 0x%016llx ;TTBR0_EL2\n", pcore_sysr->ttbr0_el2);
  309. mrdump_printf("PER.Set SPR:0x36200 %%QUAD 0x%016llx ;TTBR0_EL3\n", pcore_sysr->ttbr0_el3);
  310. mrdump_printf("PER.Set SPR:0x30201 %%QUAD 0x%016llx ;TTBR1_EL1\n", pcore_sysr->ttbr1_el1);
  311. mrdump_printf("PER.Set SPR:0x30100 %%QUAD 0x%08x ;SCTLR_EL1\n", pcore_sysr->sctlr_el1);
  312. mrdump_printf("PER.Set SPR:0x34100 %%QUAD 0x%08x ;SCTLR_EL2\n", pcore_sysr->sctlr_el2);
  313. mrdump_printf("PER.Set SPR:0x36100 %%QUAD 0x%08x ;SCTLR_EL3\n", pcore_sysr->sctlr_el3);
  314. mrdump_printf("PER.Set SPR:0x30202 %%QUAD 0x%016llx ;TCR_EL1\n", pcore_sysr->tcr_el1);
  315. mrdump_printf("PER.Set SPR:0x34202 %%QUAD 0x%016llx ;TCR_EL2\n", pcore_sysr->tcr_el2);
  316. mrdump_printf("PER.Set SPR:0x36202 %%QUAD 0x%016llx ;TCR_EL3\n", pcore_sysr->tcr_el3);
  317. for(i=0; i<4; i++) {
  318. mrdump_printf("R.S sp_el%d 0x%016llx\n", i, pcore_sysr->sp_el[i]);
  319. }
  320. mrdump_printf("; END MMU & SCTLR\n");
  321. }
  322. }
  323. static void print_arm32regs_cmm(struct mrdump_crash_record* cr, int nr_cpu)
  324. {
  325. char msg[128+32];
  326. struct arm32_ctrl_regs* pcore_sysr;
  327. uint32_t * pcore_cpur;
  328. int i, cpu;
  329. if (!cr)
  330. return;
  331. if (snprintf(msg, sizeof(msg), ";%s\n", cr->msg)>0)
  332. mrdump_printf(msg);
  333. for (cpu=0; cpu<nr_cpu; cpu++) {
  334. mrdump_printf("; CPU%d's Registers\n", cpu);
  335. mrdump_printf("core.select %d\n", cpu);
  336. /* print cpu registers */
  337. pcore_cpur = &cr->cpu_regs[cpu].arm32_regs[0];
  338. for(i=0; i<15; i++) {
  339. mrdump_printf("R.S r%d 0x%08x\n", i, pcore_cpur[i]);
  340. }
  341. i=15;
  342. mrdump_printf("R.S PC 0x%08x\n", pcore_cpur[i++]);
  343. mrdump_printf("R.S CPSR 0x%08x\n", pcore_cpur[i++]/*pstate*/);
  344. mrdump_printf("; END CPU Regs\n");
  345. /*MMU registers*/
  346. pcore_sysr = &cr->cpu_creg[cpu].arm32_creg;
  347. mrdump_printf("; CPU%d's MMU & System Control Registers\n", cpu);
  348. mrdump_printf("PER.Set.simple C15:0x1 %%Long 0x%08x ;SCTRL\n", pcore_sysr->sctlr);
  349. mrdump_printf("PER.Set.simple C15:0x202 %%Long 0x%08x ;TTBCR\n", (uint32_t)pcore_sysr->ttbcr);
  350. mrdump_printf("PER.Set.simple C15:0x2 %%Long 0x%08x ;TTBR0\n", (uint32_t)pcore_sysr->ttbr0);
  351. mrdump_printf("PER.Set.simple C15:0x102 %%Long 0x%08x ;TTBR1\n", (uint32_t)pcore_sysr->ttbr1);
  352. mrdump_printf("; END MMU & SCTLR\n");
  353. }
  354. }
  355. static void print_mrdump_machdesc(struct mrdump_control_block *mrdump_cblock)
  356. {
  357. struct mrdump_machdesc* mach;
  358. struct mrdump_ksyms_param* kallsym;
  359. char tag[5];
  360. if (mrdump_cblock) {
  361. mach = &mrdump_cblock->machdesc;
  362. kallsym = &mach->kallsyms;
  363. }
  364. else {
  365. mrdump_printf(";error mrdump_core_context_to_klog : mrdump_cblock=NULL\n");
  366. return;
  367. }
  368. mrdump_printf(";\n;*** mrdump_machdesc ***\n");
  369. mrdump_printf(";nr_cpus=%u\n", mach->nr_cpus);
  370. mrdump_printf(";page_offset = 0x%llx\n", mach->page_offset);
  371. mrdump_printf(";high_memory = 0x%llx\n", mach->high_memory);
  372. mrdump_printf(";kimage_vaddr = 0x%llx\n", mach->kimage_vaddr);
  373. mrdump_printf(";dram_start = 0x%llx\n", mach->dram_start);
  374. mrdump_printf(";dram_end = 0x%llx\n", mach->dram_end);
  375. mrdump_printf(";kimage_stext = 0x%llx\n", mach->kimage_stext);
  376. mrdump_printf(";kimage_etext = 0x%llx\n", mach->kimage_etext);
  377. mrdump_printf(";kimage_stext_real = 0x%llx\n", mach->kimage_stext_real);
  378. mrdump_printf(";kimage_voffset = 0x%llx\n", mach->kimage_voffset);
  379. mrdump_printf(";kimage_sdata = 0x%llx\n", mach->kimage_sdata);
  380. mrdump_printf(";kimage_edata = 0x%llx\n", mach->kimage_edata);
  381. mrdump_printf(";vmalloc_start = 0x%llx\n", mach->vmalloc_start);
  382. mrdump_printf(";vmalloc_end = 0x%llx\n", mach->vmalloc_end);
  383. mrdump_printf(";module_start = 0x%llx\n", mach->modules_start);
  384. mrdump_printf(";module_end = 0x%llx\n", mach->modules_end);
  385. mrdump_printf(";phys_offset = 0x%llx\n", mach->phys_offset);
  386. mrdump_printf(";master_page_table = 0x%llx\n", mach->master_page_table);
  387. mrdump_printf(";memmap = 0x%llx\n", mach->memmap);
  388. mrdump_printf(";dfdmem_pa = 0x%llx\n", mach->dfdmem_pa);
  389. memcpy(tag, kallsym->tag,4);
  390. tag[4] = '\0';
  391. mrdump_printf(";ksyms.tag=%s\n", tag);
  392. mrdump_printf(";ksyms.flag=0x%x(%s)\n", kallsym->flag, kallsym->flag==1?"KSYM_32":"KSYM_64");
  393. mrdump_printf(";ksyms.crc=0x%x\n", kallsym->crc);
  394. mrdump_printf(";ksyms.start_addr=0x%llx\n", kallsym->start_addr);
  395. mrdump_printf(";ksyms.size=0x%x\n", kallsym->size);
  396. mrdump_printf(";ksyms.address_off=0x%x\n", kallsym->addresses_off);
  397. mrdump_printf(";ksyms.num_syms_off=0x%x\n", kallsym->num_syms_off);
  398. mrdump_printf(";ksyms.names_off=0x%x\n", kallsym->names_off);
  399. mrdump_printf(";ksyms.markers_off=0x%x\n", kallsym->markers_off);
  400. mrdump_printf(";ksyms.token_table_off=0x%x\n", kallsym->token_table_off);
  401. mrdump_printf(";ksyms.token_index_off=0x%x\n", kallsym->token_index_off);
  402. }
  403. static void gen_cmm(struct mrdump_control_block *mrdump_cblock)
  404. {
  405. struct mrdump_crash_record *crash_record;
  406. if (mrdump_cblock) {
  407. crash_record = &mrdump_cblock->crash_record;
  408. }
  409. else {
  410. dprintf(CRITICAL, "error mrdump_core_context_to_klog : mrdump_cblock=NULL\n");
  411. return;
  412. }
  413. dprintf(CRITICAL, "%s:mrdump_cblock=%p, crach_record=%p\n",__func__, mrdump_cblock, crash_record);
  414. dprintf(CRITICAL, "crash_recode msg: %s\n", crash_record->msg);
  415. #if 0 /* show mem layout */
  416. print_mrdump_machdesc(mrdump_cblock);
  417. #endif
  418. mrdump_printf(";******************************************************\n");
  419. mrdump_printf(";* CMM for Linux arch=%s [%s]*\n",
  420. g_is_64bit_kernel ? "arm64":"arm(32)", crash_record->msg);
  421. mrdump_printf(";******************************************************\n");
  422. print_pre_cmm(mrdump_cblock);
  423. if(g_is_64bit_kernel)
  424. print_arm64regs_cmm(&mrdump_cblock->crash_record, mrdump_cblock->machdesc.nr_cpus);
  425. else
  426. print_arm32regs_cmm(&mrdump_cblock->crash_record, mrdump_cblock->machdesc.nr_cpus);
  427. mrdump_printf("; select fault cpu\n");
  428. mrdump_printf("core.select %u\n", mrdump_cblock->crash_record.fault_cpu);
  429. print_post_cmm(mrdump_cblock);
  430. print_verify_view_cmm(&mrdump_cblock->crash_record);
  431. mrdump_printf(";******************************************************\n");
  432. mrdump_printf(";* End CMM \n");
  433. mrdump_printf(";******************************************************\n");
  434. }
  435. static void mrdump_cmm_gen(struct mrdump_control_block *mrdump_cblock)
  436. {
  437. init_mrdump_string_buf();
  438. gen_cmm(mrdump_cblock);
  439. }
  440. struct kzip_addlist *mrdump_memlist_fill_cmm(struct mrdump_control_block *mrdump_cblock)
  441. {
  442. if (!mrdump_cblock)
  443. return NULL;
  444. mrdump_cmm_gen(mrdump_cblock);
  445. if (mrdump_string_buf.buf && mrdump_string_buf.wpos > 0)
  446. {
  447. struct kzip_addlist *memlist = malloc(sizeof(struct kzip_addlist) * 2);
  448. if (memlist == NULL)
  449. return NULL;
  450. memlist[0].address = (uint64_t)(uintptr_t) mrdump_string_buf.buf;
  451. memlist[0].size = mrdump_string_buf.wpos;
  452. memlist[0].type = MEM_NO_MAP;
  453. memlist[0].memmap = 0;
  454. memlist[0].pageflags = 0;
  455. memlist[0].struct_page_size = 0;
  456. memlist[1].address = 0;
  457. memlist[1].size = 0;
  458. memlist[1].type = MEM_NO_MAP;
  459. memlist[1].memmap = 0;
  460. memlist[1].pageflags = 0;
  461. memlist[1].struct_page_size = 0;
  462. return memlist;
  463. }
  464. return NULL;
  465. }
  466. void mrdump_memlist_free_cmm(struct kzip_addlist *memlist)
  467. {
  468. uninit_mrdump_string_buf();
  469. free(memlist);
  470. }