Blame sadump.h

Packit Service 501009
/*
Packit Service 501009
 * sadump.h - core analysis suite
Packit Service 501009
 *
Packit Service 501009
 * Copyright (c) 2011 FUJITSU LIMITED
Packit Service 501009
 *
Packit Service 501009
 * This program is free software; you can redistribute it and/or modify
Packit Service 501009
 * it under the terms of the GNU General Public License as published by
Packit Service 501009
 * the Free Software Foundation; either version 2 of the License, or
Packit Service 501009
 * (at your option) any later version.
Packit Service 501009
 *
Packit Service 501009
 * This program is distributed in the hope that it will be useful,
Packit Service 501009
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 501009
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 501009
 * GNU General Public License for more details.
Packit Service 501009
 *
Packit Service 501009
 * Author: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
Packit Service 501009
 */
Packit Service 501009
Packit Service 501009
#include <stdint.h>
Packit Service 501009
#include <stdlib.h>
Packit Service 501009
Packit Service 501009
typedef struct efi_time {
Packit Service 501009
	uint16_t year;
Packit Service 501009
	uint8_t month;
Packit Service 501009
	uint8_t day;
Packit Service 501009
	uint8_t hour;
Packit Service 501009
	uint8_t minute;
Packit Service 501009
	uint8_t second;
Packit Service 501009
	uint8_t pad1;
Packit Service 501009
	uint32_t nanosecond;
Packit Service 501009
#define EFI_UNSPECIFIED_TIMEZONE 2047
Packit Service 501009
	int16_t timezone;
Packit Service 501009
	uint8_t daylight;
Packit Service 501009
	uint8_t pad2;
Packit Service 501009
} efi_time_t;
Packit Service 501009
Packit Service 501009
typedef struct {
Packit Service 501009
	uint32_t data1;
Packit Service 501009
	uint16_t data2;
Packit Service 501009
	uint16_t data3;
Packit Service 501009
	uint8_t data4[8];
Packit Service 501009
} efi_guid_t;
Packit Service 501009
Packit Service 501009
#define SADUMP_EFI_GUID_TEXT_REPR_LEN 36
Packit Service 501009
Packit Service 501009
struct sadump_part_header {
Packit Service 501009
#define SADUMP_SIGNATURE1	0x75646173
Packit Service 501009
#define SADUMP_SIGNATURE2	0x0000706d
Packit Service 501009
	uint32_t signature1;	/* sadu */
Packit Service 501009
	uint32_t signature2;	/* mp\0\0 */
Packit Service 501009
	uint32_t enable;	/* set sadump service */
Packit Service 501009
	uint32_t reboot;	/* number of seconds until reboot. 1-3600 */
Packit Service 501009
	uint32_t compress;	/* memory image format. */
Packit Service 501009
	uint32_t recycle;	/* dump device recycle */
Packit Service 501009
	uint32_t label[16];	/* reserve */
Packit Service 501009
	efi_guid_t sadump_id;	/* system UUID */
Packit Service 501009
	efi_guid_t disk_set_id;	/* disk set UUID */
Packit Service 501009
	efi_guid_t vol_id;	/* device UUID */
Packit Service 501009
	efi_time_t time_stamp;	/* time stamp */
Packit Service 501009
	uint32_t set_disk_set;	/* device type */
Packit Service 501009
#define SADUMP_MAX_DISK_SET_NUM 16
Packit Service 501009
	uint32_t reserve;	/* Padding for Alignment */
Packit Service 501009
	uint64_t used_device;	/* used device */
Packit Service 501009
#define DUMP_PART_HEADER_MAGICNUM_SIZE 982
Packit Service 501009
	uint32_t magicnum[DUMP_PART_HEADER_MAGICNUM_SIZE]; /* magic number */
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_volume_info {
Packit Service 501009
	efi_guid_t id;		/* volume id */
Packit Service 501009
	uint64_t vol_size;	/* device size */
Packit Service 501009
	uint32_t status;	/* device status */
Packit Service 501009
	uint32_t cache_size;	/* cache size */
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_disk_set_header {
Packit Service 501009
	uint32_t disk_set_header_size;	/* disk set header size */
Packit Service 501009
	uint32_t disk_num;	/* disk number */
Packit Service 501009
	uint64_t disk_set_size;	/* disk set size */
Packit Service 501009
#define DUMP_DEVICE_MAX 16
Packit Service 501009
	struct sadump_volume_info vol_info[DUMP_DEVICE_MAX - 1];
Packit Service 501009
	/* struct VOL_INFO array */
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_header {
Packit Service 501009
#define SADUMP_SIGNATURE "sadump\0\0"
Packit Service 501009
	char signature[8];	/* = "sadump\0\0" */
Packit Service 501009
	uint32_t header_version;	/* Dump header version */
Packit Service 501009
	uint32_t reserve;	/* Padding for Alignment */
Packit Service 501009
	efi_time_t timestamp;	/* Time stamp */
Packit Service 501009
	uint32_t status;	/* Above flags */
Packit Service 501009
	uint32_t compress;	/* Above flags */
Packit Service 501009
	uint32_t block_size;	/* Size of a block in byte */
Packit Service 501009
#define SADUMP_DEFAULT_BLOCK_SIZE 4096
Packit Service 501009
	uint32_t extra_hdr_size;	/* Size of host dependent
Packit Service 501009
					 * header in blocks (reserve)
Packit Service 501009
					 */
Packit Service 501009
	uint32_t sub_hdr_size;	/* Size of arch dependent header in blocks */
Packit Service 501009
	uint32_t bitmap_blocks;	/* Size of Memory bitmap in block */
Packit Service 501009
	uint32_t dumpable_bitmap_blocks;	/* Size of Memory bitmap in block */
Packit Service 501009
	uint32_t max_mapnr;	/* = max_mapnr */
Packit Service 501009
	uint32_t total_ram_blocks;	/* Size of Memory in block */
Packit Service 501009
	uint32_t device_blocks;	/* Number of total blocks in the dump device */
Packit Service 501009
	uint32_t written_blocks;	/* Number of written blocks */
Packit Service 501009
	uint32_t current_cpu;	/* CPU# which handles dump */
Packit Service 501009
	uint32_t nr_cpus;	/* Number of CPUs */
Packit Service 501009
	/*
Packit Service 501009
	 * The members from below are supported in header version 1
Packit Service 501009
	 * and later.
Packit Service 501009
	 */
Packit Service 501009
	uint64_t max_mapnr_64;
Packit Service 501009
	uint64_t total_ram_blocks_64;
Packit Service 501009
	uint64_t device_blocks_64;
Packit Service 501009
	uint64_t written_blocks_64;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_apic_state {
Packit Service 501009
	uint64_t ApicId;	/* Local Apic ID register */
Packit Service 501009
	uint64_t Ldr;		/* Logical Destination Register */
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_smram_cpu_state {
Packit Service 501009
	uint64_t Reserved1[58];
Packit Service 501009
	uint32_t GdtUpper, LdtUpper, IdtUpper;
Packit Service 501009
	uint32_t Reserved2[3];
Packit Service 501009
	uint64_t IoEip;
Packit Service 501009
	uint64_t Reserved3[10];
Packit Service 501009
	uint32_t Cr4;
Packit Service 501009
	uint32_t Reserved4[18];
Packit Service 501009
	uint32_t GdtLower;
Packit Service 501009
	uint32_t GdtLimit;
Packit Service 501009
	uint32_t IdtLower;
Packit Service 501009
	uint32_t IdtLimit;
Packit Service 501009
	uint32_t LdtLower;
Packit Service 501009
	uint32_t LdtLimit;
Packit Service 501009
	uint32_t LdtInfo;
Packit Service 501009
	uint64_t Reserved5[6];
Packit Service 501009
	uint64_t Eptp;
Packit Service 501009
	uint32_t EptpSetting;
Packit Service 501009
	uint32_t Reserved6[5];
Packit Service 501009
	uint32_t Smbase;
Packit Service 501009
	uint32_t SmmRevisionId;
Packit Service 501009
	uint16_t IoInstructionRestart;
Packit Service 501009
	uint16_t AutoHaltRestart;
Packit Service 501009
	uint32_t Reserved7[6];
Packit Service 501009
	uint32_t R15Lower, R15Upper, R14Lower, R14Upper;
Packit Service 501009
	uint32_t R13Lower, R13Upper, R12Lower, R12Upper;
Packit Service 501009
	uint32_t R11Lower, R11Upper, R10Lower, R10Upper;
Packit Service 501009
	uint32_t R9Lower, R9Upper, R8Lower, R8Upper;
Packit Service 501009
	uint32_t RaxLower, RaxUpper, RcxLower, RcxUpper;
Packit Service 501009
	uint32_t RdxLower, RdxUpper, RbxLower, RbxUpper;
Packit Service 501009
	uint32_t RspLower, RspUpper, RbpLower, RbpUpper;
Packit Service 501009
	uint32_t RsiLower, RsiUpper, RdiLower, RdiUpper;
Packit Service 501009
	uint32_t IoMemAddrLower, IoMemAddrUpper;
Packit Service 501009
	uint32_t IoMisc, Es, Cs, Ss, Ds, Fs, Gs;
Packit Service 501009
	uint32_t Ldtr, Tr;
Packit Service 501009
	uint64_t Dr7, Dr6, Rip, Ia32Efer, Rflags;
Packit Service 501009
	uint64_t Cr3, Cr0;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_page_header {
Packit Service 501009
	uint64_t page_flags;
Packit Service 501009
	uint32_t size;
Packit Service 501009
	uint32_t flags;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_media_header {
Packit Service 501009
	efi_guid_t sadump_id;	// system UUID
Packit Service 501009
	efi_guid_t disk_set_id;	// disk set UUID
Packit Service 501009
	efi_time_t time_stamp;	/* time stamp */
Packit Service 501009
	char sequential_num;	// Medium sequential number
Packit Service 501009
	char term_cord;		// Termination cord
Packit Service 501009
	char disk_set_header_size;	// Size of original disk set header
Packit Service 501009
	char disks_in_use;	// Number of used disks of original dump device
Packit Service 501009
	char reserve[4044];	// reserve feild
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
#define divideup(x, y)	(((x) + ((y) - 1)) / (y))
Packit Service 501009
Packit Service 501009
#define SADUMP_PF_SECTION_NUM 4096
Packit Service 501009
Packit Service 501009
struct sadump_diskset_data {
Packit Service 501009
	char *filename;
Packit Service 501009
	int dfd;
Packit Service 501009
	struct sadump_part_header *header;
Packit Service 501009
	ulong data_offset;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_data {
Packit Service 501009
	char *filename;
Packit Service 501009
	ulong flags;
Packit Service 501009
	int dfd;           /* dumpfile file descriptor */
Packit Service 501009
	int machine_type;  /* machine type identifier */
Packit Service 501009
Packit Service 501009
	struct sadump_part_header *header;
Packit Service 501009
	struct sadump_header *dump_header;
Packit Service 501009
	struct sadump_disk_set_header *diskset_header;
Packit Service 501009
	struct sadump_media_header *media_header;
Packit Service 501009
Packit Service 501009
	char *bitmap;
Packit Service 501009
	char *dumpable_bitmap;
Packit Service 501009
Packit Service 501009
	size_t sub_hdr_offset;
Packit Service 501009
	uint32_t smram_cpu_state_size;
Packit Service 501009
Packit Service 501009
	ulong data_offset;
Packit Service 501009
	int block_size;
Packit Service 501009
	int block_shift;
Packit Service 501009
Packit Service 501009
	char *page_buf;
Packit Service 501009
	uint64_t *block_table;
Packit Service 501009
Packit Service 501009
	int sd_list_len;
Packit Service 501009
	struct sadump_diskset_data **sd_list;
Packit Service 501009
Packit Service 501009
/* Backup Region, First 640K of System RAM. */
Packit Service 501009
#define KEXEC_BACKUP_SRC_END	0x0009ffff
Packit Service 501009
	ulonglong backup_src_start;
Packit Service 501009
	ulong backup_src_size;
Packit Service 501009
	ulonglong backup_offset;
Packit Service 501009
Packit Service 501009
	uint64_t max_mapnr;
Packit Service 501009
	ulong phys_base;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct sadump_data *sadump_get_sadump_data(void);
Packit Service 501009
int sadump_cleanup_sadump_data(void);
Packit Service 501009
ulong sadump_identify_format(int *block_size);
Packit Service 501009
int sadump_get_smram_cpu_state(int apicid,
Packit Service 501009
			       struct sadump_smram_cpu_state *smram);