![Michael Holzheu](/assets/img/avatar_default.png)
Currently only the address of the pre-allocated ELF header is passed with the elfcorehdr= kernel parameter. In order to reserve memory for the header in the 2nd kernel also the size is required. Current kdump architecture backends use different methods to do that, e.g. x86 uses the memmap= kernel parameter. On s390 there is no easy way to transfer this information. Therefore the elfcorehdr kernel parameter is extended to also pass the size. This now can also be used as standard mechanism by all future kdump architecture backends. The syntax of the kernel parameter is extended as follows: elfcorehdr=[size[KMG]@]offset[KMG] This change is backward compatible because elfcorehdr=size is still allowed. Acked-by: Vivek Goyal <vgoyal@redhat.com> Acked-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
81 lines
2.3 KiB
C
81 lines
2.3 KiB
C
#ifndef LINUX_CRASH_DUMP_H
|
|
#define LINUX_CRASH_DUMP_H
|
|
|
|
#ifdef CONFIG_CRASH_DUMP
|
|
#include <linux/kexec.h>
|
|
#include <linux/device.h>
|
|
#include <linux/proc_fs.h>
|
|
|
|
#define ELFCORE_ADDR_MAX (-1ULL)
|
|
#define ELFCORE_ADDR_ERR (-2ULL)
|
|
|
|
extern unsigned long long elfcorehdr_addr;
|
|
extern unsigned long long elfcorehdr_size;
|
|
|
|
extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,
|
|
unsigned long, int);
|
|
|
|
/* Architecture code defines this if there are other possible ELF
|
|
* machine types, e.g. on bi-arch capable hardware. */
|
|
#ifndef vmcore_elf_check_arch_cross
|
|
#define vmcore_elf_check_arch_cross(x) 0
|
|
#endif
|
|
|
|
/*
|
|
* Architecture code can redefine this if there are any special checks
|
|
* needed for 64-bit ELF vmcores. In case of 32-bit only architecture,
|
|
* this can be set to zero.
|
|
*/
|
|
#ifndef vmcore_elf64_check_arch
|
|
#define vmcore_elf64_check_arch(x) (elf_check_arch(x) || vmcore_elf_check_arch_cross(x))
|
|
#endif
|
|
|
|
/*
|
|
* is_kdump_kernel() checks whether this kernel is booting after a panic of
|
|
* previous kernel or not. This is determined by checking if previous kernel
|
|
* has passed the elf core header address on command line.
|
|
*
|
|
* This is not just a test if CONFIG_CRASH_DUMP is enabled or not. It will
|
|
* return 1 if CONFIG_CRASH_DUMP=y and if kernel is booting after a panic of
|
|
* previous kernel.
|
|
*/
|
|
|
|
static inline int is_kdump_kernel(void)
|
|
{
|
|
return (elfcorehdr_addr != ELFCORE_ADDR_MAX) ? 1 : 0;
|
|
}
|
|
|
|
/* is_vmcore_usable() checks if the kernel is booting after a panic and
|
|
* the vmcore region is usable.
|
|
*
|
|
* This makes use of the fact that due to alignment -2ULL is not
|
|
* a valid pointer, much in the vain of IS_ERR(), except
|
|
* dealing directly with an unsigned long long rather than a pointer.
|
|
*/
|
|
|
|
static inline int is_vmcore_usable(void)
|
|
{
|
|
return is_kdump_kernel() && elfcorehdr_addr != ELFCORE_ADDR_ERR ? 1 : 0;
|
|
}
|
|
|
|
/* vmcore_unusable() marks the vmcore as unusable,
|
|
* without disturbing the logic of is_kdump_kernel()
|
|
*/
|
|
|
|
static inline void vmcore_unusable(void)
|
|
{
|
|
if (is_kdump_kernel())
|
|
elfcorehdr_addr = ELFCORE_ADDR_ERR;
|
|
}
|
|
|
|
#define HAVE_OLDMEM_PFN_IS_RAM 1
|
|
extern int register_oldmem_pfn_is_ram(int (*fn)(unsigned long pfn));
|
|
extern void unregister_oldmem_pfn_is_ram(void);
|
|
|
|
#else /* !CONFIG_CRASH_DUMP */
|
|
static inline int is_kdump_kernel(void) { return 0; }
|
|
#endif /* CONFIG_CRASH_DUMP */
|
|
|
|
extern unsigned long saved_max_pfn;
|
|
#endif /* LINUX_CRASHDUMP_H */
|