19c17d615SPaolo Bonzini /* 29c17d615SPaolo Bonzini * QEMU dump 39c17d615SPaolo Bonzini * 49c17d615SPaolo Bonzini * Copyright Fujitsu, Corp. 2011, 2012 59c17d615SPaolo Bonzini * 69c17d615SPaolo Bonzini * Authors: 79c17d615SPaolo Bonzini * Wen Congyang <wency@cn.fujitsu.com> 89c17d615SPaolo Bonzini * 99c17d615SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2 or later. 109c17d615SPaolo Bonzini * See the COPYING file in the top-level directory. 119c17d615SPaolo Bonzini * 129c17d615SPaolo Bonzini */ 139c17d615SPaolo Bonzini 149c17d615SPaolo Bonzini #ifndef DUMP_H 159c17d615SPaolo Bonzini #define DUMP_H 169c17d615SPaolo Bonzini 17d06b747bSMarkus Armbruster #include "qapi/qapi-types-dump.h" 187a5951f6SMarkus Armbruster #include "qemu/thread.h" 199af23989SMarkus Armbruster 20fda05387Sqiaonuohan #define MAKEDUMPFILE_SIGNATURE "makedumpfile" 21fda05387Sqiaonuohan #define MAX_SIZE_MDF_HEADER (4096) /* max size of makedumpfile_header */ 22fda05387Sqiaonuohan #define TYPE_FLAT_HEADER (1) /* type of flattened format */ 23fda05387Sqiaonuohan #define VERSION_FLAT_HEADER (1) /* version of flattened format */ 24fda05387Sqiaonuohan #define END_FLAG_FLAT_HEADER (-1) 25fda05387Sqiaonuohan 268161befdSAndrew Jones #ifndef ARCH_PFN_OFFSET 277aad248dSqiaonuohan #define ARCH_PFN_OFFSET (0) 288161befdSAndrew Jones #endif 297aad248dSqiaonuohan 30298f1168Sqiaonuohan /* 31298f1168Sqiaonuohan * flag for compressed format 32298f1168Sqiaonuohan */ 33298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_ZLIB (0x1) 34298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_LZO (0x2) 35298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_SNAPPY (0x4) 36298f1168Sqiaonuohan 37298f1168Sqiaonuohan #define KDUMP_SIGNATURE "KDUMP " 38298f1168Sqiaonuohan #define SIG_LEN (sizeof(KDUMP_SIGNATURE) - 1) 39298f1168Sqiaonuohan #define DUMP_LEVEL (1) 40298f1168Sqiaonuohan #define DISKDUMP_HEADER_BLOCKS (1) 41298f1168Sqiaonuohan 42acb0ef58SBharata B Rao #include "sysemu/dump-arch.h" 43acb0ef58SBharata B Rao #include "sysemu/memory_mapping.h" 449c17d615SPaolo Bonzini 45fda05387Sqiaonuohan typedef struct QEMU_PACKED MakedumpfileHeader { 46fda05387Sqiaonuohan char signature[16]; /* = "makedumpfile" */ 47fda05387Sqiaonuohan int64_t type; 48fda05387Sqiaonuohan int64_t version; 49fda05387Sqiaonuohan } MakedumpfileHeader; 50fda05387Sqiaonuohan 51fda05387Sqiaonuohan typedef struct QEMU_PACKED MakedumpfileDataHeader { 52fda05387Sqiaonuohan int64_t offset; 53fda05387Sqiaonuohan int64_t buf_size; 54fda05387Sqiaonuohan } MakedumpfileDataHeader; 55fda05387Sqiaonuohan 56298f1168Sqiaonuohan typedef struct QEMU_PACKED NewUtsname { 57298f1168Sqiaonuohan char sysname[65]; 58298f1168Sqiaonuohan char nodename[65]; 59298f1168Sqiaonuohan char release[65]; 60298f1168Sqiaonuohan char version[65]; 61298f1168Sqiaonuohan char machine[65]; 62298f1168Sqiaonuohan char domainname[65]; 63298f1168Sqiaonuohan } NewUtsname; 64298f1168Sqiaonuohan 65298f1168Sqiaonuohan typedef struct QEMU_PACKED DiskDumpHeader32 { 66298f1168Sqiaonuohan char signature[SIG_LEN]; /* = "KDUMP " */ 67298f1168Sqiaonuohan uint32_t header_version; /* Dump header version */ 68298f1168Sqiaonuohan NewUtsname utsname; /* copy of system_utsname */ 69298f1168Sqiaonuohan char timestamp[10]; /* Time stamp */ 70298f1168Sqiaonuohan uint32_t status; /* Above flags */ 71298f1168Sqiaonuohan uint32_t block_size; /* Size of a block in byte */ 72298f1168Sqiaonuohan uint32_t sub_hdr_size; /* Size of arch dependent header in block */ 73298f1168Sqiaonuohan uint32_t bitmap_blocks; /* Size of Memory bitmap in block */ 74298f1168Sqiaonuohan uint32_t max_mapnr; /* = max_mapnr , 75298f1168Sqiaonuohan obsoleted in header_version 6 */ 76298f1168Sqiaonuohan uint32_t total_ram_blocks; /* Number of blocks should be written */ 77298f1168Sqiaonuohan uint32_t device_blocks; /* Number of total blocks in dump device */ 78298f1168Sqiaonuohan uint32_t written_blocks; /* Number of written blocks */ 79298f1168Sqiaonuohan uint32_t current_cpu; /* CPU# which handles dump */ 80298f1168Sqiaonuohan uint32_t nr_cpus; /* Number of CPUs */ 81298f1168Sqiaonuohan } DiskDumpHeader32; 82298f1168Sqiaonuohan 83298f1168Sqiaonuohan typedef struct QEMU_PACKED DiskDumpHeader64 { 84298f1168Sqiaonuohan char signature[SIG_LEN]; /* = "KDUMP " */ 85298f1168Sqiaonuohan uint32_t header_version; /* Dump header version */ 86298f1168Sqiaonuohan NewUtsname utsname; /* copy of system_utsname */ 87298f1168Sqiaonuohan char timestamp[22]; /* Time stamp */ 88298f1168Sqiaonuohan uint32_t status; /* Above flags */ 89298f1168Sqiaonuohan uint32_t block_size; /* Size of a block in byte */ 90298f1168Sqiaonuohan uint32_t sub_hdr_size; /* Size of arch dependent header in block */ 91298f1168Sqiaonuohan uint32_t bitmap_blocks; /* Size of Memory bitmap in block */ 92298f1168Sqiaonuohan uint32_t max_mapnr; /* = max_mapnr, 93298f1168Sqiaonuohan obsoleted in header_version 6 */ 94298f1168Sqiaonuohan uint32_t total_ram_blocks; /* Number of blocks should be written */ 95298f1168Sqiaonuohan uint32_t device_blocks; /* Number of total blocks in dump device */ 96298f1168Sqiaonuohan uint32_t written_blocks; /* Number of written blocks */ 97298f1168Sqiaonuohan uint32_t current_cpu; /* CPU# which handles dump */ 98298f1168Sqiaonuohan uint32_t nr_cpus; /* Number of CPUs */ 99298f1168Sqiaonuohan } DiskDumpHeader64; 100298f1168Sqiaonuohan 101298f1168Sqiaonuohan typedef struct QEMU_PACKED KdumpSubHeader32 { 102298f1168Sqiaonuohan uint32_t phys_base; 103298f1168Sqiaonuohan uint32_t dump_level; /* header_version 1 and later */ 104298f1168Sqiaonuohan uint32_t split; /* header_version 2 and later */ 105298f1168Sqiaonuohan uint32_t start_pfn; /* header_version 2 and later, 106298f1168Sqiaonuohan obsoleted in header_version 6 */ 107298f1168Sqiaonuohan uint32_t end_pfn; /* header_version 2 and later, 108298f1168Sqiaonuohan obsoleted in header_version 6 */ 109298f1168Sqiaonuohan uint64_t offset_vmcoreinfo; /* header_version 3 and later */ 110298f1168Sqiaonuohan uint32_t size_vmcoreinfo; /* header_version 3 and later */ 111298f1168Sqiaonuohan uint64_t offset_note; /* header_version 4 and later */ 112298f1168Sqiaonuohan uint32_t note_size; /* header_version 4 and later */ 113298f1168Sqiaonuohan uint64_t offset_eraseinfo; /* header_version 5 and later */ 114298f1168Sqiaonuohan uint32_t size_eraseinfo; /* header_version 5 and later */ 115298f1168Sqiaonuohan uint64_t start_pfn_64; /* header_version 6 and later */ 116298f1168Sqiaonuohan uint64_t end_pfn_64; /* header_version 6 and later */ 117298f1168Sqiaonuohan uint64_t max_mapnr_64; /* header_version 6 and later */ 118298f1168Sqiaonuohan } KdumpSubHeader32; 119298f1168Sqiaonuohan 120298f1168Sqiaonuohan typedef struct QEMU_PACKED KdumpSubHeader64 { 121298f1168Sqiaonuohan uint64_t phys_base; 122298f1168Sqiaonuohan uint32_t dump_level; /* header_version 1 and later */ 123298f1168Sqiaonuohan uint32_t split; /* header_version 2 and later */ 124298f1168Sqiaonuohan uint64_t start_pfn; /* header_version 2 and later, 125298f1168Sqiaonuohan obsoleted in header_version 6 */ 126298f1168Sqiaonuohan uint64_t end_pfn; /* header_version 2 and later, 127298f1168Sqiaonuohan obsoleted in header_version 6 */ 128298f1168Sqiaonuohan uint64_t offset_vmcoreinfo; /* header_version 3 and later */ 129298f1168Sqiaonuohan uint64_t size_vmcoreinfo; /* header_version 3 and later */ 130298f1168Sqiaonuohan uint64_t offset_note; /* header_version 4 and later */ 131298f1168Sqiaonuohan uint64_t note_size; /* header_version 4 and later */ 132298f1168Sqiaonuohan uint64_t offset_eraseinfo; /* header_version 5 and later */ 133298f1168Sqiaonuohan uint64_t size_eraseinfo; /* header_version 5 and later */ 134298f1168Sqiaonuohan uint64_t start_pfn_64; /* header_version 6 and later */ 135298f1168Sqiaonuohan uint64_t end_pfn_64; /* header_version 6 and later */ 136298f1168Sqiaonuohan uint64_t max_mapnr_64; /* header_version 6 and later */ 137298f1168Sqiaonuohan } KdumpSubHeader64; 138298f1168Sqiaonuohan 13964cfba6aSqiaonuohan typedef struct DataCache { 1404d7dd4edSStephen Brennan DumpState *state; /* dump state related to this data */ 14164cfba6aSqiaonuohan uint8_t *buf; /* buffer for cached data */ 14264cfba6aSqiaonuohan size_t buf_size; /* size of the buf */ 14364cfba6aSqiaonuohan size_t data_size; /* size of cached data in buf */ 14464cfba6aSqiaonuohan off_t offset; /* offset of the file */ 14564cfba6aSqiaonuohan } DataCache; 14664cfba6aSqiaonuohan 147d12f57ecSqiaonuohan typedef struct QEMU_PACKED PageDescriptor { 148d12f57ecSqiaonuohan uint64_t offset; /* the offset of the page data*/ 149d12f57ecSqiaonuohan uint32_t size; /* the size of this dump page */ 150d12f57ecSqiaonuohan uint32_t flags; /* flags */ 151d12f57ecSqiaonuohan uint64_t page_flags; /* page flags */ 152d12f57ecSqiaonuohan } PageDescriptor; 153d12f57ecSqiaonuohan 154acb0ef58SBharata B Rao typedef struct DumpState { 155acb0ef58SBharata B Rao GuestPhysBlockList guest_phys_blocks; 156acb0ef58SBharata B Rao ArchDumpInfo dump_info; 157acb0ef58SBharata B Rao MemoryMappingList list; 158acb0ef58SBharata B Rao bool resume; 1596796b400SFam Zheng bool detached; 160*d43a01dbSStephen Brennan bool kdump_raw; 161acb0ef58SBharata B Rao hwaddr memory_offset; 162acb0ef58SBharata B Rao int fd; 1639c17d615SPaolo Bonzini 164dddf725fSJanosch Frank /* 165dddf725fSJanosch Frank * Dump filter area variables 166dddf725fSJanosch Frank * 167dddf725fSJanosch Frank * A filtered dump only contains the guest memory designated by 168dddf725fSJanosch Frank * the start address and length variables defined below. 169dddf725fSJanosch Frank * 170dddf725fSJanosch Frank * If length is 0, no filtering is applied. 171dddf725fSJanosch Frank */ 172dddf725fSJanosch Frank int64_t filter_area_begin; /* Start address of partial guest memory area */ 173dddf725fSJanosch Frank int64_t filter_area_length; /* Length of partial guest memory area */ 174acb0ef58SBharata B Rao 1758384b73cSJanosch Frank /* Elf dump related data */ 1768384b73cSJanosch Frank uint32_t phdr_num; 1778384b73cSJanosch Frank uint32_t shdr_num; 1788384b73cSJanosch Frank ssize_t note_size; 1798384b73cSJanosch Frank hwaddr shdr_offset; 1808384b73cSJanosch Frank hwaddr phdr_offset; 1818384b73cSJanosch Frank hwaddr section_offset; 1828384b73cSJanosch Frank hwaddr note_offset; 1838384b73cSJanosch Frank 184e41ed29bSJanosch Frank void *elf_section_hdrs; /* Pointer to section header buffer */ 1859b72224fSJanosch Frank void *elf_section_data; /* Pointer to section data buffer */ 1869b72224fSJanosch Frank uint64_t elf_section_data_size; /* Size of section data */ 1879b72224fSJanosch Frank GArray *string_table_buf; /* String table data buffer */ 188e41ed29bSJanosch Frank 189acb0ef58SBharata B Rao uint8_t *note_buf; /* buffer for notes */ 190acb0ef58SBharata B Rao size_t note_buf_offset; /* the writing place in note_buf */ 191acb0ef58SBharata B Rao uint32_t nr_cpus; /* number of guest's cpu */ 192acb0ef58SBharata B Rao uint64_t max_mapnr; /* the biggest guest's phys-mem's number */ 193acb0ef58SBharata B Rao size_t len_dump_bitmap; /* the size of the place used to store 194acb0ef58SBharata B Rao dump_bitmap in vmcore */ 195acb0ef58SBharata B Rao off_t offset_dump_bitmap; /* offset of dump_bitmap part in vmcore */ 196acb0ef58SBharata B Rao off_t offset_page; /* offset of page part in vmcore */ 197acb0ef58SBharata B Rao size_t num_dumpable; /* number of page that can be dumped */ 198acb0ef58SBharata B Rao uint32_t flag_compress; /* indicate the compression format */ 199baf28f57SPeter Xu DumpStatus status; /* current dump status */ 200ca1fc8c9SPeter Xu 201ca1fc8c9SPeter Xu bool has_format; /* whether format is provided */ 202ca1fc8c9SPeter Xu DumpGuestMemoryFormat format; /* valid only if has_format == true */ 2031fbeff72SPeter Xu QemuThread dump_thread; /* thread for detached dump */ 2042264c2c9SPeter Xu 2052264c2c9SPeter Xu int64_t total_size; /* total memory size (in bytes) to 2062264c2c9SPeter Xu * be dumped. When filter is 2072264c2c9SPeter Xu * enabled, this will only count 2082264c2c9SPeter Xu * those to be written. */ 2092264c2c9SPeter Xu int64_t written_size; /* written memory size (in bytes), 2102264c2c9SPeter Xu * this could be used to calculate 2112264c2c9SPeter Xu * how much work we have 2122264c2c9SPeter Xu * finished. */ 213903ef734SMarc-André Lureau uint8_t *guest_note; /* ELF note content */ 214903ef734SMarc-André Lureau size_t guest_note_size; 215acb0ef58SBharata B Rao } DumpState; 216acb0ef58SBharata B Rao 217acb0ef58SBharata B Rao uint16_t cpu_to_dump16(DumpState *s, uint16_t val); 218acb0ef58SBharata B Rao uint32_t cpu_to_dump32(DumpState *s, uint32_t val); 219acb0ef58SBharata B Rao uint64_t cpu_to_dump64(DumpState *s, uint64_t val); 220113d8f4eSJanosch Frank 221113d8f4eSJanosch Frank int64_t dump_filtered_memblock_size(GuestPhysBlock *block, int64_t filter_area_start, 222113d8f4eSJanosch Frank int64_t filter_area_length); 223113d8f4eSJanosch Frank int64_t dump_filtered_memblock_start(GuestPhysBlock *block, int64_t filter_area_start, 224113d8f4eSJanosch Frank int64_t filter_area_length); 2259c17d615SPaolo Bonzini #endif 226