root/include/linux/crash_dump.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. is_kdump_kernel
  2. is_vmcore_usable
  3. vmcore_unusable
  4. is_kdump_kernel
  5. vmcore_add_device_dump
  6. read_from_oldmem

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef LINUX_CRASH_DUMP_H
   3 #define LINUX_CRASH_DUMP_H
   4 
   5 #include <linux/kexec.h>
   6 #include <linux/proc_fs.h>
   7 #include <linux/elf.h>
   8 #include <uapi/linux/vmcore.h>
   9 
  10 #include <asm/pgtable.h> /* for pgprot_t */
  11 
  12 #ifdef CONFIG_CRASH_DUMP
  13 #define ELFCORE_ADDR_MAX        (-1ULL)
  14 #define ELFCORE_ADDR_ERR        (-2ULL)
  15 
  16 extern unsigned long long elfcorehdr_addr;
  17 extern unsigned long long elfcorehdr_size;
  18 
  19 extern int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size);
  20 extern void elfcorehdr_free(unsigned long long addr);
  21 extern ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos);
  22 extern ssize_t elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos);
  23 extern int remap_oldmem_pfn_range(struct vm_area_struct *vma,
  24                                   unsigned long from, unsigned long pfn,
  25                                   unsigned long size, pgprot_t prot);
  26 
  27 extern ssize_t copy_oldmem_page(unsigned long, char *, size_t,
  28                                                 unsigned long, int);
  29 extern ssize_t copy_oldmem_page_encrypted(unsigned long pfn, char *buf,
  30                                           size_t csize, unsigned long offset,
  31                                           int userbuf);
  32 
  33 void vmcore_cleanup(void);
  34 
  35 /* Architecture code defines this if there are other possible ELF
  36  * machine types, e.g. on bi-arch capable hardware. */
  37 #ifndef vmcore_elf_check_arch_cross
  38 #define vmcore_elf_check_arch_cross(x) 0
  39 #endif
  40 
  41 /*
  42  * Architecture code can redefine this if there are any special checks
  43  * needed for 32-bit ELF or 64-bit ELF vmcores.  In case of 32-bit
  44  * only architecture, vmcore_elf64_check_arch can be set to zero.
  45  */
  46 #ifndef vmcore_elf32_check_arch
  47 #define vmcore_elf32_check_arch(x) elf_check_arch(x)
  48 #endif
  49 
  50 #ifndef vmcore_elf64_check_arch
  51 #define vmcore_elf64_check_arch(x) (elf_check_arch(x) || vmcore_elf_check_arch_cross(x))
  52 #endif
  53 
  54 /*
  55  * is_kdump_kernel() checks whether this kernel is booting after a panic of
  56  * previous kernel or not. This is determined by checking if previous kernel
  57  * has passed the elf core header address on command line.
  58  *
  59  * This is not just a test if CONFIG_CRASH_DUMP is enabled or not. It will
  60  * return true if CONFIG_CRASH_DUMP=y and if kernel is booting after a panic
  61  * of previous kernel.
  62  */
  63 
  64 static inline bool is_kdump_kernel(void)
  65 {
  66         return elfcorehdr_addr != ELFCORE_ADDR_MAX;
  67 }
  68 
  69 /* is_vmcore_usable() checks if the kernel is booting after a panic and
  70  * the vmcore region is usable.
  71  *
  72  * This makes use of the fact that due to alignment -2ULL is not
  73  * a valid pointer, much in the vain of IS_ERR(), except
  74  * dealing directly with an unsigned long long rather than a pointer.
  75  */
  76 
  77 static inline int is_vmcore_usable(void)
  78 {
  79         return is_kdump_kernel() && elfcorehdr_addr != ELFCORE_ADDR_ERR ? 1 : 0;
  80 }
  81 
  82 /* vmcore_unusable() marks the vmcore as unusable,
  83  * without disturbing the logic of is_kdump_kernel()
  84  */
  85 
  86 static inline void vmcore_unusable(void)
  87 {
  88         if (is_kdump_kernel())
  89                 elfcorehdr_addr = ELFCORE_ADDR_ERR;
  90 }
  91 
  92 #define HAVE_OLDMEM_PFN_IS_RAM 1
  93 extern int register_oldmem_pfn_is_ram(int (*fn)(unsigned long pfn));
  94 extern void unregister_oldmem_pfn_is_ram(void);
  95 
  96 #else /* !CONFIG_CRASH_DUMP */
  97 static inline bool is_kdump_kernel(void) { return 0; }
  98 #endif /* CONFIG_CRASH_DUMP */
  99 
 100 extern unsigned long saved_max_pfn;
 101 
 102 /* Device Dump information to be filled by drivers */
 103 struct vmcoredd_data {
 104         char dump_name[VMCOREDD_MAX_NAME_BYTES]; /* Unique name of the dump */
 105         unsigned int size;                       /* Size of the dump */
 106         /* Driver's registered callback to be invoked to collect dump */
 107         int (*vmcoredd_callback)(struct vmcoredd_data *data, void *buf);
 108 };
 109 
 110 #ifdef CONFIG_PROC_VMCORE_DEVICE_DUMP
 111 int vmcore_add_device_dump(struct vmcoredd_data *data);
 112 #else
 113 static inline int vmcore_add_device_dump(struct vmcoredd_data *data)
 114 {
 115         return -EOPNOTSUPP;
 116 }
 117 #endif /* CONFIG_PROC_VMCORE_DEVICE_DUMP */
 118 
 119 #ifdef CONFIG_PROC_VMCORE
 120 ssize_t read_from_oldmem(char *buf, size_t count,
 121                          u64 *ppos, int userbuf,
 122                          bool encrypted);
 123 #else
 124 static inline ssize_t read_from_oldmem(char *buf, size_t count,
 125                                        u64 *ppos, int userbuf,
 126                                        bool encrypted)
 127 {
 128         return -EOPNOTSUPP;
 129 }
 130 #endif /* CONFIG_PROC_VMCORE */
 131 
 132 #endif /* LINUX_CRASHDUMP_H */

/* [<][>][^][v][top][bottom][index][help] */