Branch data Line data Source code
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 : 644 : static inline bool is_kdump_kernel(void) 65 : : { 66 [ - + + - : 644 : 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 : 28 : static inline int is_vmcore_usable(void) 78 : : { 79 [ - + - - ]: 28 : 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 */