All of lore.kernel.org
 help / color / mirror / Atom feed
From: ext-mika.1.westerberg@nokia.com (Mika Westerberg)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC 06/10] arm: kdump: implement copy_oldmem_page()
Date: Mon, 29 Mar 2010 12:26:32 +0300	[thread overview]
Message-ID: <49c5365fe4f794390ca2a4de75365953e211ab3f.1269854500.git.ext-mika.1.westerberg@nokia.com> (raw)
In-Reply-To: <f05417b66eedd3c1fe32b433dcdae71a2a151da5.1269854500.git.ext-mika.1.westerberg@nokia.com>

This function is used by vmcore code to read a page from the old kernel memory.

Signed-off-by: Mika Westerberg <ext-mika.1.westerberg@nokia.com>
---
 arch/arm/kernel/Makefile     |    1 +
 arch/arm/kernel/crash_dump.c |   82 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/kernel/crash_dump.c

diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 26d302c..ea023c6 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -39,6 +39,7 @@ obj-$(CONFIG_ARM_THUMBEE)	+= thumbee.o
 obj-$(CONFIG_KGDB)		+= kgdb.o
 obj-$(CONFIG_ARM_UNWIND)	+= unwind.o
 obj-$(CONFIG_HAVE_TCM)		+= tcm.o
+obj-$(CONFIG_CRASH_DUMP)	+= crash_dump.o
 
 obj-$(CONFIG_CRUNCH)		+= crunch.o crunch-bits.o
 AFLAGS_crunch-bits.o		:= -Wa,-mcpu=ep9312
diff --git a/arch/arm/kernel/crash_dump.c b/arch/arm/kernel/crash_dump.c
new file mode 100644
index 0000000..84382d3
--- /dev/null
+++ b/arch/arm/kernel/crash_dump.c
@@ -0,0 +1,82 @@
+/*
+ * arch/arm/kernel/crash_dump.c
+ *
+ * Copyright (C) 2010 Nokia Corporation.
+ *
+ * This code is heavily based on x86 version found in
+ * arch/x86/kernel/crash_dump_32.c.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Author: Mika Westerberg
+ */
+#include <linux/errno.h>
+#include <linux/crash_dump.h>
+#include <linux/uaccess.h>
+#include <linux/highmem.h>
+#include <linux/io.h>
+
+/* buffer used when copying an old page to userspace */
+static void *kdump_buf_page;
+
+/* stores the physical address of elf header of crash image */
+unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX;
+
+/**
+ * copy_oldmem_page() - copy one page from old kernel memory
+ * @pfn: page frame number to be copied
+ * @buf: buffer where the copied page is placed
+ * @csize: number of bytes to copy
+ * @offset: offset in bytes into the page
+ * @userbuf: if set, @buf is int he user address space
+ *
+ * This function copies one page from old kernel memory into buffer pointed by
+ * @buf. If @buf is in userspace, set @userbuf to %1. Returns number of bytes
+ * copied or negative error in case of failure.
+ */
+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 = kmap_atomic_pfn(pfn, KM_PTE0);
+
+	if (userbuf) {
+		if (!kdump_buf_page) {
+			printk(KERN_WARNING "Kdump: kdump buffer page not "
+				"allocated\n");
+			kunmap_atomic(vaddr, KM_PTE0);
+			return -EFAULT;
+		}
+
+		copy_page(kdump_buf_page, vaddr);
+		kunmap_atomic(vaddr, KM_PTE0);
+
+		if (copy_to_user(buf, vaddr + offset, csize))
+			return -EFAULT;
+	} else {
+		memcpy(buf, vaddr + offset, csize);
+		kunmap_atomic(vaddr, KM_PTE0);
+	}
+
+	return csize;
+}
+
+static int __init kdump_buf_page_init(void)
+{
+	kdump_buf_page = kmalloc(PAGE_SIZE, GFP_KERNEL);
+	if (!kdump_buf_page) {
+		printk(KERN_WARNING "Kdump: failed to allocate kdump buffer "
+			"page\n");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+arch_initcall(kdump_buf_page_init);
-- 
1.5.6.5

  reply	other threads:[~2010-03-29  9:26 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-29  9:26 [RFC 00/10] Initial implementation of kdump for ARM Mika Westerberg
2010-03-29  9:26 ` [RFC 01/10] arm: kdump: reserve memory for crashkernel Mika Westerberg
2010-03-29  9:26   ` [RFC 02/10] arm: kdump: implement crash_setup_regs() Mika Westerberg
2010-03-29  9:26     ` [RFC 03/10] arm: kdump: implement machine_crash_shutdown() Mika Westerberg
2010-03-29  9:26       ` [RFC 04/10] arm: kdump: skip indirection page when crashing Mika Westerberg
2010-03-29  9:26         ` [RFC 05/10] arm: kdump: make kexec work in interrupt context Mika Westerberg
2010-03-29  9:26           ` Mika Westerberg [this message]
2010-03-29  9:26             ` [RFC 07/10] arm: allow passing an ELF64 header to elf_check_arch() Mika Westerberg
2010-03-29  9:26               ` [RFC 08/10] arm: kdump: add support for elfcorehdr= parameter Mika Westerberg
2010-03-29  9:26                 ` [RFC 09/10] arm: implement reserve memory early parameter Mika Westerberg
2010-03-29  9:26                   ` [RFC 10/10] arm: kdump: add CONFIG_CRASH_DUMP Kconfig option Mika Westerberg
2010-04-12 21:05                   ` [RFC 09/10] arm: implement reserve memory early parameter Russell King - ARM Linux
2010-04-13  6:37                     ` Mika Westerberg
2010-04-15 12:40                     ` Mika Westerberg
2010-03-29 21:12               ` [RFC 07/10] arm: allow passing an ELF64 header to elf_check_arch() Russell King - ARM Linux
2010-03-30  7:11                 ` Mika Westerberg
2010-03-29 23:41               ` Jamie Lokier
2010-03-30  7:26                 ` Mika Westerberg
2010-03-30 11:41                   ` Jamie Lokier
2010-04-12 20:03           ` [RFC 05/10] arm: kdump: make kexec work in interrupt context Russell King - ARM Linux
2010-04-12 20:01     ` [RFC 02/10] arm: kdump: implement crash_setup_regs() Russell King - ARM Linux
2010-04-13  5:53       ` Mika Westerberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49c5365fe4f794390ca2a4de75365953e211ab3f.1269854500.git.ext-mika.1.westerberg@nokia.com \
    --to=ext-mika.1.westerberg@nokia.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.