qemu/include/qemu/win_dump_defs.h
<<
>>
Prefs
   1/*
   2 * Windows crashdump definitions
   3 *
   4 * Copyright (c) 2018 Virtuozzo International GmbH
   5 *
   6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
   7 * See the COPYING file in the top-level directory.
   8 *
   9 */
  10
  11#ifndef QEMU_WIN_DUMP_DEFS_H
  12#define QEMU_WIN_DUMP_DEFS_H
  13
  14typedef struct WinDumpPhyMemRun32 {
  15    uint32_t BasePage;
  16    uint32_t PageCount;
  17} QEMU_PACKED WinDumpPhyMemRun32;
  18
  19typedef struct WinDumpPhyMemRun64 {
  20    uint64_t BasePage;
  21    uint64_t PageCount;
  22} QEMU_PACKED WinDumpPhyMemRun64;
  23
  24typedef struct WinDumpPhyMemDesc32 {
  25    uint32_t NumberOfRuns;
  26    uint32_t NumberOfPages;
  27    WinDumpPhyMemRun32 Run[86];
  28} QEMU_PACKED WinDumpPhyMemDesc32;
  29
  30typedef struct WinDumpPhyMemDesc64 {
  31    uint32_t NumberOfRuns;
  32    uint32_t unused;
  33    uint64_t NumberOfPages;
  34    WinDumpPhyMemRun64 Run[43];
  35} QEMU_PACKED WinDumpPhyMemDesc64;
  36
  37typedef struct WinDumpExceptionRecord {
  38    uint32_t ExceptionCode;
  39    uint32_t ExceptionFlags;
  40    uint64_t ExceptionRecord;
  41    uint64_t ExceptionAddress;
  42    uint32_t NumberParameters;
  43    uint32_t unused;
  44    uint64_t ExceptionInformation[15];
  45} QEMU_PACKED WinDumpExceptionRecord;
  46
  47typedef struct WinDumpHeader32 {
  48    char Signature[4];
  49    char ValidDump[4];
  50    uint32_t MajorVersion;
  51    uint32_t MinorVersion;
  52    uint32_t DirectoryTableBase;
  53    uint32_t PfnDatabase;
  54    uint32_t PsLoadedModuleList;
  55    uint32_t PsActiveProcessHead;
  56    uint32_t MachineImageType;
  57    uint32_t NumberProcessors;
  58    union {
  59        struct {
  60            uint32_t BugcheckCode;
  61            uint32_t BugcheckParameter1;
  62            uint32_t BugcheckParameter2;
  63            uint32_t BugcheckParameter3;
  64            uint32_t BugcheckParameter4;
  65        };
  66        uint8_t BugcheckData[20];
  67    };
  68    uint8_t VersionUser[32];
  69    uint32_t reserved0;
  70    uint32_t KdDebuggerDataBlock;
  71    union {
  72        WinDumpPhyMemDesc32 PhysicalMemoryBlock;
  73        uint8_t PhysicalMemoryBlockBuffer[700];
  74    };
  75    uint8_t reserved1[3200];
  76    uint32_t RequiredDumpSpace;
  77    uint8_t reserved2[92];
  78} QEMU_PACKED WinDumpHeader32;
  79
  80typedef struct WinDumpHeader64 {
  81    char Signature[4];
  82    char ValidDump[4];
  83    uint32_t MajorVersion;
  84    uint32_t MinorVersion;
  85    uint64_t DirectoryTableBase;
  86    uint64_t PfnDatabase;
  87    uint64_t PsLoadedModuleList;
  88    uint64_t PsActiveProcessHead;
  89    uint32_t MachineImageType;
  90    uint32_t NumberProcessors;
  91    union {
  92        struct {
  93            uint32_t BugcheckCode;
  94            uint32_t unused0;
  95            uint64_t BugcheckParameter1;
  96            uint64_t BugcheckParameter2;
  97            uint64_t BugcheckParameter3;
  98            uint64_t BugcheckParameter4;
  99        };
 100        uint8_t BugcheckData[40];
 101    };
 102    uint8_t VersionUser[32];
 103    uint64_t KdDebuggerDataBlock;
 104    union {
 105        WinDumpPhyMemDesc64 PhysicalMemoryBlock;
 106        uint8_t PhysicalMemoryBlockBuffer[704];
 107    };
 108    union {
 109        uint8_t ContextBuffer[3000];
 110    };
 111    WinDumpExceptionRecord Exception;
 112    uint32_t DumpType;
 113    uint32_t unused1;
 114    uint64_t RequiredDumpSpace;
 115    uint64_t SystemTime;
 116    char Comment[128];
 117    uint64_t SystemUpTime;
 118    uint32_t MiniDumpFields;
 119    uint32_t SecondaryDataState;
 120    uint32_t ProductType;
 121    uint32_t SuiteMask;
 122    uint32_t WriterStatus;
 123    uint8_t unused2;
 124    uint8_t KdSecondaryVersion;
 125    uint8_t reserved[4018];
 126} QEMU_PACKED WinDumpHeader64;
 127
 128typedef union WinDumpHeader {
 129    struct {
 130        char Signature[4];
 131        char ValidDump[4];
 132    };
 133    WinDumpHeader32 x32;
 134    WinDumpHeader64 x64;
 135} WinDumpHeader;
 136
 137#define KDBG_OWNER_TAG_OFFSET64             0x10
 138#define KDBG_MM_PFN_DATABASE_OFFSET64       0xC0
 139#define KDBG_KI_BUGCHECK_DATA_OFFSET64      0x88
 140#define KDBG_KI_PROCESSOR_BLOCK_OFFSET64    0x218
 141#define KDBG_OFFSET_PRCB_CONTEXT_OFFSET64   0x338
 142
 143#define KDBG_OWNER_TAG_OFFSET           KDBG_OWNER_TAG_OFFSET64
 144#define KDBG_MM_PFN_DATABASE_OFFSET     KDBG_MM_PFN_DATABASE_OFFSET64
 145#define KDBG_KI_BUGCHECK_DATA_OFFSET    KDBG_KI_BUGCHECK_DATA_OFFSET64
 146#define KDBG_KI_PROCESSOR_BLOCK_OFFSET  KDBG_KI_PROCESSOR_BLOCK_OFFSET64
 147#define KDBG_OFFSET_PRCB_CONTEXT_OFFSET KDBG_OFFSET_PRCB_CONTEXT_OFFSET64
 148
 149#define VMCOREINFO_ELF_NOTE_HDR_SIZE    24
 150#define VMCOREINFO_WIN_DUMP_NOTE_SIZE64 (sizeof(WinDumpHeader64) + \
 151                                         VMCOREINFO_ELF_NOTE_HDR_SIZE)
 152#define VMCOREINFO_WIN_DUMP_NOTE_SIZE32 (sizeof(WinDumpHeader32) + \
 153                                         VMCOREINFO_ELF_NOTE_HDR_SIZE)
 154
 155#define WIN_CTX_X64 0x00100000L
 156#define WIN_CTX_X86 0x00010000L
 157
 158#define WIN_CTX_CTL 0x00000001L
 159#define WIN_CTX_INT 0x00000002L
 160#define WIN_CTX_SEG 0x00000004L
 161#define WIN_CTX_FP  0x00000008L
 162#define WIN_CTX_DBG 0x00000010L
 163#define WIN_CTX_EXT 0x00000020L
 164
 165#define WIN_CTX64_FULL  (WIN_CTX_X64 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX_FP)
 166#define WIN_CTX64_ALL   (WIN_CTX64_FULL | WIN_CTX_SEG | WIN_CTX_DBG)
 167
 168#define WIN_CTX32_FULL (WIN_CTX_X86 | WIN_CTX_CTL | WIN_CTX_INT | WIN_CTX_SEG)
 169#define WIN_CTX32_ALL (WIN_CTX32_FULL | WIN_CTX_FP | WIN_CTX_DBG | WIN_CTX_EXT)
 170
 171#define LIVE_SYSTEM_DUMP    0x00000161
 172
 173typedef struct WinM128A {
 174    uint64_t low;
 175    int64_t high;
 176} QEMU_ALIGNED(16) WinM128A;
 177
 178typedef struct WinContext32 {
 179    uint32_t ContextFlags;
 180
 181    uint32_t Dr0;
 182    uint32_t Dr1;
 183    uint32_t Dr2;
 184    uint32_t Dr3;
 185    uint32_t Dr6;
 186    uint32_t Dr7;
 187
 188    uint8_t  FloatSave[112];
 189
 190    uint32_t SegGs;
 191    uint32_t SegFs;
 192    uint32_t SegEs;
 193    uint32_t SegDs;
 194
 195    uint32_t Edi;
 196    uint32_t Esi;
 197    uint32_t Ebx;
 198    uint32_t Edx;
 199    uint32_t Ecx;
 200    uint32_t Eax;
 201
 202    uint32_t Ebp;
 203    uint32_t Eip;
 204    uint32_t SegCs;
 205    uint32_t EFlags;
 206    uint32_t Esp;
 207    uint32_t SegSs;
 208
 209    uint8_t ExtendedRegisters[512];
 210} QEMU_ALIGNED(16) WinContext32;
 211
 212typedef struct WinContext64 {
 213    uint64_t PHome[6];
 214
 215    uint32_t ContextFlags;
 216    uint32_t MxCsr;
 217
 218    uint16_t SegCs;
 219    uint16_t SegDs;
 220    uint16_t SegEs;
 221    uint16_t SegFs;
 222    uint16_t SegGs;
 223    uint16_t SegSs;
 224    uint32_t EFlags;
 225
 226    uint64_t Dr0;
 227    uint64_t Dr1;
 228    uint64_t Dr2;
 229    uint64_t Dr3;
 230    uint64_t Dr6;
 231    uint64_t Dr7;
 232
 233    uint64_t Rax;
 234    uint64_t Rcx;
 235    uint64_t Rdx;
 236    uint64_t Rbx;
 237    uint64_t Rsp;
 238    uint64_t Rbp;
 239    uint64_t Rsi;
 240    uint64_t Rdi;
 241    uint64_t R8;
 242    uint64_t R9;
 243    uint64_t R10;
 244    uint64_t R11;
 245    uint64_t R12;
 246    uint64_t R13;
 247    uint64_t R14;
 248    uint64_t R15;
 249
 250    uint64_t Rip;
 251
 252    struct {
 253        uint16_t ControlWord;
 254        uint16_t StatusWord;
 255        uint8_t TagWord;
 256        uint8_t Reserved1;
 257        uint16_t ErrorOpcode;
 258        uint32_t ErrorOffset;
 259        uint16_t ErrorSelector;
 260        uint16_t Reserved2;
 261        uint32_t DataOffset;
 262        uint16_t DataSelector;
 263        uint16_t Reserved3;
 264        uint32_t MxCsr;
 265        uint32_t MxCsr_Mask;
 266        WinM128A FloatRegisters[8];
 267        WinM128A XmmRegisters[16];
 268        uint8_t Reserved4[96];
 269    } FltSave;
 270
 271    WinM128A VectorRegister[26];
 272    uint64_t VectorControl;
 273
 274    uint64_t DebugControl;
 275    uint64_t LastBranchToRip;
 276    uint64_t LastBranchFromRip;
 277    uint64_t LastExceptionToRip;
 278    uint64_t LastExceptionFromRip;
 279} QEMU_ALIGNED(16) WinContext64;
 280
 281typedef union WinContext {
 282    WinContext32 x32;
 283    WinContext64 x64;
 284} WinContext;
 285
 286#endif /* QEMU_WIN_DUMP_DEFS_H */
 287