2005-06-25 14:58:19 -07:00
/*
2007-10-12 21:10:53 -04:00
* Memory preserving reboot related code .
2005-06-25 14:58:19 -07:00
*
* Created by : Hariprasad Nellitheertha ( hari @ in . ibm . com )
* Copyright ( C ) IBM Corporation , 2004. All rights reserved
*/
# include <linux/errno.h>
# include <linux/crash_dump.h>
2008-07-29 02:48:53 -03:00
# include <linux/uaccess.h>
# include <linux/io.h>
2005-06-25 14:58:20 -07:00
2008-10-18 20:28:25 -07:00
/* Stores the physical address of elf header of crash image. */
unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX ;
2005-07-27 11:45:11 -07:00
/**
* copy_oldmem_page - copy one page from " oldmem "
* @ pfn : page frame number to be copied
* @ buf : target memory address for the copy ; this can be in kernel address
* space or user address space ( see @ userbuf )
* @ csize : number of bytes to copy
* @ offset : offset in bytes into the page ( based on pfn ) to begin the copy
* @ userbuf : if set , @ buf is in user address space , use copy_to_user ( ) ,
* otherwise @ buf is in kernel address space , use memcpy ( ) .
*
2005-06-25 14:58:19 -07:00
* Copy a page from " oldmem " . For this page , there is no pte mapped
* in the current kernel . We stitch up a pte , similar to kmap_atomic .
*/
ssize_t copy_oldmem_page ( unsigned long pfn , char * buf ,
2008-07-29 02:48:53 -03:00
size_t csize , unsigned long offset , int userbuf )
2005-06-25 14:58:19 -07:00
{
2006-01-09 20:51:50 -08:00
void * vaddr ;
2005-06-25 14:58:19 -07:00
if ( ! csize )
return 0 ;
2006-01-09 20:51:50 -08:00
vaddr = ioremap ( pfn < < PAGE_SHIFT , PAGE_SIZE ) ;
2008-09-21 23:27:13 +09:00
if ( ! vaddr )
return - ENOMEM ;
2005-06-25 14:58:19 -07:00
if ( userbuf ) {
2008-09-21 23:27:13 +09:00
if ( copy_to_user ( buf , vaddr + offset , csize ) ) {
2006-01-09 20:51:50 -08:00
iounmap ( vaddr ) ;
2005-06-25 14:58:19 -07:00
return - EFAULT ;
}
2006-01-09 20:51:50 -08:00
} else
2008-09-21 23:27:13 +09:00
memcpy ( buf , vaddr + offset , csize ) ;
2005-06-25 14:58:19 -07:00
2006-01-09 20:51:50 -08:00
iounmap ( vaddr ) ;
2005-06-25 14:58:19 -07:00
return csize ;
}