dump: add API to write dump header

the functions are used to write header of kdump-compressed format to vmcore.
Header of kdump-compressed format includes:
1. common header: DiskDumpHeader32 / DiskDumpHeader64
2. sub header: KdumpSubHeader32 / KdumpSubHeader64
3. extra information: only elf notes here

Signed-off-by: Qiao Nuohan <qiaonuohan@cn.fujitsu.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
This commit is contained in:
qiaonuohan 2014-02-18 14:11:32 +08:00 committed by Luiz Capitulino
parent 7aad248d35
commit 298f116827
2 changed files with 319 additions and 0 deletions

View file

@ -27,6 +27,19 @@
#define pfn_to_paddr(X, page_shift) \
(((unsigned long long)(X) + ARCH_PFN_OFFSET) << (page_shift))
/*
* flag for compressed format
*/
#define DUMP_DH_COMPRESSED_ZLIB (0x1)
#define DUMP_DH_COMPRESSED_LZO (0x2)
#define DUMP_DH_COMPRESSED_SNAPPY (0x4)
#define KDUMP_SIGNATURE "KDUMP "
#define SIG_LEN (sizeof(KDUMP_SIGNATURE) - 1)
#define PHYS_BASE (0)
#define DUMP_LEVEL (1)
#define DISKDUMP_HEADER_BLOCKS (1)
typedef struct ArchDumpInfo {
int d_machine; /* Architecture */
int d_endian; /* ELFDATA2LSB or ELFDATA2MSB */
@ -44,6 +57,89 @@ typedef struct QEMU_PACKED MakedumpfileDataHeader {
int64_t buf_size;
} MakedumpfileDataHeader;
typedef struct QEMU_PACKED NewUtsname {
char sysname[65];
char nodename[65];
char release[65];
char version[65];
char machine[65];
char domainname[65];
} NewUtsname;
typedef struct QEMU_PACKED DiskDumpHeader32 {
char signature[SIG_LEN]; /* = "KDUMP " */
uint32_t header_version; /* Dump header version */
NewUtsname utsname; /* copy of system_utsname */
char timestamp[10]; /* Time stamp */
uint32_t status; /* Above flags */
uint32_t block_size; /* Size of a block in byte */
uint32_t sub_hdr_size; /* Size of arch dependent header in block */
uint32_t bitmap_blocks; /* Size of Memory bitmap in block */
uint32_t max_mapnr; /* = max_mapnr ,
obsoleted in header_version 6 */
uint32_t total_ram_blocks; /* Number of blocks should be written */
uint32_t device_blocks; /* Number of total blocks in dump device */
uint32_t written_blocks; /* Number of written blocks */
uint32_t current_cpu; /* CPU# which handles dump */
uint32_t nr_cpus; /* Number of CPUs */
} DiskDumpHeader32;
typedef struct QEMU_PACKED DiskDumpHeader64 {
char signature[SIG_LEN]; /* = "KDUMP " */
uint32_t header_version; /* Dump header version */
NewUtsname utsname; /* copy of system_utsname */
char timestamp[22]; /* Time stamp */
uint32_t status; /* Above flags */
uint32_t block_size; /* Size of a block in byte */
uint32_t sub_hdr_size; /* Size of arch dependent header in block */
uint32_t bitmap_blocks; /* Size of Memory bitmap in block */
uint32_t max_mapnr; /* = max_mapnr,
obsoleted in header_version 6 */
uint32_t total_ram_blocks; /* Number of blocks should be written */
uint32_t device_blocks; /* Number of total blocks in dump device */
uint32_t written_blocks; /* Number of written blocks */
uint32_t current_cpu; /* CPU# which handles dump */
uint32_t nr_cpus; /* Number of CPUs */
} DiskDumpHeader64;
typedef struct QEMU_PACKED KdumpSubHeader32 {
uint32_t phys_base;
uint32_t dump_level; /* header_version 1 and later */
uint32_t split; /* header_version 2 and later */
uint32_t start_pfn; /* header_version 2 and later,
obsoleted in header_version 6 */
uint32_t end_pfn; /* header_version 2 and later,
obsoleted in header_version 6 */
uint64_t offset_vmcoreinfo; /* header_version 3 and later */
uint32_t size_vmcoreinfo; /* header_version 3 and later */
uint64_t offset_note; /* header_version 4 and later */
uint32_t note_size; /* header_version 4 and later */
uint64_t offset_eraseinfo; /* header_version 5 and later */
uint32_t size_eraseinfo; /* header_version 5 and later */
uint64_t start_pfn_64; /* header_version 6 and later */
uint64_t end_pfn_64; /* header_version 6 and later */
uint64_t max_mapnr_64; /* header_version 6 and later */
} KdumpSubHeader32;
typedef struct QEMU_PACKED KdumpSubHeader64 {
uint64_t phys_base;
uint32_t dump_level; /* header_version 1 and later */
uint32_t split; /* header_version 2 and later */
uint64_t start_pfn; /* header_version 2 and later,
obsoleted in header_version 6 */
uint64_t end_pfn; /* header_version 2 and later,
obsoleted in header_version 6 */
uint64_t offset_vmcoreinfo; /* header_version 3 and later */
uint64_t size_vmcoreinfo; /* header_version 3 and later */
uint64_t offset_note; /* header_version 4 and later */
uint64_t note_size; /* header_version 4 and later */
uint64_t offset_eraseinfo; /* header_version 5 and later */
uint64_t size_eraseinfo; /* header_version 5 and later */
uint64_t start_pfn_64; /* header_version 6 and later */
uint64_t end_pfn_64; /* header_version 6 and later */
uint64_t max_mapnr_64; /* header_version 6 and later */
} KdumpSubHeader64;
struct GuestPhysBlockList; /* memory_mapping.h */
int cpu_get_dump_info(ArchDumpInfo *info,
const struct GuestPhysBlockList *guest_phys_blocks);