1 /* 2 * arch/arm/kernel/crash_dump.c 3 * 4 * Copyright (C) 2010 Nokia Corporation. 5 * Author: Mika Westerberg 6 * 7 * This code is taken from arch/x86/kernel/crash_dump_64.c 8 * Created by: Hariprasad Nellitheertha (hari@in.ibm.com) 9 * Copyright (C) IBM Corporation, 2004. All rights reserved 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16 #include <linux/errno.h> 17 #include <linux/crash_dump.h> 18 #include <linux/uaccess.h> 19 #include <linux/io.h> 20 21 /** 22 * copy_oldmem_page() - copy one page from old kernel memory 23 * @pfn: page frame number to be copied 24 * @buf: buffer where the copied page is placed 25 * @csize: number of bytes to copy 26 * @offset: offset in bytes into the page 27 * @userbuf: if set, @buf is int he user address space 28 * 29 * This function copies one page from old kernel memory into buffer pointed by 30 * @buf. If @buf is in userspace, set @userbuf to %1. Returns number of bytes 31 * copied or negative error in case of failure. 32 */ 33 ssize_t copy_oldmem_page(unsigned long pfn, char *buf, 34 size_t csize, unsigned long offset, 35 int userbuf) 36 { 37 void *vaddr; 38 39 if (!csize) 40 return 0; 41 42 vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); 43 if (!vaddr) 44 return -ENOMEM; 45 46 if (userbuf) { 47 if (copy_to_user(buf, vaddr + offset, csize)) { 48 iounmap(vaddr); 49 return -EFAULT; 50 } 51 } else { 52 memcpy(buf, vaddr + offset, csize); 53 } 54 55 iounmap(vaddr); 56 return csize; 57 } 58