2010-05-10 09:26:19 +01:00
/*
* 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 ;
2014-03-27 06:56:18 +01:00
vaddr = ioremap ( __pfn_to_phys ( pfn ) , PAGE_SIZE ) ;
2010-05-10 09:26:19 +01:00
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 ;
}