aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVivek Goyal <vgoyal@in.ibm.com>2005-06-25 17:58:19 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-25 19:24:53 -0400
commit60e64d46a58236e3c718074372cab6a5b56a3b15 (patch)
tree194e5fa7a53a1ac4a106b1527ec69cf3c2179bb0
parent5f016456c96868c27df248a54d1cc919e7b70a23 (diff)
[PATCH] kdump: Routines for copying dump pages
This patch provides the interfaces necessary to read the dump contents, treating it as a high memory device. Signed off by Hariprasad Nellitheertha <hari@in.ibm.com> Signed-off-by: Eric Biederman <ebiederm@xmission.com> Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/i386/mm/highmem.c18
-rw-r--r--include/asm-i386/highmem.h1
-rw-r--r--include/linux/crash_dump.h13
-rw-r--r--include/linux/highmem.h1
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/crash_dump.c49
6 files changed, 83 insertions, 0 deletions
diff --git a/arch/i386/mm/highmem.c b/arch/i386/mm/highmem.c
index 4b7aaf99d7ea..b6eb4dcb8777 100644
--- a/arch/i386/mm/highmem.c
+++ b/arch/i386/mm/highmem.c
@@ -75,6 +75,24 @@ void kunmap_atomic(void *kvaddr, enum km_type type)
75 preempt_check_resched(); 75 preempt_check_resched();
76} 76}
77 77
78/* This is the same as kmap_atomic() but can map memory that doesn't
79 * have a struct page associated with it.
80 */
81void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
82{
83 enum fixed_addresses idx;
84 unsigned long vaddr;
85
86 inc_preempt_count();
87
88 idx = type + KM_TYPE_NR*smp_processor_id();
89 vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
90 set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
91 __flush_tlb_one(vaddr);
92
93 return (void*) vaddr;
94}
95
78struct page *kmap_atomic_to_page(void *ptr) 96struct page *kmap_atomic_to_page(void *ptr)
79{ 97{
80 unsigned long idx, vaddr = (unsigned long)ptr; 98 unsigned long idx, vaddr = (unsigned long)ptr;
diff --git a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h
index 1df42bf347df..0fd331306b60 100644
--- a/include/asm-i386/highmem.h
+++ b/include/asm-i386/highmem.h
@@ -70,6 +70,7 @@ void *kmap(struct page *page);
70void kunmap(struct page *page); 70void kunmap(struct page *page);
71void *kmap_atomic(struct page *page, enum km_type type); 71void *kmap_atomic(struct page *page, enum km_type type);
72void kunmap_atomic(void *kvaddr, enum km_type type); 72void kunmap_atomic(void *kvaddr, enum km_type type);
73void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
73struct page *kmap_atomic_to_page(void *ptr); 74struct page *kmap_atomic_to_page(void *ptr);
74 75
75#define flush_cache_kmaps() do { } while (0) 76#define flush_cache_kmaps() do { } while (0)
diff --git a/include/linux/crash_dump.h b/include/linux/crash_dump.h
new file mode 100644
index 000000000000..7d983b817429
--- /dev/null
+++ b/include/linux/crash_dump.h
@@ -0,0 +1,13 @@
1#ifndef LINUX_CRASH_DUMP_H
2#define LINUX_CRASH_DUMP_H
3
4#ifdef CONFIG_CRASH_DUMP
5#include <linux/kexec.h>
6#include <linux/smp_lock.h>
7#include <linux/device.h>
8#include <linux/proc_fs.h>
9
10extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,
11 unsigned long, int);
12#endif /* CONFIG_CRASH_DUMP */
13#endif /* LINUX_CRASHDUMP_H */
diff --git a/include/linux/highmem.h b/include/linux/highmem.h
index 2a7e6c65c882..6bece9280eb7 100644
--- a/include/linux/highmem.h
+++ b/include/linux/highmem.h
@@ -28,6 +28,7 @@ static inline void *kmap(struct page *page)
28 28
29#define kmap_atomic(page, idx) page_address(page) 29#define kmap_atomic(page, idx) page_address(page)
30#define kunmap_atomic(addr, idx) do { } while (0) 30#define kunmap_atomic(addr, idx) do { } while (0)
31#define kmap_atomic_pfn(pfn, idx) page_address(pfn_to_page(pfn))
31#define kmap_atomic_to_page(ptr) virt_to_page(ptr) 32#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
32 33
33#endif /* CONFIG_HIGHMEM */ 34#endif /* CONFIG_HIGHMEM */
diff --git a/kernel/Makefile b/kernel/Makefile
index cfc8b0dea950..cb05cd05d237 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_AUDITSYSCALL) += auditsc.o
28obj-$(CONFIG_KPROBES) += kprobes.o 28obj-$(CONFIG_KPROBES) += kprobes.o
29obj-$(CONFIG_SYSFS) += ksysfs.o 29obj-$(CONFIG_SYSFS) += ksysfs.o
30obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ 30obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
31obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
31obj-$(CONFIG_SECCOMP) += seccomp.o 32obj-$(CONFIG_SECCOMP) += seccomp.o
32 33
33ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y) 34ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y)
diff --git a/kernel/crash_dump.c b/kernel/crash_dump.c
new file mode 100644
index 000000000000..5a1e6d5d203e
--- /dev/null
+++ b/kernel/crash_dump.c
@@ -0,0 +1,49 @@
1/*
2 * kernel/crash_dump.c - Memory preserving reboot related code.
3 *
4 * Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
5 * Copyright (C) IBM Corporation, 2004. All rights reserved
6 */
7
8#include <linux/smp_lock.h>
9#include <linux/errno.h>
10#include <linux/proc_fs.h>
11#include <linux/bootmem.h>
12#include <linux/highmem.h>
13#include <linux/crash_dump.h>
14
15#include <asm/io.h>
16#include <asm/uaccess.h>
17
18/*
19 * Copy a page from "oldmem". For this page, there is no pte mapped
20 * in the current kernel. We stitch up a pte, similar to kmap_atomic.
21 */
22ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
23 size_t csize, unsigned long offset, int userbuf)
24{
25 void *page, *vaddr;
26
27 if (!csize)
28 return 0;
29
30 page = kmalloc(PAGE_SIZE, GFP_KERNEL);
31 if (!page)
32 return -ENOMEM;
33
34 vaddr = kmap_atomic_pfn(pfn, KM_PTE0);
35 copy_page(page, vaddr);
36 kunmap_atomic(vaddr, KM_PTE0);
37
38 if (userbuf) {
39 if (copy_to_user(buf, (page + offset), csize)) {
40 kfree(page);
41 return -EFAULT;
42 }
43 } else {
44 memcpy(buf, (page + offset), csize);
45 }
46
47 kfree(page);
48 return csize;
49}