| 1 | |
| 2 | |
| 3 | * Routines for doing kexec-based kdump
|
| 4 | *
|
| 5 | * Copyright (C) 2017 Linaro Limited
|
| 6 | * Author: AKASHI Takahiro <[email protected]>
|
| 7 |
|
| 8 |
|
| 9 | #include <linux/crash_dump.h>
|
| 10 | #include <linux/errno.h>
|
| 11 | #include <linux/io.h>
|
| 12 | #include <linux/uio.h>
|
| 13 | #include <asm/memory.h>
|
| 14 |
|
| 15 | ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn,
|
| 16 | size_t csize, unsigned long offset)
|
| 17 | {
|
| 18 | void *vaddr;
|
| 19 |
|
| 20 | if (!csize)
|
| 21 | return 0;
|
| 22 |
|
| 23 | vaddr = memremap(__pfn_to_phys(pfn), PAGE_SIZE, MEMREMAP_WB);
|
| 24 | if (!vaddr)
|
| 25 | return -ENOMEM;
|
| 26 |
|
| 27 | csize = copy_to_iter(vaddr + offset, csize, iter);
|
| 28 |
|
| 29 | memunmap(vaddr);
|
| 30 |
|
| 31 | return csize;
|
| 32 | }
|
| 33 |
|
| 34 | |
| 35 | * elfcorehdr_read - read from ELF core header
|
| 36 | * @buf: buffer where the data is placed
|
| 37 | * @count: number of bytes to read
|
| 38 | * @ppos: address in the memory
|
| 39 | *
|
| 40 | * This function reads @count bytes from elf core header which exists
|
| 41 | * on crash dump kernel's memory.
|
| 42 |
|
| 43 | ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos)
|
| 44 | {
|
| 45 | memcpy(buf, phys_to_virt((phys_addr_t)*ppos), count);
|
| 46 | *ppos += count;
|
| 47 |
|
| 48 | return count;
|
| 49 | }
|