Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  *  Memory preserving reboot related code.
0004  *
0005  *  Created by: Hariprasad Nellitheertha (hari@in.ibm.com)
0006  *  Copyright (C) IBM Corporation, 2004. All rights reserved
0007  */
0008 
0009 #include <linux/errno.h>
0010 #include <linux/crash_dump.h>
0011 #include <linux/uio.h>
0012 #include <linux/io.h>
0013 #include <linux/cc_platform.h>
0014 
0015 static ssize_t __copy_oldmem_page(struct iov_iter *iter, unsigned long pfn,
0016                   size_t csize, unsigned long offset,
0017                   bool encrypted)
0018 {
0019     void  *vaddr;
0020 
0021     if (!csize)
0022         return 0;
0023 
0024     if (encrypted)
0025         vaddr = (__force void *)ioremap_encrypted(pfn << PAGE_SHIFT, PAGE_SIZE);
0026     else
0027         vaddr = (__force void *)ioremap_cache(pfn << PAGE_SHIFT, PAGE_SIZE);
0028 
0029     if (!vaddr)
0030         return -ENOMEM;
0031 
0032     csize = copy_to_iter(vaddr + offset, csize, iter);
0033 
0034     iounmap((void __iomem *)vaddr);
0035     return csize;
0036 }
0037 
0038 ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
0039              unsigned long offset)
0040 {
0041     return __copy_oldmem_page(iter, pfn, csize, offset, false);
0042 }
0043 
0044 /*
0045  * copy_oldmem_page_encrypted - same as copy_oldmem_page() above but ioremap the
0046  * memory with the encryption mask set to accommodate kdump on SME-enabled
0047  * machines.
0048  */
0049 ssize_t copy_oldmem_page_encrypted(struct iov_iter *iter, unsigned long pfn,
0050                    size_t csize, unsigned long offset)
0051 {
0052     return __copy_oldmem_page(iter, pfn, csize, offset, true);
0053 }
0054 
0055 ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos)
0056 {
0057     struct kvec kvec = { .iov_base = buf, .iov_len = count };
0058     struct iov_iter iter;
0059 
0060     iov_iter_kvec(&iter, READ, &kvec, 1, count);
0061 
0062     return read_from_oldmem(&iter, count, ppos,
0063                 cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT));
0064 }