Files
s390-tools/libvmdump/vm_dump.h
Michael Holzheu b627b8d8e1 Initial s390-tools-2.0.0 import
This commit is based on the s390-tools-1.39.0 version.

Changes on top of s390-tools-1.39.0:

 - Add MIT license to all source files
 - Add LICENSE file
 - Transform REAMDE to README.md (markdown)
 - Add AUTHORS.md file
 - Add CONTRIBUTING.md file
 - Move changelog from README to CHANGELOG.md file

Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com>
Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
2017-08-21 10:55:40 +02:00

479 lines
11 KiB
C++

/*
* vmdump - z/VM dump conversion library
*
* Register content classes:
* VMDump, VMDumpClassic, VMDump64, VMDump64Big, VMDump32
*
* Copyright IBM Corp. 2004, 2017
*
* s390-tools is free software; you can redistribute it and/or modify
* it under the terms of the MIT license. See LICENSE for details.
*/
/*===========================*
* The format of an vmdump: *
*===========================*
*---------------------------*
* Symptom Record *
* (ADSR COPY) Record 1 *
*---------------------------*
* Dump File Map Record *
* (HCPDFMBK COPY) Record 2 *
*---------------------------*
* Dump File Info Record *
* (HCPDFIR COPY) Records 3-7*
*---------------------------*
* Vector Registers *
* (optional) *
*---------------------------*
* Access Lists (HCPDALBK) *
*---------------------------*
* Address Space A *
* Information and Map *
* Record (HCPASIBK) *
*---------------------------*
* Address Space A *
* Bit Maps *
*---------------------------*
* Address Space A *
* Key Maps *
*---------------------------*
* Address Space A *
* Guest Storage *
*---------------------------*
* Additional Address Spaces *
* ASIBK *
* Bit Maps *
* Key Maps *
* Guest Storage *
* *NOTE* These probably *
* aren't in a Linux guest. *
*---------------------------*
*/
#ifndef VMDUMP_H
#define VMDUMP_H
#include <iconv.h>
#include <string.h>
#include "lib/zt_common.h"
#include "dump.h"
#include "register_content.h"
class VMDump : public Dump
{
public:
VMDump(const char *filename);
virtual ~VMDump(void);
virtual void readMem(char *buf, int size);
virtual int seekMem(uint64_t offset);
virtual struct timeval getDumpTime(void) const;
void printDebug(void);
void printInfo(void);
static DumpType getDumpType(const char *);
inline int testPage(uint64_t bit) const
{
return (bitmap[bit/8] & (1 << (7-(bit % 8))));
}
inline void setPageBit(uint64_t bit) const
{
bitmap[bit/8] |= (1 << (7-(bit % 8)));
}
protected:
/* Types */
struct _adsr {
/* Section 1*/
uint16_t sr;
uint32_t cpu_model;
char cpu_serial[6];
uint32_t time_zone_conversion_factor;
uint64_t tod;
char time_stamp_str[4];
char date_str[6];
char node_name[8];
char product_id[4];
char feature_level[8];
uint8_t record_status_flag1;
uint8_t record_status_flag2;
uint64_t dump_type;
/* Section 2*/
char arch_level[2];
uint16_t sec2_len;
uint16_t sec2_1_len;
uint16_t sec2_1_offset;
uint16_t sec3_len;
uint16_t sec3_offset;
uint16_t sec4_len;
uint16_t sec4_offset;
uint16_t sec5_len;
uint16_t sec5_offset;
uint16_t sec6_len;
uint16_t sec6_offset;
} __packed;
struct _fmbk {
char id[8];
uint32_t rec_nr_fir;
uint32_t rec_nr_vector;
uint32_t rec_nr_access;
uint32_t num_acc_recs;
uint32_t num_addr_spaces;
uint32_t rec_nr_asibk;
} __packed;
struct _fir_basic {
char filler1[15];
uint8_t dump_format;/* 0x1 for big storage dump, 0x2 for cp */
/* hard abend, 0x3 for cp soft abend */
char filler2[171];
uint8_t fir_format; /* 0x2 for big esame, 0x82 for esame, */
/* 0x00 for esa */
} __packed;
struct _albk {
char id[8];
} __packed;
/* Methods */
inline void ebcAsc(char *inout, size_t len) const
{
iconv(ebcdicAsciiConv, &inout, &len, &inout, &len);
}
/* Members */
struct _adsr adsrRecord;
struct _fmbk fmbkRecord;
struct _albk albkRecord;
uint64_t memoryStartRecord;
char *bitmap;
uint64_t pageOffset;
private:
iconv_t ebcdicAsciiConv;
};
class VMDumpClassic : public VMDump
{
public:
VMDumpClassic(const char *filename);
virtual ~VMDumpClassic(void);
void printInfo(void);
inline virtual uint64_t getMemSize(void) const
{
return (uint64_t)asibkRecord.storage_size_2GB;
}
protected:
/* Types */
struct _asibk {
char id[8];
char as_token[8];
char spaceid[33];
char reserved1[3];
uint32_t storage_size_2GB;
uint32_t dcss_bitmap_first_rec;
uint32_t byte_past_highest_defined_byte;
uint64_t format_of_as;
char dump_id[100];
uint32_t nr_of_recs_of_first_bit_map;
} __packed;
/* Members */
struct _asibk asibkRecord;
};
#define MAX_BKEY_PAGES 2
class VMDump64Big : public VMDump
{
public:
VMDump64Big(const char *filename);
virtual ~VMDump64Big(void);
RegisterContent64 getRegisterContent(void);
void printDebug(void);
void printInfo(void);
inline virtual uint64_t getMemSize(void) const
{
return (uint64_t)asibkRecordNew.storage_size_def_store;
}
private:
inline int testBitmapPage(char *page, uint64_t bit) const
{
return (page[bit/8] & (1 << (7-(bit % 8))));
}
inline int testBitmapKeyPage(char *page, uint64_t bit) const
{
return (page[bit] & 0x01);
}
/* types */
struct _asibk_64_new {
char id[8];
char as_token[8];
char spaceid[33];
char reserved1[2];
uint8_t asibk_format;
char filler1[12];
uint64_t storage_size_with_dcss;
uint64_t storage_size_def_store;
char filler2[136];
uint64_t online_storage_table[8]; /* for "def store config" */
uint64_t fence1;
uint64_t requested_range_table[8];
uint64_t fence2;
uint32_t record_number_of_first_bit_map; /* XXX */
} __packed;
struct _fir_64 {
char id[8];
uint64_t reserved1;
uint64_t gprs[16];
uint32_t prefix;
char reserved2[5];
uint64_t tod;
char reserved3[8];
uint64_t cpu_timer;
char reserved4[7];
uint8_t flag;
uint8_t type;
uint8_t complete;
uint8_t fir_format; /* 0x82 for esame - 0x00 for esa */
uint8_t cont_flags;
uint8_t crypto_domain_index_reg;
uint8_t virt_cpu_info;
uint8_t arch_mode_id;
uint64_t psw[2];
uint64_t crs[16];
uint64_t fprs[16];
uint8_t reserved5;
uint64_t clock_cmp;
char reserved6[3];
uint32_t tod_programmable_reg;
uint32_t reserved_for_dvf[20];
uint32_t acrs[16];
uint32_t storage_size_2GB;
uint32_t reserved7;
uint32_t hcpsys_addr;
uint32_t reserved8;
uint64_t storage_size;
uint32_t snap_area_map_blk;
uint32_t reserved9;
char loc_mem[256];
uint16_t online_cpus;
uint16_t cpu_addr;
uint16_t section_size_vector;
uint16_t reserved10;
char asit_primary[8];
char space_id_primary[33];
char reserved12[3];
uint16_t crypto_domain_index_mask;
uint16_t reserved11;
uint32_t fp_cntrl_reg;
uint32_t reserved13;
uint64_t reserved14[16];
} __packed;
struct _fir_other_64 {
uint16_t cpu_addr;
uint16_t vector_sec_size;
uint8_t crypto_index_reg;
uint8_t virt_cpu_info;
uint16_t crypto_index_mask;
uint32_t reserved1[2];
uint64_t fprs[16];
uint64_t gprs[16];
uint64_t psw[2];
uint32_t reserved2[2];
uint32_t prefix;
uint32_t fp_cntrl_reg;
uint32_t reserved3;
uint32_t tod;
uint64_t cpu_timer;
uint64_t clock_cmp;
uint32_t reserved4[2];
uint32_t acrs[16];
uint64_t crs[16];
uint64_t mc_interrupt_code;
uint32_t reserved5;
uint32_t external_damage_code;
uint64_t mc_failing_storage_addr;
} __packed;
/* Members */
struct _asibk_64_new asibkRecordNew;
struct _fir_64 fir64Record;
struct _fir_other_64 *fir64OtherRecords;
};
class VMDump64 : public VMDumpClassic
{
public:
VMDump64(const char *filename);
virtual ~VMDump64(void);
RegisterContent64 getRegisterContent(void);
void printDebug(void);
void printInfo(void);
private:
/* Types */
struct _fir_64 {
char id[8];
uint64_t reserved1;
uint64_t gprs[16];
uint32_t prefix;
char reserved2[5];
uint64_t tod;
char reserved3[8];
uint64_t cpu_timer;
char reserved4[7];
uint8_t flag;
uint8_t type;
uint8_t complete;
uint8_t fir_format; /* 0x82 for esame - 0x00 for esa */
uint8_t cont_flags;
uint8_t crypto_domain_index_reg;
uint8_t virt_cpu_info;
uint8_t arch_mode_id;
uint64_t psw[2];
uint64_t crs[16];
uint64_t fprs[16];
uint8_t reserved5;
uint64_t clock_cmp;
char reserved6[3];
uint32_t tod_programmable_reg;
uint32_t reserved_for_dvf[20];
uint32_t acrs[16];
uint32_t storage_size_2GB;
uint32_t reserved7;
uint32_t hcpsys_addr;
uint32_t reserved8;
uint64_t storage_size;
uint32_t snap_area_map_blk;
uint32_t reserved9;
char loc_mem[256];
uint16_t online_cpus;
uint16_t cpu_addr;
uint16_t section_size_vector;
uint16_t reserved10;
char asit_primary[8];
char space_id_primary[33];
char reserved12[3];
uint16_t crypto_domain_index_mask;
uint16_t reserved11;
uint32_t fp_cntrl_reg;
uint32_t reserved13;
uint64_t reserved14[16];
} __packed;
struct _fir_other_64 {
uint16_t cpu_addr;
uint16_t vector_sec_size;
uint8_t crypto_index_reg;
uint8_t virt_cpu_info;
uint16_t crypto_index_mask;
uint32_t reserved1[2];
uint64_t fprs[16];
uint64_t gprs[16];
uint64_t psw[2];
uint32_t reserved2[2];
uint32_t prefix;
uint32_t fp_cntrl_reg;
uint32_t reserved3;
uint32_t tod;
uint64_t cpu_timer;
uint64_t clock_cmp;
uint32_t reserved4[2];
uint32_t acrs[16];
uint64_t crs[16];
uint64_t mc_interrupt_code;
uint32_t reserved5;
uint32_t external_damage_code;
uint64_t mc_failing_storage_addr;
} __packed;
/* Members */
struct _fir_64 fir64Record;
struct _fir_other_64 *fir64OtherRecords;
};
class VMDump32 : public VMDumpClassic
{
public:
VMDump32(const char *filename);
virtual ~VMDump32(void);
RegisterContent32 getRegisterContent(void);
void printDebug(void);
void printInfo(void);
private:
/* Types */
struct _fir_32 {
uint32_t gprs[16];
uint32_t crs[16];
uint64_t fprs[4];
uint64_t tod;
uint64_t cpu_timer;
uint64_t clock_cmp;
uint8_t flag;
uint8_t type;
uint8_t complete;
uint8_t fir_format;
uint32_t storage_size_2GB;
char loc_mem[256];
uint32_t prefix;
uint16_t online_cpus;
uint8_t cont_flags;
uint8_t crypto_domain_index_reg;
uint8_t virt_cpu_info;
uint8_t arch_mode_id;
uint16_t crypto_domain_index_mask;
uint32_t reserved1;
uint32_t snap_area_map_blk;
uint64_t reserved2;
uint32_t hcpsys_addr;
uint32_t reserved3[20];
uint32_t psw[2];
uint16_t cpu_addr;
uint16_t section_size_vector;
uint32_t acrs[16];
char asit_primary[8];
char space_id_primary[33];
char reserved4[131];
} __packed;
struct _fir_other_32 {
uint16_t cpu_addr;
uint16_t vector_sec_size;
uint32_t prefix;
uint8_t crypto_index_reg;
uint8_t virt_cpu_info;
uint16_t crypto_index_mask;
uint32_t reserved1;
uint64_t cpu_timer;
uint64_t clock_cmp;
uint64_t mc_interrupt_code;
uint64_t reserved2;
uint32_t mc_failing_storage_addr;
uint32_t machine_dependent_region_code;
uint32_t lixed_logout_area[4];
char reserved3[16];
uint32_t acrs[16];
uint64_t fprs[4];
uint32_t gprs[16];
uint32_t crs[16];
} __packed;
/* Members */
struct _fir_32 fir32Record;
struct _fir_other_32 *fir32OtherRecords;
};
#endif /* VMDUMP_H */