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