2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
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>
2017-04-03 05:24:38 +03:00
/*
* Routines for doing kexec - based kdump
*
* Copyright ( C ) 2017 Linaro Limited
* Author : AKASHI Takahiro < takahiro . akashi @ linaro . org >
*/
# 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
2018-11-02 15:36:19 +03:00
* @ count : number of bytes to read
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>
2017-04-03 05:24:38 +03:00
* @ 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 ;
}