58 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
	
		
			1.5 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * 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; | ||
|  | } |