* Jeremy Fitzhardinge <jeremy@sw.oz.au>
*/
+#ifdef CONFIG_MTK_EXTMEM
+extern bool extmem_in_mspace(struct vm_area_struct *vma);
+extern unsigned long get_virt_from_mspace(unsigned long pa);
+#endif
+
/*
* The purpose of always_dump_vma() is to make sure that special kernel mappings
* that are useful for post-mortem analysis are included in every core dump.
if (arch_vma_name(vma))
return true;
+#ifdef CONFIG_MTK_EXTMEM
+ if (extmem_in_mspace(vma)) {
+ return true;
+ }
+#endif
return false;
}
Elf_Half e_phnum;
elf_addr_t e_shoff;
+ printk(KERN_WARNING "coredump(%d): start\n", current->pid);
+
/*
* We no longer stop all VM operations.
*
if (!dump_seek(cprm->file, dataoff - foffset))
goto end_coredump;
+ printk(KERN_WARNING "coredump(%d): write output program header and notes\n", current->pid);
+
for (vma = first_vma(current, gate_vma); vma != NULL;
vma = next_vma(vma, gate_vma)) {
unsigned long addr;
end = vma->vm_start + vma_dump_size(vma, cprm->mm_flags);
+#ifdef CONFIG_MTK_EXTMEM
+ if (extmem_in_mspace(vma)) {
+ void *extmem_va = (void *)get_virt_from_mspace(vma->vm_pgoff << PAGE_SHIFT);
+ for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE, extmem_va += PAGE_SIZE) {
+ int stop;
+ int dump_write_ret = dump_write(cprm->file, extmem_va, PAGE_SIZE);
+ stop = ((size += PAGE_SIZE) > cprm->limit) || (!dump_write_ret);
+ if (stop) {
+ printk(KERN_WARNING "[EXT_MEM]stop addr:0x%lx, size:%zx, limit:0x%lx, dump_write_ret:%d\n",
+ addr, size, cprm->limit, dump_write_ret);
+ goto end_coredump;
+ }
+ }
+ continue;
+ }
+#endif
+
+ //printk(KERN_WARNING "coredump(%d): write out load vm start:%08lx, end:%08lx\n", current->pid, vma->vm_start, end);
for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) {
struct page *page;
int stop;
PAGE_SIZE);
kunmap(page);
page_cache_release(page);
- } else
+ if (stop) {
+ printk(KERN_WARNING "coredump(%d): failed to write core dump\n", current->pid);
+ }
+ } else {
stop = !dump_seek(cprm->file, PAGE_SIZE);
+ if (stop) {
+ printk(KERN_WARNING "coredump(%d): failed to seek core dump\n", current->pid);
+ }
+ }
if (stop)
goto end_coredump;
}
}
+ printk(KERN_WARNING "coredump(%d): write loads\n", current->pid);
+
if (!elf_core_write_extra_data(cprm->file, &size, cprm->limit))
goto end_coredump;
goto end_coredump;
}
+ printk(KERN_WARNING "coredump(%d): write out completed %lld\n", current->pid, offset);
+
end_coredump:
set_fs(fs);