summaryrefslogtreecommitdiff
path: root/kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff
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 /kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff
parent8efc2018a6a4bd29e6a0c5562011357a88066faa (diff)
Added patches for ARM crashkernel
Diffstat (limited to 'kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff')
-rw-r--r--kernel-devel/kexec-and-crash-kernel/crashkernel_patches/crashkernel.diff65
1 files changed, 65 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;
+ }