1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef LINUX_CRASH_CORE_H 3*4882a593Smuzhiyun #define LINUX_CRASH_CORE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/linkage.h> 6*4882a593Smuzhiyun #include <linux/elfcore.h> 7*4882a593Smuzhiyun #include <linux/elf.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define CRASH_CORE_NOTE_NAME "CORE" 10*4882a593Smuzhiyun #define CRASH_CORE_NOTE_HEAD_BYTES ALIGN(sizeof(struct elf_note), 4) 11*4882a593Smuzhiyun #define CRASH_CORE_NOTE_NAME_BYTES ALIGN(sizeof(CRASH_CORE_NOTE_NAME), 4) 12*4882a593Smuzhiyun #define CRASH_CORE_NOTE_DESC_BYTES ALIGN(sizeof(struct elf_prstatus), 4) 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * The per-cpu notes area is a list of notes terminated by a "NULL" 16*4882a593Smuzhiyun * note header. For kdump, the code in vmcore.c runs in the context 17*4882a593Smuzhiyun * of the second kernel to combine them into one note. 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun #define CRASH_CORE_NOTE_BYTES ((CRASH_CORE_NOTE_HEAD_BYTES * 2) + \ 20*4882a593Smuzhiyun CRASH_CORE_NOTE_NAME_BYTES + \ 21*4882a593Smuzhiyun CRASH_CORE_NOTE_DESC_BYTES) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define VMCOREINFO_BYTES PAGE_SIZE 24*4882a593Smuzhiyun #define VMCOREINFO_NOTE_NAME "VMCOREINFO" 25*4882a593Smuzhiyun #define VMCOREINFO_NOTE_NAME_BYTES ALIGN(sizeof(VMCOREINFO_NOTE_NAME), 4) 26*4882a593Smuzhiyun #define VMCOREINFO_NOTE_SIZE ((CRASH_CORE_NOTE_HEAD_BYTES * 2) + \ 27*4882a593Smuzhiyun VMCOREINFO_NOTE_NAME_BYTES + \ 28*4882a593Smuzhiyun VMCOREINFO_BYTES) 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun typedef u32 note_buf_t[CRASH_CORE_NOTE_BYTES/4]; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun void crash_update_vmcoreinfo_safecopy(void *ptr); 33*4882a593Smuzhiyun void crash_save_vmcoreinfo(void); 34*4882a593Smuzhiyun void arch_crash_save_vmcoreinfo(void); 35*4882a593Smuzhiyun __printf(1, 2) 36*4882a593Smuzhiyun void vmcoreinfo_append_str(const char *fmt, ...); 37*4882a593Smuzhiyun phys_addr_t paddr_vmcoreinfo_note(void); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define VMCOREINFO_OSRELEASE(value) \ 40*4882a593Smuzhiyun vmcoreinfo_append_str("OSRELEASE=%s\n", value) 41*4882a593Smuzhiyun #define VMCOREINFO_BUILD_ID(value) \ 42*4882a593Smuzhiyun vmcoreinfo_append_str("BUILD-ID=%s\n", value) 43*4882a593Smuzhiyun #define VMCOREINFO_PAGESIZE(value) \ 44*4882a593Smuzhiyun vmcoreinfo_append_str("PAGESIZE=%ld\n", value) 45*4882a593Smuzhiyun #define VMCOREINFO_SYMBOL(name) \ 46*4882a593Smuzhiyun vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)&name) 47*4882a593Smuzhiyun #define VMCOREINFO_SYMBOL_ARRAY(name) \ 48*4882a593Smuzhiyun vmcoreinfo_append_str("SYMBOL(%s)=%lx\n", #name, (unsigned long)name) 49*4882a593Smuzhiyun #define VMCOREINFO_SIZE(name) \ 50*4882a593Smuzhiyun vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ 51*4882a593Smuzhiyun (unsigned long)sizeof(name)) 52*4882a593Smuzhiyun #define VMCOREINFO_STRUCT_SIZE(name) \ 53*4882a593Smuzhiyun vmcoreinfo_append_str("SIZE(%s)=%lu\n", #name, \ 54*4882a593Smuzhiyun (unsigned long)sizeof(struct name)) 55*4882a593Smuzhiyun #define VMCOREINFO_OFFSET(name, field) \ 56*4882a593Smuzhiyun vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \ 57*4882a593Smuzhiyun (unsigned long)offsetof(struct name, field)) 58*4882a593Smuzhiyun #define VMCOREINFO_TYPE_OFFSET(name, field) \ 59*4882a593Smuzhiyun vmcoreinfo_append_str("OFFSET(%s.%s)=%lu\n", #name, #field, \ 60*4882a593Smuzhiyun (unsigned long)offsetof(name, field)) 61*4882a593Smuzhiyun #define VMCOREINFO_LENGTH(name, value) \ 62*4882a593Smuzhiyun vmcoreinfo_append_str("LENGTH(%s)=%lu\n", #name, (unsigned long)value) 63*4882a593Smuzhiyun #define VMCOREINFO_NUMBER(name) \ 64*4882a593Smuzhiyun vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name) 65*4882a593Smuzhiyun #define VMCOREINFO_CONFIG(name) \ 66*4882a593Smuzhiyun vmcoreinfo_append_str("CONFIG_%s=y\n", #name) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun extern unsigned char *vmcoreinfo_data; 69*4882a593Smuzhiyun extern size_t vmcoreinfo_size; 70*4882a593Smuzhiyun extern u32 *vmcoreinfo_note; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* raw contents of kernel .notes section */ 73*4882a593Smuzhiyun extern const void __start_notes __weak; 74*4882a593Smuzhiyun extern const void __stop_notes __weak; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun Elf_Word *append_elf_note(Elf_Word *buf, char *name, unsigned int type, 77*4882a593Smuzhiyun void *data, size_t data_len); 78*4882a593Smuzhiyun void final_note(Elf_Word *buf); 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun int __init parse_crashkernel(char *cmdline, unsigned long long system_ram, 81*4882a593Smuzhiyun unsigned long long *crash_size, unsigned long long *crash_base); 82*4882a593Smuzhiyun int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, 83*4882a593Smuzhiyun unsigned long long *crash_size, unsigned long long *crash_base); 84*4882a593Smuzhiyun int parse_crashkernel_low(char *cmdline, unsigned long long system_ram, 85*4882a593Smuzhiyun unsigned long long *crash_size, unsigned long long *crash_base); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #endif /* LINUX_CRASH_CORE_H */ 88