diff options
| author | Michael Ellerman <michael@ellerman.id.au> | 2005-12-04 02:39:51 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2006-01-08 22:52:35 -0500 |
| commit | 54c32021eb6feafc32e90104e960b38301521b7b (patch) | |
| tree | 7aff1e11966569f4b8dce57d6f70eb4d1e72bec2 | |
| parent | dcee30361d25ea83499a99f921f9a56b4a1a79e7 (diff) | |
[PATCH] powerpc: Add arch-dependent copy_oldmem_page
Signed-off-by: Haren Myneni <haren@us.ibm.com>
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
| -rw-r--r-- | arch/powerpc/kernel/crash_dump.c | 36 | ||||
| -rw-r--r-- | include/asm-powerpc/kexec.h | 2 | ||||
| -rw-r--r-- | kernel/crash_dump.c | 3 |
3 files changed, 41 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 5337ab75978..87effa3f21a 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <asm/kdump.h> | 16 | #include <asm/kdump.h> |
| 17 | #include <asm/lmb.h> | 17 | #include <asm/lmb.h> |
| 18 | #include <asm/firmware.h> | 18 | #include <asm/firmware.h> |
| 19 | #include <asm/uaccess.h> | ||
| 19 | 20 | ||
| 20 | #ifdef DEBUG | 21 | #ifdef DEBUG |
| 21 | #include <asm/udbg.h> | 22 | #include <asm/udbg.h> |
| @@ -71,3 +72,38 @@ static int __init parse_savemaxmem(char *p) | |||
| 71 | return 0; | 72 | return 0; |
| 72 | } | 73 | } |
| 73 | __setup("savemaxmem=", parse_savemaxmem); | 74 | __setup("savemaxmem=", parse_savemaxmem); |
| 75 | |||
| 76 | /* | ||
| 77 | * copy_oldmem_page - copy one page from "oldmem" | ||
| 78 | * @pfn: page frame number to be copied | ||
| 79 | * @buf: target memory address for the copy; this can be in kernel address | ||
| 80 | * space or user address space (see @userbuf) | ||
| 81 | * @csize: number of bytes to copy | ||
| 82 | * @offset: offset in bytes into the page (based on pfn) to begin the copy | ||
| 83 | * @userbuf: if set, @buf is in user address space, use copy_to_user(), | ||
| 84 | * otherwise @buf is in kernel address space, use memcpy(). | ||
| 85 | * | ||
| 86 | * Copy a page from "oldmem". For this page, there is no pte mapped | ||
| 87 | * in the current kernel. We stitch up a pte, similar to kmap_atomic. | ||
| 88 | */ | ||
| 89 | ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | ||
| 90 | size_t csize, unsigned long offset, int userbuf) | ||
| 91 | { | ||
| 92 | void *vaddr; | ||
| 93 | |||
| 94 | if (!csize) | ||
| 95 | return 0; | ||
| 96 | |||
| 97 | vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | ||
| 98 | |||
| 99 | if (userbuf) { | ||
| 100 | if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) { | ||
| 101 | iounmap(vaddr); | ||
| 102 | return -EFAULT; | ||
| 103 | } | ||
| 104 | } else | ||
| 105 | memcpy(buf, (vaddr + offset), csize); | ||
| 106 | |||
| 107 | iounmap(vaddr); | ||
| 108 | return csize; | ||
| 109 | } | ||
diff --git a/include/asm-powerpc/kexec.h b/include/asm-powerpc/kexec.h index ae76ed5d973..c0f6d6b0d93 100644 --- a/include/asm-powerpc/kexec.h +++ b/include/asm-powerpc/kexec.h | |||
| @@ -30,6 +30,8 @@ | |||
| 30 | #define KEXEC_ARCH KEXEC_ARCH_PPC | 30 | #define KEXEC_ARCH KEXEC_ARCH_PPC |
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #define HAVE_ARCH_COPY_OLDMEM_PAGE | ||
| 34 | |||
| 33 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
| 34 | 36 | ||
| 35 | #ifdef CONFIG_KEXEC | 37 | #ifdef CONFIG_KEXEC |
diff --git a/kernel/crash_dump.c b/kernel/crash_dump.c index 334c37f5218..fccb27dbc62 100644 --- a/kernel/crash_dump.c +++ b/kernel/crash_dump.c | |||
| @@ -14,10 +14,12 @@ | |||
| 14 | 14 | ||
| 15 | #include <asm/io.h> | 15 | #include <asm/io.h> |
| 16 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
| 17 | #include <asm/kexec.h> | ||
| 17 | 18 | ||
| 18 | /* Stores the physical address of elf header of crash image. */ | 19 | /* Stores the physical address of elf header of crash image. */ |
| 19 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; | 20 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; |
| 20 | 21 | ||
| 22 | #ifndef HAVE_ARCH_COPY_OLDMEM_PAGE | ||
| 21 | /** | 23 | /** |
| 22 | * copy_oldmem_page - copy one page from "oldmem" | 24 | * copy_oldmem_page - copy one page from "oldmem" |
| 23 | * @pfn: page frame number to be copied | 25 | * @pfn: page frame number to be copied |
| @@ -59,3 +61,4 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 59 | kfree(page); | 61 | kfree(page); |
| 60 | return csize; | 62 | return csize; |
| 61 | } | 63 | } |
| 64 | #endif | ||
