summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Altenberg <jan@linutronix.de>2013-07-18 16:19:36 +0200
committerJan Altenberg <jan@linutronix.de>2013-07-18 16:19:36 +0200
commit900afa38d561c91af04c75c6798adb58dfdfc2b5 (patch)
tree66e3df779d7ce9765cdc48ddbe99b4c23f9ca815
parent8efc2018a6a4bd29e6a0c5562011357a88066faa (diff)
Added patches for ARM crashkernel
-rw-r--r--kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff65
-rw-r--r--kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff28
-rw-r--r--kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff13
3 files changed, 106 insertions, 0 deletions
diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff
new file mode 100644
index 0000000..1d3e082
--- /dev/null
+++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff
@@ -0,0 +1,65 @@
+From: Magnus Damm <damm at opensource.se>
+
+Update the copy_oldmem_page() function to ioremap() only
+when accessing memory that is outside the regular range
+of system memory that is managed by the kernel.
+
+Without this patch a warning is triggered in the ARM-specific
+ioremap implementation, see WARN_ON(pfn_valid()) in ioremap.c
+
+The copy_oldmem_page() function is used by the secondary crash
+kernel to access memory using the /proc/vmcore code implemented
+in fs/proc/vmcore.c. To pass information from the first kernel
+to the secondary crash kernel a kernel command line option is
+used to point out where the elf core hdr is located.
+
+The crash kernel is loaded through kexec-tools which also contains
+code that reserves memory for the elfcorehdr= option. This memory
+block is reserved _inside_ the main system memory of the secondary
+kernel. The /proc/vmcore code in the secondary kernel is however
+using copy_oldmem_page() to access both this elfcorehdr area and
+the rest of the memory used by the the first kernel.
+
+So the copy_oldmem_page() function is used to access data that
+may be located in system memory, or it may be outside. Always
+using ioremap will not work, so this patch makes it conditional
+based on pfn_valid().
+
+For more details please look at the sh7372-based example here:
+http://permalink.gmane.org/gmane.linux.ports.sh.devel/11502
+
+Signed-off-by: Magnus Damm <damm at opensource.se>
+---
+
+ arch/arm/kernel/crash_dump.c | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+--- 0001/arch/arm/kernel/crash_dump.c
++++ work/arch/arm/kernel/crash_dump.c 2011-06-18 20:59:49.000000000 +0900
+@@ -39,9 +39,13 @@ ssize_t copy_oldmem_page(unsigned long p
+ if (!csize)
+ return 0;
+
+- vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
+- if (!vaddr)
+- return -ENOMEM;
++ if (pfn_valid(pfn)) {
++ vaddr = phys_to_virt(pfn << PAGE_SHIFT);
++ } else {
++ vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE);
++ if (!vaddr)
++ return -ENOMEM;
++ }
+
+ if (userbuf) {
+ if (copy_to_user(buf, vaddr + offset, csize)) {
+@@ -52,6 +56,8 @@ ssize_t copy_oldmem_page(unsigned long p
+ memcpy(buf, vaddr + offset, csize);
+ }
+
+- iounmap(vaddr);
++ if (!pfn_valid(pfn))
++ iounmap(vaddr);
++
+ return csize;
+ }
diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff
new file mode 100644
index 0000000..877f5ea
--- /dev/null
+++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/kexec_fix_arm_braindamage.diff
@@ -0,0 +1,28 @@
+Index: kexec-tools-2.0.3/kexec/arch/arm/crashdump-arm.c
+===================================================================
+--- kexec-tools-2.0.3.orig/kexec/arch/arm/crashdump-arm.c 2011-10-03 00:56:38.000000000 +0200
++++ kexec-tools-2.0.3/kexec/arch/arm/crashdump-arm.c 2013-07-06 17:26:13.410309437 +0200
+@@ -204,12 +204,12 @@
+ * @cmdline. Note that @cmdline must be at least %COMMAND_LINE_SIZE bytes long
+ * (including %NUL).
+ */
+-static void cmdline_add_mem(char *cmdline, unsigned long size)
++static void cmdline_add_mem(char *cmdline, unsigned long size, unsigned long offset)
+ {
+ char buf[COMMAND_LINE_SIZE];
+ int buflen;
+
+- buflen = snprintf(buf, sizeof(buf), "%s mem=%ldK", cmdline, size >> 10);
++ buflen = snprintf(buf, sizeof(buf), "%s mem=%ldK@0x%X", cmdline, size >> 10, offset);
+ if (buflen < 0)
+ die("Failed to construct mem= command line parameter\n");
+ if (buflen >= sizeof(buf))
+@@ -301,7 +301,7 @@
+ * prevents the dump capture kernel from using any other memory regions
+ * which belong to the primary kernel.
+ */
+- cmdline_add_mem(mod_cmdline, elfcorehdr - crash_reserved_mem.start);
++ cmdline_add_mem(mod_cmdline, elfcorehdr - crash_reserved_mem.start, crash_reserved_mem.start);
+
+ dump_memory_ranges();
+ dbgprintf("kernel command line: \"%s\"\n", mod_cmdline);
diff --git a/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff
new file mode 100644
index 0000000..867e13a
--- /dev/null
+++ b/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/zreladdr.diff
@@ -0,0 +1,13 @@
+Index: linux-3.2/arch/arm/mach-omap2/Makefile.boot
+===================================================================
+--- linux-3.2.orig/arch/arm/mach-omap2/Makefile.boot 2012-01-05 00:55:44.000000000 +0100
++++ linux-3.2/arch/arm/mach-omap2/Makefile.boot 2013-07-06 17:00:18.718516198 +0200
+@@ -1,3 +1,8 @@
++ifeq ($(CONFIG_CRASH_DUMP),y)
++ zreladdr-y += 0x84008000
++params_phys-y := 0x84000100
++else
+ zreladdr-y += 0x80008000
+ params_phys-y := 0x80000100
++endif
+ initrd_phys-y := 0x80800000