|  | /* | 
|  | * arch/arm/kernel/crash_dump.c | 
|  | * | 
|  | * Copyright (C) 2010 Nokia Corporation. | 
|  | * Author: Mika Westerberg | 
|  | * | 
|  | * This code is taken from arch/x86/kernel/crash_dump_64.c | 
|  | *   Created by: Hariprasad Nellitheertha (hari@in.ibm.com) | 
|  | *   Copyright (C) IBM Corporation, 2004. All rights reserved | 
|  | * | 
|  | * 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. | 
|  | */ | 
|  |  | 
|  | #include <linux/errno.h> | 
|  | #include <linux/crash_dump.h> | 
|  | #include <linux/uaccess.h> | 
|  | #include <linux/io.h> | 
|  |  | 
|  | /** | 
|  | * 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 = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); | 
|  | if (!vaddr) | 
|  | return -ENOMEM; | 
|  |  | 
|  | if (userbuf) { | 
|  | if (copy_to_user(buf, vaddr + offset, csize)) { | 
|  | iounmap(vaddr); | 
|  | return -EFAULT; | 
|  | } | 
|  | } else { | 
|  | memcpy(buf, vaddr + offset, csize); | 
|  | } | 
|  |  | 
|  | iounmap(vaddr); | 
|  | return csize; | 
|  | } |