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 /* stores the physical address of elf header of crash image */ 22 unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; 23 24 /** 25 * copy_oldmem_page() - copy one page from old kernel memory 26 * @pfn: page frame number to be copied 27 * @buf: buffer where the copied page is placed 28 * @csize: number of bytes to copy 29 * @offset: offset in bytes into the page 30 * @userbuf: if set, @buf is int he user address space 31 * 32 * This function copies one page from old kernel memory into buffer pointed by 33 * @buf. If @buf is in userspace, set @userbuf to %1. Returns number of bytes 34 * copied or negative error in case of failure. 35 */ 36 ssize_t copy_oldmem_page(unsigned long pfn, char *buf, 37 size_t csize, unsigned long offset, 38 int userbuf) 39 { 40 void *vaddr; 41 42 if (!csize) 43 return 0; 44 45 vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); 46 if (!vaddr) 47 return -ENOMEM; 48 49 if (userbuf) { 50 if (copy_to_user(buf, vaddr + offset, csize)) { 51 iounmap(vaddr); 52 return -EFAULT; 53 } 54 } else { 55 memcpy(buf, vaddr + offset, csize); 56 } 57 58 iounmap(vaddr); 59 return csize; 60 } 61