mrdump_dbgscript.c 19 KB

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