Merge tag 'io_uring-5.13-2021-05-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / arch / arm / kernel / crash_dump.c
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  */
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 }