Blame qemu-load.h

Packit Service 501009
/*
Packit Service 501009
 * Qemu save VM file description
Packit Service 501009
 *
Packit Service 501009
 * Copyright (C) 2009 Red Hat, Inc.
Packit Service 501009
 * Written by Paolo Bonzini.
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
Packit Service 501009
#ifndef QEMU_LOAD_H
Packit Service 501009
#define QEMU_LOAD_H 1
Packit Service 501009
Packit Service 501009
#include <stdint.h>
Packit Service 501009
#include <stdbool.h>
Packit Service 501009
#include <stdio.h>
Packit Service 501009
#include <unistd.h>
Packit Service 501009
Packit Service 501009
enum qemu_save_section {
Packit Service 501009
  QEMU_VM_EOF,
Packit Service 501009
  QEMU_VM_SECTION_START,
Packit Service 501009
  QEMU_VM_SECTION_PART,
Packit Service 501009
  QEMU_VM_SECTION_END,
Packit Service 501009
  QEMU_VM_SECTION_FULL,
Packit Service 501009
  QEMU_VM_SUBSECTION,
Packit Service 501009
  QEMU_VM_CONFIGURATION = 0x07,
Packit Service 501009
  QEMU_VM_SECTION_FOOTER = 0x7e
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
enum qemu_features {
Packit Service 501009
  QEMU_FEATURE_RAM = 1,
Packit Service 501009
  QEMU_FEATURE_CPU = 2,
Packit Service 501009
  QEMU_FEATURE_TIMER = 4,
Packit Service 501009
  QEMU_FEATURE_KVM = 8
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device_list {
Packit Service 501009
	struct qemu_device	*head, *tail;
Packit Service 501009
	uint32_t		features;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device_loader {
Packit Service 501009
	const char	   *name;
Packit Service 501009
	struct qemu_device *(*init_load) (struct qemu_device_list *, uint32_t,
Packit Service 501009
					  uint32_t, uint32_t, bool, FILE *);
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device_vtbl {
Packit Service 501009
	const char	   *name;
Packit Service 501009
	uint32_t	   (*load) (struct qemu_device *, FILE *,
Packit Service 501009
				    enum qemu_save_section);
Packit Service 501009
	void		   (*free) (struct qemu_device *,
Packit Service 501009
				    struct qemu_device_list *);
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device {
Packit Service 501009
	struct qemu_device_vtbl *vtbl;
Packit Service 501009
	struct qemu_device_list *list;
Packit Service 501009
	struct qemu_device	*next;
Packit Service 501009
	struct qemu_device	*prev;
Packit Service 501009
	uint32_t		section_id;
Packit Service 501009
	uint32_t		instance_id;
Packit Service 501009
	uint32_t		version_id;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device_ram {
Packit Service 501009
	struct qemu_device	dev_base;
Packit Service 501009
	uint64_t		last_ram_offset;
Packit Service 501009
	FILE			*fp;
Packit Service 501009
	off_t			*offsets;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
union qemu_uint128_t {
Packit Service 501009
	uint32_t	i[4];
Packit Service 501009
	unsigned	i128 __attribute__ ((vector_size (16)));
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_x86_seg {
Packit Service 501009
	uint64_t	base;
Packit Service 501009
	uint32_t	selector;
Packit Service 501009
	uint32_t	limit;
Packit Service 501009
	uint32_t	flags;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_x86_sysenter {
Packit Service 501009
	uint32_t	cs;
Packit Service 501009
	uint64_t	esp;
Packit Service 501009
	uint64_t	eip;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
union qemu_fpu_reg {
Packit Service 501009
	long double	ld;
Packit Service 501009
	char		bytes[10];
Packit Service 501009
	uint64_t	mmx;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
Packit Service 501009
struct qemu_x86_vmtrr {
Packit Service 501009
	uint64_t		base;
Packit Service 501009
	uint64_t		mask;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_x86_svm {
Packit Service 501009
	uint64_t		hsave;
Packit Service 501009
	uint64_t		vmcb;
Packit Service 501009
	uint64_t		tsc_offset;
Packit Service 501009
	uint8_t			in_vmm : 1;
Packit Service 501009
	uint8_t			guest_if_mask : 1;
Packit Service 501009
	uint8_t			guest_intr_masking : 1;
Packit Service 501009
	uint16_t		cr_read_mask;
Packit Service 501009
	uint16_t		cr_write_mask;
Packit Service 501009
	uint16_t		dr_read_mask;
Packit Service 501009
	uint16_t		dr_write_mask;
Packit Service 501009
	uint32_t		exception_intercept_mask;
Packit Service 501009
	uint64_t		intercept_mask;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_x86_kvm {
Packit Service 501009
	uint64_t		int_bitmap[4];
Packit Service 501009
	uint64_t		tsc;
Packit Service 501009
	uint32_t		mp_state;
Packit Service 501009
	uint32_t		exception_injected;
Packit Service 501009
	uint8_t			soft_interrupt;
Packit Service 501009
	uint8_t			nmi_injected;
Packit Service 501009
	uint8_t			nmi_pending;
Packit Service 501009
	uint8_t			has_error_code;
Packit Service 501009
	uint32_t		sipi_vector;
Packit Service 501009
	uint64_t		system_time_msr;
Packit Service 501009
	uint64_t		wall_clock_msr;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_x86_mce {
Packit Service 501009
	uint64_t		mcg_cap;
Packit Service 501009
	uint64_t		mcg_status;
Packit Service 501009
	uint64_t		mcg_ctl;
Packit Service 501009
	uint64_t		mce_banks[10 * 4];
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device_x86 {
Packit Service 501009
	struct qemu_device	dev_base;
Packit Service 501009
Packit Service 501009
	uint32_t		halted;
Packit Service 501009
	uint32_t		irq;
Packit Service 501009
Packit Service 501009
	uint64_t		regs[16];
Packit Service 501009
	uint64_t		eip;
Packit Service 501009
	uint64_t		eflags;
Packit Service 501009
	uint16_t		fpucw;
Packit Service 501009
	uint16_t		fpusw;
Packit Service 501009
	uint16_t		fpu_free;
Packit Service 501009
	union qemu_fpu_reg	st[8];
Packit Service 501009
	struct qemu_x86_seg	cs;
Packit Service 501009
	struct qemu_x86_seg	ds;
Packit Service 501009
	struct qemu_x86_seg	es;
Packit Service 501009
	struct qemu_x86_seg	ss;
Packit Service 501009
	struct qemu_x86_seg	fs;
Packit Service 501009
	struct qemu_x86_seg	gs;
Packit Service 501009
	struct qemu_x86_seg	ldt;
Packit Service 501009
	struct qemu_x86_seg	tr;
Packit Service 501009
	struct qemu_x86_seg	gdt;
Packit Service 501009
	struct qemu_x86_seg	idt;
Packit Service 501009
	struct qemu_x86_sysenter sysenter;
Packit Service 501009
	uint64_t		cr0;
Packit Service 501009
	uint64_t		cr2;
Packit Service 501009
	uint64_t		cr3;
Packit Service 501009
	uint64_t		cr4;
Packit Service 501009
	uint64_t		dr[8];
Packit Service 501009
	uint8_t			cr8;
Packit Service 501009
	uint8_t			soft_mmu : 1;
Packit Service 501009
	uint8_t			smm : 1;
Packit Service 501009
	uint8_t			a20_masked : 1;
Packit Service 501009
	uint8_t			global_if : 1;
Packit Service 501009
	uint8_t			in_nmi : 1;
Packit Service 501009
	uint32_t		mxcsr;
Packit Service 501009
	union qemu_uint128_t	xmm[16];
Packit Service 501009
	uint64_t		efer;
Packit Service 501009
	uint64_t		star;
Packit Service 501009
	uint64_t		lstar;
Packit Service 501009
	uint64_t		cstar;
Packit Service 501009
	uint64_t		fmask;
Packit Service 501009
	uint64_t		kernel_gs_base;
Packit Service 501009
	uint64_t		pat;
Packit Service 501009
	uint32_t		smbase;
Packit Service 501009
	struct qemu_x86_svm	svm;
Packit Service 501009
	uint64_t		fixed_mtrr[11];
Packit Service 501009
	uint64_t		deftype_mtrr;
Packit Service 501009
	struct qemu_x86_vmtrr	variable_mtrr[8];
Packit Service 501009
	struct qemu_x86_kvm	kvm;
Packit Service 501009
	struct qemu_x86_mce	mce;
Packit Service 501009
	uint64_t		tsc_aux;
Packit Service 501009
	uint64_t		xcr0;
Packit Service 501009
	uint64_t		xstate_bv;
Packit Service 501009
	union qemu_uint128_t	ymmh_regs[16];
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_timer {
Packit Service 501009
	uint64_t		cpu_ticks_offset;
Packit Service 501009
	uint64_t		ticks_per_sec;
Packit Service 501009
	uint64_t		cpu_clock_offset;
Packit Service 501009
};
Packit Service 501009
Packit Service 501009
struct qemu_device *device_alloc (struct qemu_device_list *, size_t,
Packit Service 501009
				  struct qemu_device_vtbl *, uint32_t,
Packit Service 501009
				  uint32_t, uint32_t);
Packit Service 501009
void device_free (struct qemu_device *);
Packit Service 501009
void device_list_free (struct qemu_device_list *);
Packit Service 501009
struct qemu_device *device_find (struct qemu_device_list *, uint32_t);
Packit Service 501009
struct qemu_device *device_find_instance (struct qemu_device_list *,
Packit Service 501009
					  const char *, uint32_t);
Packit Service 501009
Packit Service 501009
struct qemu_device_list *qemu_load (const struct qemu_device_loader *,
Packit Service 501009
				    uint32_t, FILE *);
Packit Service 501009
Packit Service 501009
int ram_read_phys_page (struct qemu_device_ram *, void *, uint64_t);
Packit Service 501009
Packit Service 501009
/* For a 32-bit KVM host.  */
Packit Service 501009
extern const struct qemu_device_loader devices_x86_32[];
Packit Service 501009
Packit Service 501009
/* For a 64-bit KVM host.  */
Packit Service 501009
extern const struct qemu_device_loader devices_x86_64[];
Packit Service 501009
Packit Service 501009
#endif