cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

dump.h (8697B)


      1/*
      2 * QEMU dump
      3 *
      4 * Copyright Fujitsu, Corp. 2011, 2012
      5 *
      6 * Authors:
      7 *     Wen Congyang <wency@cn.fujitsu.com>
      8 *
      9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
     10 * See the COPYING file in the top-level directory.
     11 *
     12 */
     13
     14#ifndef DUMP_H
     15#define DUMP_H
     16
     17#include "qapi/qapi-types-dump.h"
     18
     19#define MAKEDUMPFILE_SIGNATURE      "makedumpfile"
     20#define MAX_SIZE_MDF_HEADER         (4096) /* max size of makedumpfile_header */
     21#define TYPE_FLAT_HEADER            (1)    /* type of flattened format */
     22#define VERSION_FLAT_HEADER         (1)    /* version of flattened format */
     23#define END_FLAG_FLAT_HEADER        (-1)
     24
     25#ifndef ARCH_PFN_OFFSET
     26#define ARCH_PFN_OFFSET             (0)
     27#endif
     28
     29/*
     30 * flag for compressed format
     31 */
     32#define DUMP_DH_COMPRESSED_ZLIB     (0x1)
     33#define DUMP_DH_COMPRESSED_LZO      (0x2)
     34#define DUMP_DH_COMPRESSED_SNAPPY   (0x4)
     35
     36#define KDUMP_SIGNATURE             "KDUMP   "
     37#define SIG_LEN                     (sizeof(KDUMP_SIGNATURE) - 1)
     38#define DUMP_LEVEL                  (1)
     39#define DISKDUMP_HEADER_BLOCKS      (1)
     40
     41#include "sysemu/dump-arch.h"
     42#include "sysemu/memory_mapping.h"
     43
     44typedef struct QEMU_PACKED MakedumpfileHeader {
     45    char signature[16];     /* = "makedumpfile" */
     46    int64_t type;
     47    int64_t version;
     48} MakedumpfileHeader;
     49
     50typedef struct QEMU_PACKED MakedumpfileDataHeader {
     51    int64_t offset;
     52    int64_t buf_size;
     53} MakedumpfileDataHeader;
     54
     55typedef struct QEMU_PACKED NewUtsname {
     56    char sysname[65];
     57    char nodename[65];
     58    char release[65];
     59    char version[65];
     60    char machine[65];
     61    char domainname[65];
     62} NewUtsname;
     63
     64typedef struct QEMU_PACKED DiskDumpHeader32 {
     65    char signature[SIG_LEN];        /* = "KDUMP   " */
     66    uint32_t header_version;        /* Dump header version */
     67    NewUtsname utsname;             /* copy of system_utsname */
     68    char timestamp[10];             /* Time stamp */
     69    uint32_t status;                /* Above flags */
     70    uint32_t block_size;            /* Size of a block in byte */
     71    uint32_t sub_hdr_size;          /* Size of arch dependent header in block */
     72    uint32_t bitmap_blocks;         /* Size of Memory bitmap in block */
     73    uint32_t max_mapnr;             /* = max_mapnr ,
     74                                       obsoleted in header_version 6 */
     75    uint32_t total_ram_blocks;      /* Number of blocks should be written */
     76    uint32_t device_blocks;         /* Number of total blocks in dump device */
     77    uint32_t written_blocks;        /* Number of written blocks */
     78    uint32_t current_cpu;           /* CPU# which handles dump */
     79    uint32_t nr_cpus;               /* Number of CPUs */
     80} DiskDumpHeader32;
     81
     82typedef struct QEMU_PACKED DiskDumpHeader64 {
     83    char signature[SIG_LEN];        /* = "KDUMP   " */
     84    uint32_t header_version;        /* Dump header version */
     85    NewUtsname utsname;             /* copy of system_utsname */
     86    char timestamp[22];             /* Time stamp */
     87    uint32_t status;                /* Above flags */
     88    uint32_t block_size;            /* Size of a block in byte */
     89    uint32_t sub_hdr_size;          /* Size of arch dependent header in block */
     90    uint32_t bitmap_blocks;         /* Size of Memory bitmap in block */
     91    uint32_t max_mapnr;             /* = max_mapnr,
     92                                       obsoleted in header_version 6 */
     93    uint32_t total_ram_blocks;      /* Number of blocks should be written */
     94    uint32_t device_blocks;         /* Number of total blocks in dump device */
     95    uint32_t written_blocks;        /* Number of written blocks */
     96    uint32_t current_cpu;           /* CPU# which handles dump */
     97    uint32_t nr_cpus;               /* Number of CPUs */
     98} DiskDumpHeader64;
     99
    100typedef struct QEMU_PACKED KdumpSubHeader32 {
    101    uint32_t phys_base;
    102    uint32_t dump_level;            /* header_version 1 and later */
    103    uint32_t split;                 /* header_version 2 and later */
    104    uint32_t start_pfn;             /* header_version 2 and later,
    105                                       obsoleted in header_version 6 */
    106    uint32_t end_pfn;               /* header_version 2 and later,
    107                                       obsoleted in header_version 6 */
    108    uint64_t offset_vmcoreinfo;     /* header_version 3 and later */
    109    uint32_t size_vmcoreinfo;       /* header_version 3 and later */
    110    uint64_t offset_note;           /* header_version 4 and later */
    111    uint32_t note_size;             /* header_version 4 and later */
    112    uint64_t offset_eraseinfo;      /* header_version 5 and later */
    113    uint32_t size_eraseinfo;        /* header_version 5 and later */
    114    uint64_t start_pfn_64;          /* header_version 6 and later */
    115    uint64_t end_pfn_64;            /* header_version 6 and later */
    116    uint64_t max_mapnr_64;          /* header_version 6 and later */
    117} KdumpSubHeader32;
    118
    119typedef struct QEMU_PACKED KdumpSubHeader64 {
    120    uint64_t phys_base;
    121    uint32_t dump_level;            /* header_version 1 and later */
    122    uint32_t split;                 /* header_version 2 and later */
    123    uint64_t start_pfn;             /* header_version 2 and later,
    124                                       obsoleted in header_version 6 */
    125    uint64_t end_pfn;               /* header_version 2 and later,
    126                                       obsoleted in header_version 6 */
    127    uint64_t offset_vmcoreinfo;     /* header_version 3 and later */
    128    uint64_t size_vmcoreinfo;       /* header_version 3 and later */
    129    uint64_t offset_note;           /* header_version 4 and later */
    130    uint64_t note_size;             /* header_version 4 and later */
    131    uint64_t offset_eraseinfo;      /* header_version 5 and later */
    132    uint64_t size_eraseinfo;        /* header_version 5 and later */
    133    uint64_t start_pfn_64;          /* header_version 6 and later */
    134    uint64_t end_pfn_64;            /* header_version 6 and later */
    135    uint64_t max_mapnr_64;          /* header_version 6 and later */
    136} KdumpSubHeader64;
    137
    138typedef struct DataCache {
    139    int fd;             /* fd of the file where to write the cached data */
    140    uint8_t *buf;       /* buffer for cached data */
    141    size_t buf_size;    /* size of the buf */
    142    size_t data_size;   /* size of cached data in buf */
    143    off_t offset;       /* offset of the file */
    144} DataCache;
    145
    146typedef struct QEMU_PACKED PageDescriptor {
    147    uint64_t offset;                /* the offset of the page data*/
    148    uint32_t size;                  /* the size of this dump page */
    149    uint32_t flags;                 /* flags */
    150    uint64_t page_flags;            /* page flags */
    151} PageDescriptor;
    152
    153typedef struct DumpState {
    154    GuestPhysBlockList guest_phys_blocks;
    155    ArchDumpInfo dump_info;
    156    MemoryMappingList list;
    157    uint16_t phdr_num;
    158    uint32_t sh_info;
    159    bool have_section;
    160    bool resume;
    161    bool detached;
    162    ssize_t note_size;
    163    hwaddr memory_offset;
    164    int fd;
    165
    166    GuestPhysBlock *next_block;
    167    ram_addr_t start;
    168    bool has_filter;
    169    int64_t begin;
    170    int64_t length;
    171
    172    uint8_t *note_buf;          /* buffer for notes */
    173    size_t note_buf_offset;     /* the writing place in note_buf */
    174    uint32_t nr_cpus;           /* number of guest's cpu */
    175    uint64_t max_mapnr;         /* the biggest guest's phys-mem's number */
    176    size_t len_dump_bitmap;     /* the size of the place used to store
    177                                   dump_bitmap in vmcore */
    178    off_t offset_dump_bitmap;   /* offset of dump_bitmap part in vmcore */
    179    off_t offset_page;          /* offset of page part in vmcore */
    180    size_t num_dumpable;        /* number of page that can be dumped */
    181    uint32_t flag_compress;     /* indicate the compression format */
    182    DumpStatus status;          /* current dump status */
    183
    184    bool has_format;              /* whether format is provided */
    185    DumpGuestMemoryFormat format; /* valid only if has_format == true */
    186    QemuThread dump_thread;       /* thread for detached dump */
    187
    188    int64_t total_size;          /* total memory size (in bytes) to
    189                                  * be dumped. When filter is
    190                                  * enabled, this will only count
    191                                  * those to be written. */
    192    int64_t written_size;        /* written memory size (in bytes),
    193                                  * this could be used to calculate
    194                                  * how much work we have
    195                                  * finished. */
    196    uint8_t *guest_note;         /* ELF note content */
    197    size_t guest_note_size;
    198} DumpState;
    199
    200uint16_t cpu_to_dump16(DumpState *s, uint16_t val);
    201uint32_t cpu_to_dump32(DumpState *s, uint32_t val);
    202uint64_t cpu_to_dump64(DumpState *s, uint64_t val);
    203#endif