Home | History | Annotate | Line # | Download | only in hvm
      1 /*
      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.
      4  *
      5  * Copyright (c) 2007 XenSource Ltd.
      6  *
      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:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     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.
     24  */
     25 
     26 #ifndef __XEN_PUBLIC_HVM_SAVE_X86_H__
     27 #define __XEN_PUBLIC_HVM_SAVE_X86_H__
     28 
     29 /*
     30  * Save/restore header: general info about the save file.
     31  */
     32 
     33 #define HVM_FILE_MAGIC   0x54381286
     34 #define HVM_FILE_VERSION 0x00000001
     35 
     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 */
     42 };
     43 
     44 DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
     45 
     46 
     47 /*
     48  * Processor
     49  *
     50  * Compat:
     51  *     - Pre-3.4 didn't have msr_tsc_aux
     52  *     - Pre-4.7 didn't have fpu_initialised
     53  */
     54 
     55 struct hvm_hw_cpu {
     56     uint8_t  fpu_regs[512];
     57 
     58     uint64_t rax;
     59     uint64_t rbx;
     60     uint64_t rcx;
     61     uint64_t rdx;
     62     uint64_t rbp;
     63     uint64_t rsi;
     64     uint64_t rdi;
     65     uint64_t rsp;
     66     uint64_t r8;
     67     uint64_t r9;
     68     uint64_t r10;
     69     uint64_t r11;
     70     uint64_t r12;
     71     uint64_t r13;
     72     uint64_t r14;
     73     uint64_t r15;
     74 
     75     uint64_t rip;
     76     uint64_t rflags;
     77 
     78     uint64_t cr0;
     79     uint64_t cr2;
     80     uint64_t cr3;
     81     uint64_t cr4;
     82 
     83     uint64_t dr0;
     84     uint64_t dr1;
     85     uint64_t dr2;
     86     uint64_t dr3;
     87     uint64_t dr6;
     88     uint64_t dr7;
     89 
     90     uint32_t cs_sel;
     91     uint32_t ds_sel;
     92     uint32_t es_sel;
     93     uint32_t fs_sel;
     94     uint32_t gs_sel;
     95     uint32_t ss_sel;
     96     uint32_t tr_sel;
     97     uint32_t ldtr_sel;
     98 
     99     uint32_t cs_limit;
    100     uint32_t ds_limit;
    101     uint32_t es_limit;
    102     uint32_t fs_limit;
    103     uint32_t gs_limit;
    104     uint32_t ss_limit;
    105     uint32_t tr_limit;
    106     uint32_t ldtr_limit;
    107     uint32_t idtr_limit;
    108     uint32_t gdtr_limit;
    109 
    110     uint64_t cs_base;
    111     uint64_t ds_base;
    112     uint64_t es_base;
    113     uint64_t fs_base;
    114     uint64_t gs_base;
    115     uint64_t ss_base;
    116     uint64_t tr_base;
    117     uint64_t ldtr_base;
    118     uint64_t idtr_base;
    119     uint64_t gdtr_base;
    120 
    121     uint32_t cs_arbytes;
    122     uint32_t ds_arbytes;
    123     uint32_t es_arbytes;
    124     uint32_t fs_arbytes;
    125     uint32_t gs_arbytes;
    126     uint32_t ss_arbytes;
    127     uint32_t tr_arbytes;
    128     uint32_t ldtr_arbytes;
    129 
    130     uint64_t sysenter_cs;
    131     uint64_t sysenter_esp;
    132     uint64_t sysenter_eip;
    133 
    134     /* msr for em64t */
    135     uint64_t shadow_gs;
    136 
    137     /* msr content saved/restored. */
    138     uint64_t msr_flags; /* Obsolete, ignored. */
    139     uint64_t msr_lstar;
    140     uint64_t msr_star;
    141     uint64_t msr_cstar;
    142     uint64_t msr_syscall_mask;
    143     uint64_t msr_efer;
    144     uint64_t msr_tsc_aux;
    145 
    146     /* guest's idea of what rdtsc() would return */
    147     uint64_t tsc;
    148 
    149     /* pending event, if any */
    150     union {
    151         uint32_t pending_event;
    152         struct {
    153             uint8_t  pending_vector:8;
    154             uint8_t  pending_type:3;
    155             uint8_t  pending_error_valid:1;
    156             uint32_t pending_reserved:19;
    157             uint8_t  pending_valid:1;
    158         };
    159     };
    160     /* error code for pending event */
    161     uint32_t error_code;
    162 
    163 #define _XEN_X86_FPU_INITIALISED        0
    164 #define XEN_X86_FPU_INITIALISED         (1U<<_XEN_X86_FPU_INITIALISED)
    165     uint32_t flags;
    166     uint32_t pad0;
    167 };
    168 
    169 struct hvm_hw_cpu_compat {
    170     uint8_t  fpu_regs[512];
    171 
    172     uint64_t rax;
    173     uint64_t rbx;
    174     uint64_t rcx;
    175     uint64_t rdx;
    176     uint64_t rbp;
    177     uint64_t rsi;
    178     uint64_t rdi;
    179     uint64_t rsp;
    180     uint64_t r8;
    181     uint64_t r9;
    182     uint64_t r10;
    183     uint64_t r11;
    184     uint64_t r12;
    185     uint64_t r13;
    186     uint64_t r14;
    187     uint64_t r15;
    188 
    189     uint64_t rip;
    190     uint64_t rflags;
    191 
    192     uint64_t cr0;
    193     uint64_t cr2;
    194     uint64_t cr3;
    195     uint64_t cr4;
    196 
    197     uint64_t dr0;
    198     uint64_t dr1;
    199     uint64_t dr2;
    200     uint64_t dr3;
    201     uint64_t dr6;
    202     uint64_t dr7;
    203 
    204     uint32_t cs_sel;
    205     uint32_t ds_sel;
    206     uint32_t es_sel;
    207     uint32_t fs_sel;
    208     uint32_t gs_sel;
    209     uint32_t ss_sel;
    210     uint32_t tr_sel;
    211     uint32_t ldtr_sel;
    212 
    213     uint32_t cs_limit;
    214     uint32_t ds_limit;
    215     uint32_t es_limit;
    216     uint32_t fs_limit;
    217     uint32_t gs_limit;
    218     uint32_t ss_limit;
    219     uint32_t tr_limit;
    220     uint32_t ldtr_limit;
    221     uint32_t idtr_limit;
    222     uint32_t gdtr_limit;
    223 
    224     uint64_t cs_base;
    225     uint64_t ds_base;
    226     uint64_t es_base;
    227     uint64_t fs_base;
    228     uint64_t gs_base;
    229     uint64_t ss_base;
    230     uint64_t tr_base;
    231     uint64_t ldtr_base;
    232     uint64_t idtr_base;
    233     uint64_t gdtr_base;
    234 
    235     uint32_t cs_arbytes;
    236     uint32_t ds_arbytes;
    237     uint32_t es_arbytes;
    238     uint32_t fs_arbytes;
    239     uint32_t gs_arbytes;
    240     uint32_t ss_arbytes;
    241     uint32_t tr_arbytes;
    242     uint32_t ldtr_arbytes;
    243 
    244     uint64_t sysenter_cs;
    245     uint64_t sysenter_esp;
    246     uint64_t sysenter_eip;
    247 
    248     /* msr for em64t */
    249     uint64_t shadow_gs;
    250 
    251     /* msr content saved/restored. */
    252     uint64_t msr_flags; /* Obsolete, ignored. */
    253     uint64_t msr_lstar;
    254     uint64_t msr_star;
    255     uint64_t msr_cstar;
    256     uint64_t msr_syscall_mask;
    257     uint64_t msr_efer;
    258     /*uint64_t msr_tsc_aux; COMPAT */
    259 
    260     /* guest's idea of what rdtsc() would return */
    261     uint64_t tsc;
    262 
    263     /* pending event, if any */
    264     union {
    265         uint32_t pending_event;
    266         struct {
    267             uint8_t  pending_vector:8;
    268             uint8_t  pending_type:3;
    269             uint8_t  pending_error_valid:1;
    270             uint32_t pending_reserved:19;
    271             uint8_t  pending_valid:1;
    272         };
    273     };
    274     /* error code for pending event */
    275     uint32_t error_code;
    276 };
    277 
    278 static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) {
    279 
    280     union hvm_hw_cpu_union {
    281         struct hvm_hw_cpu nat;
    282         struct hvm_hw_cpu_compat cmp;
    283     } *ucpu = (union hvm_hw_cpu_union *)h;
    284 
    285     if ( size == sizeof(struct hvm_hw_cpu_compat) )
    286     {
    287         /*
    288          * If we copy from the end backwards, we should
    289          * be able to do the modification in-place.
    290          */
    291         ucpu->nat.error_code = ucpu->cmp.error_code;
    292         ucpu->nat.pending_event = ucpu->cmp.pending_event;
    293         ucpu->nat.tsc = ucpu->cmp.tsc;
    294         ucpu->nat.msr_tsc_aux = 0;
    295     }
    296     /* Mimic the old behaviour by unconditionally setting fpu_initialised. */
    297     ucpu->nat.flags = XEN_X86_FPU_INITIALISED;
    298 
    299     return 0;
    300 }
    301 
    302 DECLARE_HVM_SAVE_TYPE_COMPAT(CPU, 2, struct hvm_hw_cpu, \
    303                              struct hvm_hw_cpu_compat, _hvm_hw_fix_cpu);
    304 
    305 /*
    306  * PIC
    307  */
    308 
    309 struct hvm_hw_vpic {
    310     /* IR line bitmasks. */
    311     uint8_t irr;
    312     uint8_t imr;
    313     uint8_t isr;
    314 
    315     /* Line IRx maps to IRQ irq_base+x */
    316     uint8_t irq_base;
    317 
    318     /*
    319      * Where are we in ICW2-4 initialisation (0 means no init in progress)?
    320      * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1).
    321      * Bit 2: ICW1.IC4  (1 == ICW4 included in init sequence)
    322      * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence)
    323      */
    324     uint8_t init_state:4;
    325 
    326     /* IR line with highest priority. */
    327     uint8_t priority_add:4;
    328 
    329     /* Reads from A=0 obtain ISR or IRR? */
    330     uint8_t readsel_isr:1;
    331 
    332     /* Reads perform a polling read? */
    333     uint8_t poll:1;
    334 
    335     /* Automatically clear IRQs from the ISR during INTA? */
    336     uint8_t auto_eoi:1;
    337 
    338     /* Automatically rotate IRQ priorities during AEOI? */
    339     uint8_t rotate_on_auto_eoi:1;
    340 
    341     /* Exclude slave inputs when considering in-service IRQs? */
    342     uint8_t special_fully_nested_mode:1;
    343 
    344     /* Special mask mode excludes masked IRs from AEOI and priority checks. */
    345     uint8_t special_mask_mode:1;
    346 
    347     /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
    348     uint8_t is_master:1;
    349 
    350     /* Edge/trigger selection. */
    351     uint8_t elcr;
    352 
    353     /* Virtual INT output. */
    354     uint8_t int_output;
    355 };
    356 
    357 DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic);
    358 
    359 
    360 /*
    361  * IO-APIC
    362  */
    363 
    364 union vioapic_redir_entry
    365 {
    366     uint64_t bits;
    367     struct {
    368         uint8_t vector;
    369         uint8_t delivery_mode:3;
    370         uint8_t dest_mode:1;
    371         uint8_t delivery_status:1;
    372         uint8_t polarity:1;
    373         uint8_t remote_irr:1;
    374         uint8_t trig_mode:1;
    375         uint8_t mask:1;
    376         uint8_t reserve:7;
    377         uint8_t reserved[4];
    378         uint8_t dest_id;
    379     } fields;
    380 };
    381 
    382 #define VIOAPIC_NUM_PINS  48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
    383 
    384 #define XEN_HVM_VIOAPIC(name, cnt)                      \
    385     struct name {                                       \
    386         uint64_t base_address;                          \
    387         uint32_t ioregsel;                              \
    388         uint32_t id;                                    \
    389         union vioapic_redir_entry redirtbl[cnt];        \
    390     }
    391 
    392 XEN_HVM_VIOAPIC(hvm_hw_vioapic, VIOAPIC_NUM_PINS);
    393 
    394 #ifndef __XEN__
    395 #undef XEN_HVM_VIOAPIC
    396 #else
    397 #undef VIOAPIC_NUM_PINS
    398 #endif
    399 
    400 DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic);
    401 
    402 
    403 /*
    404  * LAPIC
    405  */
    406 
    407 struct hvm_hw_lapic {
    408     uint64_t             apic_base_msr;
    409     uint32_t             disabled; /* VLAPIC_xx_DISABLED */
    410     uint32_t             timer_divisor;
    411     uint64_t             tdt_msr;
    412 };
    413 
    414 DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic);
    415 
    416 struct hvm_hw_lapic_regs {
    417     uint8_t data[1024];
    418 };
    419 
    420 DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs);
    421 
    422 
    423 /*
    424  * IRQs
    425  */
    426 
    427 struct hvm_hw_pci_irqs {
    428     /*
    429      * Virtual interrupt wires for a single PCI bus.
    430      * Indexed by: device*4 + INTx#.
    431      */
    432     union {
    433         unsigned long i[16 / sizeof (unsigned long)]; /* DECLARE_BITMAP(i, 32*4); */
    434         uint64_t pad[2];
    435     };
    436 };
    437 
    438 DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs);
    439 
    440 struct hvm_hw_isa_irqs {
    441     /*
    442      * Virtual interrupt wires for ISA devices.
    443      * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing).
    444      */
    445     union {
    446         unsigned long i[1];  /* DECLARE_BITMAP(i, 16); */
    447         uint64_t pad[1];
    448     };
    449 };
    450 
    451 DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs);
    452 
    453 struct hvm_hw_pci_link {
    454     /*
    455      * PCI-ISA interrupt router.
    456      * Each PCI <device:INTx#> is 'wire-ORed' into one of four links using
    457      * the traditional 'barber's pole' mapping ((device + INTx#) & 3).
    458      * The router provides a programmable mapping from each link to a GSI.
    459      */
    460     uint8_t route[4];
    461     uint8_t pad0[4];
    462 };
    463 
    464 DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
    465 
    466 /*
    467  *  PIT
    468  */
    469 
    470 struct hvm_hw_pit {
    471     struct hvm_hw_pit_channel {
    472         uint32_t count; /* can be 65536 */
    473         uint16_t latched_count;
    474         uint8_t count_latched;
    475         uint8_t status_latched;
    476         uint8_t status;
    477         uint8_t read_state;
    478         uint8_t write_state;
    479         uint8_t write_latch;
    480         uint8_t rw_mode;
    481         uint8_t mode;
    482         uint8_t bcd; /* not supported */
    483         uint8_t gate; /* timer start */
    484     } channels[3];  /* 3 x 16 bytes */
    485     uint32_t speaker_data_on;
    486     uint32_t pad0;
    487 };
    488 
    489 DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit);
    490 
    491 
    492 /*
    493  * RTC
    494  */
    495 
    496 #define RTC_CMOS_SIZE 14
    497 struct hvm_hw_rtc {
    498     /* CMOS bytes */
    499     uint8_t cmos_data[RTC_CMOS_SIZE];
    500     /* Index register for 2-part operations */
    501     uint8_t cmos_index;
    502     uint8_t pad0;
    503 };
    504 
    505 DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc);
    506 
    507 
    508 /*
    509  * HPET
    510  */
    511 
    512 #define HPET_TIMER_NUM     3    /* 3 timers supported now */
    513 struct hvm_hw_hpet {
    514     /* Memory-mapped, software visible registers */
    515     uint64_t capability;        /* capabilities */
    516     uint64_t res0;              /* reserved */
    517     uint64_t config;            /* configuration */
    518     uint64_t res1;              /* reserved */
    519     uint64_t isr;               /* interrupt status reg */
    520     uint64_t res2[25];          /* reserved */
    521     uint64_t mc64;              /* main counter */
    522     uint64_t res3;              /* reserved */
    523     struct {                    /* timers */
    524         uint64_t config;        /* configuration/cap */
    525         uint64_t cmp;           /* comparator */
    526         uint64_t fsb;           /* FSB route, not supported now */
    527         uint64_t res4;          /* reserved */
    528     } timers[HPET_TIMER_NUM];
    529     uint64_t res5[4*(24-HPET_TIMER_NUM)];  /* reserved, up to 0x3ff */
    530 
    531     /* Hidden register state */
    532     uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */
    533 };
    534 
    535 DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet);
    536 
    537 
    538 /*
    539  * PM timer
    540  */
    541 
    542 struct hvm_hw_pmtimer {
    543     uint32_t tmr_val;   /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
    544     uint16_t pm1a_sts;  /* PM1a_EVT_BLK.PM1a_STS: status register */
    545     uint16_t pm1a_en;   /* PM1a_EVT_BLK.PM1a_EN: enable register */
    546 };
    547 
    548 DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer);
    549 
    550 /*
    551  * MTRR MSRs
    552  */
    553 
    554 struct hvm_hw_mtrr {
    555 #define MTRR_VCNT 8
    556 #define NUM_FIXED_MSR 11
    557     uint64_t msr_pat_cr;
    558     /* mtrr physbase & physmask msr pair*/
    559     uint64_t msr_mtrr_var[MTRR_VCNT*2];
    560     uint64_t msr_mtrr_fixed[NUM_FIXED_MSR];
    561     uint64_t msr_mtrr_cap;
    562     uint64_t msr_mtrr_def_type;
    563 };
    564 
    565 DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr);
    566 
    567 /*
    568  * The save area of XSAVE/XRSTOR.
    569  */
    570 
    571 struct hvm_hw_cpu_xsave {
    572     uint64_t xfeature_mask;        /* Ignored */
    573     uint64_t xcr0;                 /* Updated by XSETBV */
    574     uint64_t xcr0_accum;           /* Updated by XSETBV */
    575     struct {
    576         struct { char x[512]; } fpu_sse;
    577 
    578         struct hvm_hw_cpu_xsave_hdr {
    579             uint64_t xstate_bv;         /* Updated by XRSTOR */
    580             uint64_t xcomp_bv;          /* Updated by XRSTOR{C,S} */
    581             uint64_t reserved[6];
    582         } xsave_hdr;                    /* The 64-byte header */
    583     } save_area;
    584 };
    585 
    586 #define CPU_XSAVE_CODE  16
    587 
    588 /*
    589  * Viridian hypervisor context.
    590  */
    591 
    592 struct hvm_viridian_domain_context {
    593     uint64_t hypercall_gpa;
    594     uint64_t guest_os_id;
    595     uint64_t time_ref_count;
    596     uint64_t reference_tsc;
    597 };
    598 
    599 DECLARE_HVM_SAVE_TYPE(VIRIDIAN_DOMAIN, 15, struct hvm_viridian_domain_context);
    600 
    601 struct hvm_viridian_vcpu_context {
    602     uint64_t vp_assist_msr;
    603     uint8_t  vp_assist_pending;
    604     uint8_t  _pad[7];
    605 };
    606 
    607 DECLARE_HVM_SAVE_TYPE(VIRIDIAN_VCPU, 17, struct hvm_viridian_vcpu_context);
    608 
    609 struct hvm_vmce_vcpu {
    610     uint64_t caps;
    611     uint64_t mci_ctl2_bank0;
    612     uint64_t mci_ctl2_bank1;
    613     uint64_t mcg_ext_ctl;
    614 };
    615 
    616 DECLARE_HVM_SAVE_TYPE(VMCE_VCPU, 18, struct hvm_vmce_vcpu);
    617 
    618 struct hvm_tsc_adjust {
    619     uint64_t tsc_adjust;
    620 };
    621 
    622 DECLARE_HVM_SAVE_TYPE(TSC_ADJUST, 19, struct hvm_tsc_adjust);
    623 
    624 
    625 struct hvm_msr {
    626     uint32_t count;
    627     struct hvm_one_msr {
    628         uint32_t index;
    629         uint32_t _rsvd;
    630         uint64_t val;
    631 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    632     } msr[];
    633 #elif defined(__GNUC__)
    634     } msr[0];
    635 #else
    636     } msr[1 /* variable size */];
    637 #endif
    638 };
    639 
    640 #define CPU_MSR_CODE  20
    641 
    642 /*
    643  * Largest type-code in use
    644  */
    645 #define HVM_SAVE_CODE_MAX 20
    646 
    647 #endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */
    648 
    649 /*
    650  * Local variables:
    651  * mode: C
    652  * c-file-style: "BSD"
    653  * c-basic-offset: 4
    654  * tab-width: 4
    655  * indent-tabs-mode: nil
    656  * End:
    657  */
    658