2
* Structure definitions for HVM state that is held by Xen and must
3
* be saved along with the domain's memory and device-model state.
5
* Copyright (c) 2007 XenSource Ltd.
7
* Permission is hereby granted, free of charge, to any person obtaining a copy
8
* of this software and associated documentation files (the "Software"), to
9
* deal in the Software without restriction, including without limitation the
10
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11
* sell copies of the Software, and to permit persons to whom the Software is
12
* furnished to do so, subject to the following conditions:
14
* The above copyright notice and this permission notice shall be included in
15
* all copies or substantial portions of the Software.
17
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
* DEALINGS IN THE SOFTWARE.
26
#ifndef __XEN_PUBLIC_HVM_SAVE_X86_H__
27
#define __XEN_PUBLIC_HVM_SAVE_X86_H__
30
* Save/restore header: general info about the save file.
33
#define HVM_FILE_MAGIC 0x54381286
34
#define HVM_FILE_VERSION 0x00000001
36
struct hvm_save_header {
37
uint32_t magic; /* Must be HVM_FILE_MAGIC */
38
uint32_t version; /* File format version */
39
uint64_t changeset; /* Version of Xen that saved this file */
40
uint32_t cpuid; /* CPUID[0x01][%eax] on the saving machine */
41
uint32_t gtsc_khz; /* Guest's TSC frequency in kHz */
44
DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
52
uint8_t fpu_regs[512];
124
uint32_t ldtr_arbytes;
126
uint64_t sysenter_cs;
127
uint64_t sysenter_esp;
128
uint64_t sysenter_eip;
133
/* msr content saved/restored. */
138
uint64_t msr_syscall_mask;
140
uint64_t msr_tsc_aux;
142
/* guest's idea of what rdtsc() would return */
145
/* pending event, if any */
147
uint32_t pending_event;
149
uint8_t pending_vector:8;
150
uint8_t pending_type:3;
151
uint8_t pending_error_valid:1;
152
uint32_t pending_reserved:19;
153
uint8_t pending_valid:1;
156
/* error code for pending event */
160
DECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_cpu);
168
/* IR line bitmasks. */
173
/* Line IRx maps to IRQ irq_base+x */
177
* Where are we in ICW2-4 initialisation (0 means no init in progress)?
178
* Bits 0-1 (=x): Next write at A=1 sets ICW(x+1).
179
* Bit 2: ICW1.IC4 (1 == ICW4 included in init sequence)
180
* Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence)
182
uint8_t init_state:4;
184
/* IR line with highest priority. */
185
uint8_t priority_add:4;
187
/* Reads from A=0 obtain ISR or IRR? */
188
uint8_t readsel_isr:1;
190
/* Reads perform a polling read? */
193
/* Automatically clear IRQs from the ISR during INTA? */
196
/* Automatically rotate IRQ priorities during AEOI? */
197
uint8_t rotate_on_auto_eoi:1;
199
/* Exclude slave inputs when considering in-service IRQs? */
200
uint8_t special_fully_nested_mode:1;
202
/* Special mask mode excludes masked IRs from AEOI and priority checks. */
203
uint8_t special_mask_mode:1;
205
/* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
208
/* Edge/trigger selection. */
211
/* Virtual INT output. */
215
DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic);
223
#define VIOAPIC_IS_IOSAPIC 1
224
#define VIOAPIC_NUM_PINS 24
226
#define VIOAPIC_NUM_PINS 48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
229
struct hvm_hw_vioapic {
230
uint64_t base_address;
233
union vioapic_redir_entry
238
uint8_t delivery_mode:3;
240
uint8_t delivery_status:1;
242
uint8_t remote_irr:1;
246
#if !VIOAPIC_IS_IOSAPIC
254
} redirtbl[VIOAPIC_NUM_PINS];
257
DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic);
264
struct hvm_hw_lapic {
265
uint64_t apic_base_msr;
266
uint32_t disabled; /* VLAPIC_xx_DISABLED */
267
uint32_t timer_divisor;
270
DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic);
272
struct hvm_hw_lapic_regs {
276
DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs);
283
struct hvm_hw_pci_irqs {
285
* Virtual interrupt wires for a single PCI bus.
286
* Indexed by: device*4 + INTx#.
289
unsigned long i[16 / sizeof (unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */
294
DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs);
296
struct hvm_hw_isa_irqs {
298
* Virtual interrupt wires for ISA devices.
299
* Indexed by ISA IRQ (assumes no ISA-device IRQ sharing).
302
unsigned long i[1]; /* DECLARE_BITMAP(i, 16); */
307
DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs);
309
struct hvm_hw_pci_link {
311
* PCI-ISA interrupt router.
312
* Each PCI <device:INTx#> is 'wire-ORed' into one of four links using
313
* the traditional 'barber's pole' mapping ((device + INTx#) & 3).
314
* The router provides a programmable mapping from each link to a GSI.
320
DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
327
struct hvm_hw_pit_channel {
328
uint32_t count; /* can be 65536 */
329
uint16_t latched_count;
330
uint8_t count_latched;
331
uint8_t status_latched;
338
uint8_t bcd; /* not supported */
339
uint8_t gate; /* timer start */
340
} channels[3]; /* 3 x 16 bytes */
341
uint32_t speaker_data_on;
345
DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit);
352
#define RTC_CMOS_SIZE 14
355
uint8_t cmos_data[RTC_CMOS_SIZE];
356
/* Index register for 2-part operations */
361
DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc);
368
#define HPET_TIMER_NUM 3 /* 3 timers supported now */
370
/* Memory-mapped, software visible registers */
371
uint64_t capability; /* capabilities */
372
uint64_t res0; /* reserved */
373
uint64_t config; /* configuration */
374
uint64_t res1; /* reserved */
375
uint64_t isr; /* interrupt status reg */
376
uint64_t res2[25]; /* reserved */
377
uint64_t mc64; /* main counter */
378
uint64_t res3; /* reserved */
379
struct { /* timers */
380
uint64_t config; /* configuration/cap */
381
uint64_t cmp; /* comparator */
382
uint64_t fsb; /* FSB route, not supported now */
383
uint64_t res4; /* reserved */
384
} timers[HPET_TIMER_NUM];
385
uint64_t res5[4*(24-HPET_TIMER_NUM)]; /* reserved, up to 0x3ff */
387
/* Hidden register state */
388
uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */
391
DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet);
398
struct hvm_hw_pmtimer {
399
uint32_t tmr_val; /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
400
uint16_t pm1a_sts; /* PM1a_EVT_BLK.PM1a_STS: status register */
401
uint16_t pm1a_en; /* PM1a_EVT_BLK.PM1a_EN: enable register */
404
DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer);
412
#define NUM_FIXED_MSR 11
414
/* mtrr physbase & physmask msr pair*/
415
uint64_t msr_mtrr_var[MTRR_VCNT*2];
416
uint64_t msr_mtrr_fixed[NUM_FIXED_MSR];
417
uint64_t msr_mtrr_cap;
418
uint64_t msr_mtrr_def_type;
421
DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr);
424
* Viridian hypervisor context.
427
struct hvm_viridian_context {
428
uint64_t hypercall_gpa;
429
uint64_t guest_os_id;
432
DECLARE_HVM_SAVE_TYPE(VIRIDIAN, 15, struct hvm_viridian_context);
435
* Largest type-code in use
437
#define HVM_SAVE_CODE_MAX 15
439
#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */