-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: kdump: provide /proc/vmcore file
Arch-specific functions are added to allow for implementing a crash dump file interface, /proc/vmcore, which can be viewed as a ELF file. A user space tool, like kexec-tools, is responsible for allocating a separate region for the core's ELF header within crash kdump kernel memory and filling it in when executing kexec_load(). Then, its location will be advertised to crash dump kernel via a new device-tree property, "linux,elfcorehdr", and crash dump kernel preserves the region for later use with reserve_elfcorehdr() at boot time. On crash dump kernel, /proc/vmcore will access the primary kernel's memory with copy_oldmem_page(), which feeds the data page-by-page by ioremap'ing it since it does not reside in linear mapping on crash dump kernel. Meanwhile, elfcorehdr_read() is simple as the region is always mapped. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Reviewed-by: James Morse <james.morse@arm.com> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
- Loading branch information
AKASHI Takahiro
authored and
Catalin Marinas
committed
Apr 5, 2017
1 parent
20a1662
commit e62aaea
Showing
4 changed files
with
136 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
/* | ||
* Routines for doing kexec-based kdump | ||
* | ||
* Copyright (C) 2017 Linaro Limited | ||
* Author: AKASHI Takahiro <takahiro.akashi@linaro.org> | ||
* | ||
* 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/crash_dump.h> | ||
#include <linux/errno.h> | ||
#include <linux/io.h> | ||
#include <linux/memblock.h> | ||
#include <linux/uaccess.h> | ||
#include <asm/memory.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 in a 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 = memremap(__pfn_to_phys(pfn), PAGE_SIZE, MEMREMAP_WB); | ||
if (!vaddr) | ||
return -ENOMEM; | ||
|
||
if (userbuf) { | ||
if (copy_to_user((char __user *)buf, vaddr + offset, csize)) { | ||
memunmap(vaddr); | ||
return -EFAULT; | ||
} | ||
} else { | ||
memcpy(buf, vaddr + offset, csize); | ||
} | ||
|
||
memunmap(vaddr); | ||
|
||
return csize; | ||
} | ||
|
||
/** | ||
* elfcorehdr_read - read from ELF core header | ||
* @buf: buffer where the data is placed | ||
* @csize: number of bytes to read | ||
* @ppos: address in the memory | ||
* | ||
* This function reads @count bytes from elf core header which exists | ||
* on crash dump kernel's memory. | ||
*/ | ||
ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos) | ||
{ | ||
memcpy(buf, phys_to_virt((phys_addr_t)*ppos), count); | ||
return count; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters