]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc: add crash dump support
authorDave Kleikamp <dave.kleikamp@oracle.com>
Mon, 7 Jul 2014 18:38:17 +0000 (11:38 -0700)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Mon, 18 Apr 2016 16:42:50 +0000 (11:42 -0500)
Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
arch/sparc/Kconfig
arch/sparc/kernel/Makefile
arch/sparc/kernel/crash_dump.c [new file with mode: 0644]

index 7b1daebf6528c0b720b0955e5f4dd38576920f29..9c56e0d822a93ff74d8261fddbbd013f9a00f50b 100644 (file)
@@ -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
index acbd76897a17d943f50171e1c81b8b1a0a4449d3..d096a33ee73d600e42061898a97db1e34e84240e 100644 (file)
@@ -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 (file)
index 0000000..434ecd2
--- /dev/null
@@ -0,0 +1,48 @@
+#include <linux/errno.h>
+#include <linux/crash_dump.h>
+#include <linux/io.h>
+#include <linux/bootmem.h>
+#include <asm/uaccess.h>
+
+/**
+ * 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;
+}