crash/qemu-load.h

230 lines
5.0 KiB
C

/*
* Qemu save VM file description
*
* Copyright (C) 2009 Red Hat, Inc.
* Written by Paolo Bonzini.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef QEMU_LOAD_H
#define QEMU_LOAD_H 1
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
enum qemu_save_section {
QEMU_VM_EOF,
QEMU_VM_SECTION_START,
QEMU_VM_SECTION_PART,
QEMU_VM_SECTION_END,
QEMU_VM_SECTION_FULL,
QEMU_VM_SUBSECTION,
QEMU_VM_CONFIGURATION = 0x07,
QEMU_VM_SECTION_FOOTER = 0x7e
};
enum qemu_features {
QEMU_FEATURE_RAM = 1,
QEMU_FEATURE_CPU = 2,
QEMU_FEATURE_TIMER = 4,
QEMU_FEATURE_KVM = 8
};
struct qemu_device_list {
struct qemu_device *head, *tail;
uint32_t features;
};
struct qemu_device_loader {
const char *name;
struct qemu_device *(*init_load) (struct qemu_device_list *, uint32_t,
uint32_t, uint32_t, bool, FILE *);
};
struct qemu_device_vtbl {
const char *name;
uint32_t (*load) (struct qemu_device *, FILE *,
enum qemu_save_section);
void (*free) (struct qemu_device *,
struct qemu_device_list *);
};
struct qemu_device {
struct qemu_device_vtbl *vtbl;
struct qemu_device_list *list;
struct qemu_device *next;
struct qemu_device *prev;
uint32_t section_id;
uint32_t instance_id;
uint32_t version_id;
};
struct qemu_device_ram {
struct qemu_device dev_base;
uint64_t last_ram_offset;
FILE *fp;
off_t *offsets;
};
union qemu_uint128_t {
uint32_t i[4];
unsigned i128 __attribute__ ((vector_size (16)));
};
struct qemu_x86_seg {
uint64_t base;
uint32_t selector;
uint32_t limit;
uint32_t flags;
};
struct qemu_x86_sysenter {
uint32_t cs;
uint64_t esp;
uint64_t eip;
};
union qemu_fpu_reg {
long double ld;
char bytes[10];
uint64_t mmx;
};
struct qemu_x86_vmtrr {
uint64_t base;
uint64_t mask;
};
struct qemu_x86_svm {
uint64_t hsave;
uint64_t vmcb;
uint64_t tsc_offset;
uint8_t in_vmm : 1;
uint8_t guest_if_mask : 1;
uint8_t guest_intr_masking : 1;
uint16_t cr_read_mask;
uint16_t cr_write_mask;
uint16_t dr_read_mask;
uint16_t dr_write_mask;
uint32_t exception_intercept_mask;
uint64_t intercept_mask;
};
struct qemu_x86_kvm {
uint64_t int_bitmap[4];
uint64_t tsc;
uint32_t mp_state;
uint32_t exception_injected;
uint8_t soft_interrupt;
uint8_t nmi_injected;
uint8_t nmi_pending;
uint8_t has_error_code;
uint32_t sipi_vector;
uint64_t system_time_msr;
uint64_t wall_clock_msr;
};
struct qemu_x86_mce {
uint64_t mcg_cap;
uint64_t mcg_status;
uint64_t mcg_ctl;
uint64_t mce_banks[10 * 4];
};
struct qemu_device_x86 {
struct qemu_device dev_base;
uint32_t halted;
uint32_t irq;
uint64_t regs[16];
uint64_t eip;
uint64_t eflags;
uint16_t fpucw;
uint16_t fpusw;
uint16_t fpu_free;
union qemu_fpu_reg st[8];
struct qemu_x86_seg cs;
struct qemu_x86_seg ds;
struct qemu_x86_seg es;
struct qemu_x86_seg ss;
struct qemu_x86_seg fs;
struct qemu_x86_seg gs;
struct qemu_x86_seg ldt;
struct qemu_x86_seg tr;
struct qemu_x86_seg gdt;
struct qemu_x86_seg idt;
struct qemu_x86_sysenter sysenter;
uint64_t cr0;
uint64_t cr2;
uint64_t cr3;
uint64_t cr4;
uint64_t dr[8];
uint8_t cr8;
uint8_t soft_mmu : 1;
uint8_t smm : 1;
uint8_t a20_masked : 1;
uint8_t global_if : 1;
uint8_t in_nmi : 1;
uint32_t mxcsr;
union qemu_uint128_t xmm[16];
uint64_t efer;
uint64_t star;
uint64_t lstar;
uint64_t cstar;
uint64_t fmask;
uint64_t kernel_gs_base;
uint64_t pat;
uint32_t smbase;
struct qemu_x86_svm svm;
uint64_t fixed_mtrr[11];
uint64_t deftype_mtrr;
struct qemu_x86_vmtrr variable_mtrr[8];
struct qemu_x86_kvm kvm;
struct qemu_x86_mce mce;
uint64_t tsc_aux;
uint64_t xcr0;
uint64_t xstate_bv;
union qemu_uint128_t ymmh_regs[16];
};
struct qemu_timer {
uint64_t cpu_ticks_offset;
uint64_t ticks_per_sec;
uint64_t cpu_clock_offset;
};
struct qemu_device *device_alloc (struct qemu_device_list *, size_t,
struct qemu_device_vtbl *, uint32_t,
uint32_t, uint32_t);
void device_free (struct qemu_device *);
void device_list_free (struct qemu_device_list *);
struct qemu_device *device_find (struct qemu_device_list *, uint32_t);
struct qemu_device *device_find_instance (struct qemu_device_list *,
const char *, uint32_t);
struct qemu_device_list *qemu_load (const struct qemu_device_loader *,
uint32_t, FILE *);
int ram_read_phys_page (struct qemu_device_ram *, void *, uint64_t);
/* For a 32-bit KVM host. */
extern const struct qemu_device_loader devices_x86_32[];
/* For a 64-bit KVM host. */
extern const struct qemu_device_loader devices_x86_64[];
#endif