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 17fda05387Sqiaonuohan #define MAKEDUMPFILE_SIGNATURE "makedumpfile" 18fda05387Sqiaonuohan #define MAX_SIZE_MDF_HEADER (4096) /* max size of makedumpfile_header */ 19fda05387Sqiaonuohan #define TYPE_FLAT_HEADER (1) /* type of flattened format */ 20fda05387Sqiaonuohan #define VERSION_FLAT_HEADER (1) /* version of flattened format */ 21fda05387Sqiaonuohan #define END_FLAG_FLAT_HEADER (-1) 22fda05387Sqiaonuohan 237aad248dSqiaonuohan #define ARCH_PFN_OFFSET (0) 247aad248dSqiaonuohan 257aad248dSqiaonuohan #define paddr_to_pfn(X, page_shift) \ 267aad248dSqiaonuohan (((unsigned long long)(X) >> (page_shift)) - ARCH_PFN_OFFSET) 277aad248dSqiaonuohan #define pfn_to_paddr(X, page_shift) \ 287aad248dSqiaonuohan (((unsigned long long)(X) + ARCH_PFN_OFFSET) << (page_shift)) 297aad248dSqiaonuohan 30*298f1168Sqiaonuohan /* 31*298f1168Sqiaonuohan * flag for compressed format 32*298f1168Sqiaonuohan */ 33*298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_ZLIB (0x1) 34*298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_LZO (0x2) 35*298f1168Sqiaonuohan #define DUMP_DH_COMPRESSED_SNAPPY (0x4) 36*298f1168Sqiaonuohan 37*298f1168Sqiaonuohan #define KDUMP_SIGNATURE "KDUMP " 38*298f1168Sqiaonuohan #define SIG_LEN (sizeof(KDUMP_SIGNATURE) - 1) 39*298f1168Sqiaonuohan #define PHYS_BASE (0) 40*298f1168Sqiaonuohan #define DUMP_LEVEL (1) 41*298f1168Sqiaonuohan #define DISKDUMP_HEADER_BLOCKS (1) 42*298f1168Sqiaonuohan 439c17d615SPaolo Bonzini typedef struct ArchDumpInfo { 449c17d615SPaolo Bonzini int d_machine; /* Architecture */ 459c17d615SPaolo Bonzini int d_endian; /* ELFDATA2LSB or ELFDATA2MSB */ 469c17d615SPaolo Bonzini int d_class; /* ELFCLASS32 or ELFCLASS64 */ 479c17d615SPaolo Bonzini } ArchDumpInfo; 489c17d615SPaolo Bonzini 49fda05387Sqiaonuohan typedef struct QEMU_PACKED MakedumpfileHeader { 50fda05387Sqiaonuohan char signature[16]; /* = "makedumpfile" */ 51fda05387Sqiaonuohan int64_t type; 52fda05387Sqiaonuohan int64_t version; 53fda05387Sqiaonuohan } MakedumpfileHeader; 54fda05387Sqiaonuohan 55fda05387Sqiaonuohan typedef struct QEMU_PACKED MakedumpfileDataHeader { 56fda05387Sqiaonuohan int64_t offset; 57fda05387Sqiaonuohan int64_t buf_size; 58fda05387Sqiaonuohan } MakedumpfileDataHeader; 59fda05387Sqiaonuohan 60*298f1168Sqiaonuohan typedef struct QEMU_PACKED NewUtsname { 61*298f1168Sqiaonuohan char sysname[65]; 62*298f1168Sqiaonuohan char nodename[65]; 63*298f1168Sqiaonuohan char release[65]; 64*298f1168Sqiaonuohan char version[65]; 65*298f1168Sqiaonuohan char machine[65]; 66*298f1168Sqiaonuohan char domainname[65]; 67*298f1168Sqiaonuohan } NewUtsname; 68*298f1168Sqiaonuohan 69*298f1168Sqiaonuohan typedef struct QEMU_PACKED DiskDumpHeader32 { 70*298f1168Sqiaonuohan char signature[SIG_LEN]; /* = "KDUMP " */ 71*298f1168Sqiaonuohan uint32_t header_version; /* Dump header version */ 72*298f1168Sqiaonuohan NewUtsname utsname; /* copy of system_utsname */ 73*298f1168Sqiaonuohan char timestamp[10]; /* Time stamp */ 74*298f1168Sqiaonuohan uint32_t status; /* Above flags */ 75*298f1168Sqiaonuohan uint32_t block_size; /* Size of a block in byte */ 76*298f1168Sqiaonuohan uint32_t sub_hdr_size; /* Size of arch dependent header in block */ 77*298f1168Sqiaonuohan uint32_t bitmap_blocks; /* Size of Memory bitmap in block */ 78*298f1168Sqiaonuohan uint32_t max_mapnr; /* = max_mapnr , 79*298f1168Sqiaonuohan obsoleted in header_version 6 */ 80*298f1168Sqiaonuohan uint32_t total_ram_blocks; /* Number of blocks should be written */ 81*298f1168Sqiaonuohan uint32_t device_blocks; /* Number of total blocks in dump device */ 82*298f1168Sqiaonuohan uint32_t written_blocks; /* Number of written blocks */ 83*298f1168Sqiaonuohan uint32_t current_cpu; /* CPU# which handles dump */ 84*298f1168Sqiaonuohan uint32_t nr_cpus; /* Number of CPUs */ 85*298f1168Sqiaonuohan } DiskDumpHeader32; 86*298f1168Sqiaonuohan 87*298f1168Sqiaonuohan typedef struct QEMU_PACKED DiskDumpHeader64 { 88*298f1168Sqiaonuohan char signature[SIG_LEN]; /* = "KDUMP " */ 89*298f1168Sqiaonuohan uint32_t header_version; /* Dump header version */ 90*298f1168Sqiaonuohan NewUtsname utsname; /* copy of system_utsname */ 91*298f1168Sqiaonuohan char timestamp[22]; /* Time stamp */ 92*298f1168Sqiaonuohan uint32_t status; /* Above flags */ 93*298f1168Sqiaonuohan uint32_t block_size; /* Size of a block in byte */ 94*298f1168Sqiaonuohan uint32_t sub_hdr_size; /* Size of arch dependent header in block */ 95*298f1168Sqiaonuohan uint32_t bitmap_blocks; /* Size of Memory bitmap in block */ 96*298f1168Sqiaonuohan uint32_t max_mapnr; /* = max_mapnr, 97*298f1168Sqiaonuohan obsoleted in header_version 6 */ 98*298f1168Sqiaonuohan uint32_t total_ram_blocks; /* Number of blocks should be written */ 99*298f1168Sqiaonuohan uint32_t device_blocks; /* Number of total blocks in dump device */ 100*298f1168Sqiaonuohan uint32_t written_blocks; /* Number of written blocks */ 101*298f1168Sqiaonuohan uint32_t current_cpu; /* CPU# which handles dump */ 102*298f1168Sqiaonuohan uint32_t nr_cpus; /* Number of CPUs */ 103*298f1168Sqiaonuohan } DiskDumpHeader64; 104*298f1168Sqiaonuohan 105*298f1168Sqiaonuohan typedef struct QEMU_PACKED KdumpSubHeader32 { 106*298f1168Sqiaonuohan uint32_t phys_base; 107*298f1168Sqiaonuohan uint32_t dump_level; /* header_version 1 and later */ 108*298f1168Sqiaonuohan uint32_t split; /* header_version 2 and later */ 109*298f1168Sqiaonuohan uint32_t start_pfn; /* header_version 2 and later, 110*298f1168Sqiaonuohan obsoleted in header_version 6 */ 111*298f1168Sqiaonuohan uint32_t end_pfn; /* header_version 2 and later, 112*298f1168Sqiaonuohan obsoleted in header_version 6 */ 113*298f1168Sqiaonuohan uint64_t offset_vmcoreinfo; /* header_version 3 and later */ 114*298f1168Sqiaonuohan uint32_t size_vmcoreinfo; /* header_version 3 and later */ 115*298f1168Sqiaonuohan uint64_t offset_note; /* header_version 4 and later */ 116*298f1168Sqiaonuohan uint32_t note_size; /* header_version 4 and later */ 117*298f1168Sqiaonuohan uint64_t offset_eraseinfo; /* header_version 5 and later */ 118*298f1168Sqiaonuohan uint32_t size_eraseinfo; /* header_version 5 and later */ 119*298f1168Sqiaonuohan uint64_t start_pfn_64; /* header_version 6 and later */ 120*298f1168Sqiaonuohan uint64_t end_pfn_64; /* header_version 6 and later */ 121*298f1168Sqiaonuohan uint64_t max_mapnr_64; /* header_version 6 and later */ 122*298f1168Sqiaonuohan } KdumpSubHeader32; 123*298f1168Sqiaonuohan 124*298f1168Sqiaonuohan typedef struct QEMU_PACKED KdumpSubHeader64 { 125*298f1168Sqiaonuohan uint64_t phys_base; 126*298f1168Sqiaonuohan uint32_t dump_level; /* header_version 1 and later */ 127*298f1168Sqiaonuohan uint32_t split; /* header_version 2 and later */ 128*298f1168Sqiaonuohan uint64_t start_pfn; /* header_version 2 and later, 129*298f1168Sqiaonuohan obsoleted in header_version 6 */ 130*298f1168Sqiaonuohan uint64_t end_pfn; /* header_version 2 and later, 131*298f1168Sqiaonuohan obsoleted in header_version 6 */ 132*298f1168Sqiaonuohan uint64_t offset_vmcoreinfo; /* header_version 3 and later */ 133*298f1168Sqiaonuohan uint64_t size_vmcoreinfo; /* header_version 3 and later */ 134*298f1168Sqiaonuohan uint64_t offset_note; /* header_version 4 and later */ 135*298f1168Sqiaonuohan uint64_t note_size; /* header_version 4 and later */ 136*298f1168Sqiaonuohan uint64_t offset_eraseinfo; /* header_version 5 and later */ 137*298f1168Sqiaonuohan uint64_t size_eraseinfo; /* header_version 5 and later */ 138*298f1168Sqiaonuohan uint64_t start_pfn_64; /* header_version 6 and later */ 139*298f1168Sqiaonuohan uint64_t end_pfn_64; /* header_version 6 and later */ 140*298f1168Sqiaonuohan uint64_t max_mapnr_64; /* header_version 6 and later */ 141*298f1168Sqiaonuohan } KdumpSubHeader64; 142*298f1168Sqiaonuohan 14356c4bfb3SLaszlo Ersek struct GuestPhysBlockList; /* memory_mapping.h */ 14456c4bfb3SLaszlo Ersek int cpu_get_dump_info(ArchDumpInfo *info, 14556c4bfb3SLaszlo Ersek const struct GuestPhysBlockList *guest_phys_blocks); 1469c17d615SPaolo Bonzini ssize_t cpu_get_note_size(int class, int machine, int nr_cpus); 1479c17d615SPaolo Bonzini 1489c17d615SPaolo Bonzini #endif 149