From: Dave Kleikamp Date: Mon, 7 Jul 2014 18:38:17 +0000 (-0700) Subject: sparc: add crash dump support X-Git-Tag: v4.1.12-92~147^2~3^2~6 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=01b4d3df90ab75fff844e20c990dcc0b9f23d2a0;p=users%2Fjedix%2Flinux-maple.git sparc: add crash dump support Signed-off-by: Dave Kleikamp --- diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 7b1daebf6528c..9c56e0d822a93 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig @@ -290,6 +290,17 @@ config KEXEC support. As of this writing the exact hardware interface is strongly in flux, so no good recommendation can be made. +config CRASH_DUMP + bool "kernel crash dumps" + depends on KEXEC + ---help--- + Generate crash dump after being started by kexec. + This should be normally only set in special crash dump kernels + which are loaded in the main kernel with kexec-tools into + a specially reserved region and then later executed after + a crash by kdump/kexec. + For more details see Documentation/kdump/kdump.txt + config US3_MC tristate "UltraSPARC-III Memory Controller driver" depends on SPARC64 diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index acbd76897a17d..d096a33ee73d6 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile @@ -120,3 +120,4 @@ obj-$(CONFIG_SPARC64) += jump_label.o obj-$(CONFIG_SPARC64) += kexec_shim.o obj-$(CONFIG_KEXEC) += machine_kexec.o +obj-$(CONFIG_CRASH_DUMP) += crash_dump.o diff --git a/arch/sparc/kernel/crash_dump.c b/arch/sparc/kernel/crash_dump.c new file mode 100644 index 0000000000000..434ecd23bf410 --- /dev/null +++ b/arch/sparc/kernel/crash_dump.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include + +/** + * copy_oldmem_page - copy one page from "oldmem" + * @pfn: page frame number to be copied + * @buf: target memory address for the copy; this can be in kernel address + * space or user address space (see @userbuf) + * @csize: number of bytes to copy + * @offset: offset in bytes into the page (based on pfn) to begin the copy + * @userbuf: if set, @buf is in user address space, use copy_to_user(), + * otherwise @buf is in kernel address space, use memcpy(). + * + * Copy a page from "oldmem". For this page, there is no pte mapped + * in the current kernel. We stitch up a pte, similar to kmap_atomic. + */ +ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, + unsigned long offset, int userbuf) +{ + void *vaddr; + int need_remap; + + if (!csize) + return 0; + + need_remap = (pfn < min_low_pfn) || (pfn > max_pfn); + if (need_remap) + vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); + else + vaddr = pfn_to_kaddr(pfn); + + if (userbuf) { + if (copy_to_user(buf, (vaddr + offset), csize)) { + if (need_remap) + iounmap(vaddr); + return -EFAULT; + } + } else + memcpy(buf, (vaddr + offset), csize); + + if (need_remap) + iounmap(vaddr); + + return csize; +}