Loading arch/sh/Kconfig +14 −0 Original line number Diff line number Diff line Loading @@ -551,6 +551,20 @@ 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 (EXPERIMENTAL)" depends on EXPERIMENTAL 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. The crash dump kernel must be compiled to a memory address not used by the main kernel using MEMORY_START. For more details see Documentation/kdump/kdump.txt config SMP bool "Symmetric multi-processing support" ---help--- Loading arch/sh/kernel/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -20,5 +20,6 @@ obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_STACKTRACE) += stacktrace.o arch/sh/kernel/crash_dump.c 0 → 100644 +46 −0 Original line number Diff line number Diff line /* * crash_dump.c - Memory preserving reboot related code. * * Created by: Hariprasad Nellitheertha (hari@in.ibm.com) * Copyright (C) IBM Corporation, 2004. All rights reserved */ #include <linux/errno.h> #include <linux/crash_dump.h> #include <linux/io.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; if (!csize) return 0; vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); if (userbuf) { if (copy_to_user(buf, (vaddr + offset), csize)) { iounmap(vaddr); return -EFAULT; } } else memcpy(buf, (vaddr + offset), csize); iounmap(vaddr); return csize; } arch/sh/kernel/machine_kexec.c +25 −4 Original line number Diff line number Diff line Loading @@ -59,13 +59,13 @@ static void kexec_info(struct kimage *image) printk(" segment[%d]: 0x%08x - 0x%08x (0x%08x)\n", i, (unsigned int)image->segment[i].mem, (unsigned int)image->segment[i].mem + image->segment[i].memsz, (unsigned int)image->segment[i].mem + image->segment[i].memsz, (unsigned int)image->segment[i].memsz); } printk(" start : 0x%08x\n\n", (unsigned int)image->start); } /* * Do not allocate memory (or fail in any way) in machine_kexec(). * We are past the point of no return, committed to rebooting now. Loading Loading @@ -104,3 +104,24 @@ NORET_TYPE void machine_kexec(struct kimage *image) (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg); } /* crashkernel=size@addr specifies the location to reserve for * a crash kernel. By reserving this memory we guarantee * that linux never sets it up as a DMA target. * Useful for holding code to do something appropriate * after a kernel panic. */ static int __init parse_crashkernel(char *arg) { unsigned long size, base; size = memparse(arg, &arg); if (*arg == '@') { base = memparse(arg+1, &arg); /* FIXME: Do I want a sanity check * to validate the memory range? */ crashk_res.start = base; crashk_res.end = base + size - 1; } return 0; } early_param("crashkernel", parse_crashkernel); arch/sh/kernel/setup.c +6 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/pfn.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/kexec.h> #include <asm/uaccess.h> #include <asm/io.h> #include <asm/sections.h> Loading Loading @@ -287,6 +288,11 @@ void __init setup_bootmem_allocator(unsigned long start_pfn) } } #endif #ifdef CONFIG_KEXEC if (crashk_res.start != crashk_res.end) reserve_bootmem(crashk_res.start, crashk_res.end - crashk_res.start + 1); #endif } #ifndef CONFIG_NEED_MULTIPLE_NODES Loading Loading
arch/sh/Kconfig +14 −0 Original line number Diff line number Diff line Loading @@ -551,6 +551,20 @@ 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 (EXPERIMENTAL)" depends on EXPERIMENTAL 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. The crash dump kernel must be compiled to a memory address not used by the main kernel using MEMORY_START. For more details see Documentation/kdump/kdump.txt config SMP bool "Symmetric multi-processing support" ---help--- Loading
arch/sh/kernel/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -20,5 +20,6 @@ obj-$(CONFIG_SH_CPU_FREQ) += cpufreq.o obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_PM) += pm.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
arch/sh/kernel/crash_dump.c 0 → 100644 +46 −0 Original line number Diff line number Diff line /* * crash_dump.c - Memory preserving reboot related code. * * Created by: Hariprasad Nellitheertha (hari@in.ibm.com) * Copyright (C) IBM Corporation, 2004. All rights reserved */ #include <linux/errno.h> #include <linux/crash_dump.h> #include <linux/io.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; if (!csize) return 0; vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); if (userbuf) { if (copy_to_user(buf, (vaddr + offset), csize)) { iounmap(vaddr); return -EFAULT; } } else memcpy(buf, (vaddr + offset), csize); iounmap(vaddr); return csize; }
arch/sh/kernel/machine_kexec.c +25 −4 Original line number Diff line number Diff line Loading @@ -59,13 +59,13 @@ static void kexec_info(struct kimage *image) printk(" segment[%d]: 0x%08x - 0x%08x (0x%08x)\n", i, (unsigned int)image->segment[i].mem, (unsigned int)image->segment[i].mem + image->segment[i].memsz, (unsigned int)image->segment[i].mem + image->segment[i].memsz, (unsigned int)image->segment[i].memsz); } printk(" start : 0x%08x\n\n", (unsigned int)image->start); } /* * Do not allocate memory (or fail in any way) in machine_kexec(). * We are past the point of no return, committed to rebooting now. Loading Loading @@ -104,3 +104,24 @@ NORET_TYPE void machine_kexec(struct kimage *image) (*rnk)(page_list, reboot_code_buffer, image->start, vbr_reg); } /* crashkernel=size@addr specifies the location to reserve for * a crash kernel. By reserving this memory we guarantee * that linux never sets it up as a DMA target. * Useful for holding code to do something appropriate * after a kernel panic. */ static int __init parse_crashkernel(char *arg) { unsigned long size, base; size = memparse(arg, &arg); if (*arg == '@') { base = memparse(arg+1, &arg); /* FIXME: Do I want a sanity check * to validate the memory range? */ crashk_res.start = base; crashk_res.end = base + size - 1; } return 0; } early_param("crashkernel", parse_crashkernel);
arch/sh/kernel/setup.c +6 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include <linux/pfn.h> #include <linux/fs.h> #include <linux/mm.h> #include <linux/kexec.h> #include <asm/uaccess.h> #include <asm/io.h> #include <asm/sections.h> Loading Loading @@ -287,6 +288,11 @@ void __init setup_bootmem_allocator(unsigned long start_pfn) } } #endif #ifdef CONFIG_KEXEC if (crashk_res.start != crashk_res.end) reserve_bootmem(crashk_res.start, crashk_res.end - crashk_res.start + 1); #endif } #ifndef CONFIG_NEED_MULTIPLE_NODES Loading