4 * Structure definitions for HVM state that is held by Xen and must
5 * be saved along with the domain's memory and device-model state.
8 * Copyright (c) 2007 XenSource Ltd.
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to
12 * deal in the Software without restriction, including without limitation the
13 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
14 * sell copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 * DEALINGS IN THE SOFTWARE.
29 #ifndef __XEN_PUBLIC_HVM_SAVE_H__
30 #define __XEN_PUBLIC_HVM_SAVE_H__
33 * Structures in this header *must* have the same layout in 32bit
34 * and 64bit environments: this means that all fields must be explicitly
35 * sized types and aligned to their sizes.
37 * Only the state necessary for saving and restoring (i.e. fields
38 * that are analogous to actual hardware state) should go in this file.
39 * Internal mechanisms should be kept in Xen-private headers.
43 * Each entry is preceded by a descriptor giving its type and length
45 struct hvm_save_descriptor {
46 uint16_t typecode; /* Used to demux the various types below */
47 uint16_t instance; /* Further demux within a type */
48 uint32_t length; /* In bytes, *not* including this descriptor */
53 * Each entry has a datatype associated with it: for example, the CPU state
54 * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU),
55 * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU).
56 * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system
60 #define DECLARE_HVM_SAVE_TYPE(_x, _code, _type) \
61 struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; }
63 #define HVM_SAVE_TYPE(_x) typeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->t)
64 #define HVM_SAVE_LENGTH(_x) (sizeof (HVM_SAVE_TYPE(_x)))
65 #define HVM_SAVE_CODE(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->c))
69 * Save/restore header: general info about the save file.
72 #define HVM_FILE_MAGIC 0x54381286
73 #define HVM_FILE_VERSION 0x00000001
75 struct hvm_save_header {
76 uint32_t magic; /* Must be HVM_FILE_MAGIC */
77 uint32_t version; /* File format version */
78 uint64_t changeset; /* Version of Xen that saved this file */
79 uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */
82 DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
90 uint8_t fpu_regs[512];
162 uint32_t ldtr_arbytes;
164 uint32_t sysenter_cs;
167 uint64_t sysenter_esp;
168 uint64_t sysenter_eip;
173 /* msr content saved/restored. */
178 uint64_t msr_syscall_mask;
181 /* guest's idea of what rdtsc() would return */
185 DECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_cpu);
193 /* IR line bitmasks. */
198 /* Line IRx maps to IRQ irq_base+x */
202 * Where are we in ICW2-4 initialisation (0 means no init in progress)?
203 * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1).
204 * Bit 2: ICW1.IC4 (1 == ICW4 included in init sequence)
205 * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence)
207 uint8_t init_state:4;
209 /* IR line with highest priority. */
210 uint8_t priority_add:4;
212 /* Reads from A=0 obtain ISR or IRR? */
213 uint8_t readsel_isr:1;
215 /* Reads perform a polling read? */
218 /* Automatically clear IRQs from the ISR during INTA? */
221 /* Automatically rotate IRQ priorities during AEOI? */
222 uint8_t rotate_on_auto_eoi:1;
224 /* Exclude slave inputs when considering in-service IRQs? */
225 uint8_t special_fully_nested_mode:1;
227 /* Special mask mode excludes masked IRs from AEOI and priority checks. */
228 uint8_t special_mask_mode:1;
230 /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
233 /* Edge/trigger selection. */
236 /* Virtual INT output. */
240 DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic);
248 #define VIOAPIC_IS_IOSAPIC 1
249 #define VIOAPIC_NUM_PINS 24
251 #define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
254 struct hvm_hw_vioapic {
255 uint64_t base_address;
258 union vioapic_redir_entry
263 uint8_t delivery_mode:3;
265 uint8_t delivery_status:1;
267 uint8_t remote_irr:1;
271 #if !VIOAPIC_IS_IOSAPIC
279 } redirtbl[VIOAPIC_NUM_PINS];
282 DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic);
289 struct hvm_hw_lapic {
290 uint64_t apic_base_msr;
291 uint32_t disabled; /* VLAPIC_xx_DISABLED */
292 uint32_t timer_divisor;
295 DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic);
297 struct hvm_hw_lapic_regs {
298 /* A 4k page of register state */
302 DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs);
309 struct hvm_hw_pci_irqs {
311 * Virtual interrupt wires for a single PCI bus.
312 * Indexed by: device*4 + INTx#.
315 DECLARE_BITMAP(i, 32*4);
320 DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs);
322 struct hvm_hw_isa_irqs {
324 * Virtual interrupt wires for ISA devices.
325 * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing).
328 DECLARE_BITMAP(i, 16);
333 DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs);
335 struct hvm_hw_pci_link {
337 * PCI-ISA interrupt router.
338 * Each PCI <device:INTx#> is 'wire-ORed' into one of four links using
339 * the traditional 'barber's pole' mapping ((device + INTx#) & 3).
340 * The router provides a programmable mapping from each link to a GSI.
345 DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
352 struct hvm_hw_pit_channel {
353 uint32_t count; /* can be 65536 */
354 uint16_t latched_count;
355 uint8_t count_latched;
356 uint8_t status_latched;
363 uint8_t bcd; /* not supported */
364 uint8_t gate; /* timer start */
365 } channels[3]; /* 3 x 16 bytes */
366 uint32_t speaker_data_on;
369 DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit);
376 #define RTC_CMOS_SIZE 14
379 uint8_t cmos_data[RTC_CMOS_SIZE];
380 /* Index register for 2-part operations */
384 DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc);
391 #define HPET_TIMER_NUM 3 /* 3 timers supported now */
393 /* Memory-mapped, software visible registers */
394 uint64_t capability; /* capabilities */
395 uint64_t res0; /* reserved */
396 uint64_t config; /* configuration */
397 uint64_t res1; /* reserved */
398 uint64_t isr; /* interrupt status reg */
399 uint64_t res2[25]; /* reserved */
400 uint64_t mc64; /* main counter */
401 uint64_t res3; /* reserved */
402 struct { /* timers */
403 uint64_t config; /* configuration/cap */
404 uint64_t cmp; /* comparator */
405 uint64_t fsb; /* FSB route, not supported now */
406 uint64_t res4; /* reserved */
407 } timers[HPET_TIMER_NUM];
408 uint64_t res5[4*(24-HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */
410 /* Hidden register state */
411 uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */
414 DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet);
421 struct hvm_hw_pmtimer {
422 uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
423 uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */
424 uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */
427 DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer);
430 * Largest type-code in use
432 #define HVM_SAVE_CODE_MAX 13
436 * The series of save records is teminated by a zero-type, zero-length
440 struct hvm_save_end {};
441 DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end);
443 #endif /* __XEN_PUBLIC_HVM_SAVE_H__ */