Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/public/arch-x86/hvm/save.h
Line
Count
Source (jump to first uncovered line)
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
0
#define HVM_FILE_MAGIC   0x54381286
34
0
#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
0
#define _XEN_X86_FPU_INITIALISED        0
164
0
#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
0
static inline int _hvm_hw_fix_cpu(void *h, uint32_t size) {
279
0
280
0
    union hvm_hw_cpu_union {
281
0
        struct hvm_hw_cpu nat;
282
0
        struct hvm_hw_cpu_compat cmp;
283
0
    } *ucpu = (union hvm_hw_cpu_union *)h;
284
0
285
0
    if ( size == sizeof(struct hvm_hw_cpu_compat) )
286
0
    {
287
0
        /*
288
0
         * If we copy from the end backwards, we should
289
0
         * be able to do the modification in-place.
290
0
         */
291
0
        ucpu->nat.error_code = ucpu->cmp.error_code;
292
0
        ucpu->nat.pending_event = ucpu->cmp.pending_event;
293
0
        ucpu->nat.tsc = ucpu->cmp.tsc;
294
0
        ucpu->nat.msr_tsc_aux = 0;
295
0
    }
296
0
    /* Mimic the old behaviour by unconditionally setting fpu_initialised. */
297
0
    ucpu->nat.flags = XEN_X86_FPU_INITIALISED;
298
0
299
0
    return 0;
300
0
}
Unexecuted instantiation: core_parking.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpupool.c:_hvm_hw_fix_cpu
Unexecuted instantiation: domctl.c:_hvm_hw_fix_cpu
Unexecuted instantiation: domain.c:_hvm_hw_fix_cpu
Unexecuted instantiation: event_2l.c:_hvm_hw_fix_cpu
Unexecuted instantiation: event_channel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: event_fifo.c:_hvm_hw_fix_cpu
Unexecuted instantiation: grant_table.c:_hvm_hw_fix_cpu
Unexecuted instantiation: guestcopy.c:_hvm_hw_fix_cpu
Unexecuted instantiation: irq.c:_hvm_hw_fix_cpu
Unexecuted instantiation: kernel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: keyhandler.c:_hvm_hw_fix_cpu
Unexecuted instantiation: kexec.c:_hvm_hw_fix_cpu
Unexecuted instantiation: kimage.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mem_access.c:_hvm_hw_fix_cpu
Unexecuted instantiation: memory.c:_hvm_hw_fix_cpu
Unexecuted instantiation: monitor.c:_hvm_hw_fix_cpu
Unexecuted instantiation: multicall.c:_hvm_hw_fix_cpu
Unexecuted instantiation: notifier.c:_hvm_hw_fix_cpu
Unexecuted instantiation: page_alloc.c:_hvm_hw_fix_cpu
Unexecuted instantiation: pdx.c:_hvm_hw_fix_cpu
Unexecuted instantiation: preempt.c:_hvm_hw_fix_cpu
Unexecuted instantiation: random.c:_hvm_hw_fix_cpu
Unexecuted instantiation: rangeset.c:_hvm_hw_fix_cpu
Unexecuted instantiation: radix-tree.c:_hvm_hw_fix_cpu
Unexecuted instantiation: rcupdate.c:_hvm_hw_fix_cpu
Unexecuted instantiation: rwlock.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sched_arinc653.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sched_credit.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sched_credit2.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sched_rt.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sched_null.c:_hvm_hw_fix_cpu
Unexecuted instantiation: schedule.c:_hvm_hw_fix_cpu
Unexecuted instantiation: shutdown.c:_hvm_hw_fix_cpu
Unexecuted instantiation: softirq.c:_hvm_hw_fix_cpu
Unexecuted instantiation: smp.c:_hvm_hw_fix_cpu
Unexecuted instantiation: spinlock.c:_hvm_hw_fix_cpu
Unexecuted instantiation: stop_machine.c:_hvm_hw_fix_cpu
Unexecuted instantiation: symbols.c:_hvm_hw_fix_cpu
Unexecuted instantiation: sysctl.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tasklet.c:_hvm_hw_fix_cpu
Unexecuted instantiation: time.c:_hvm_hw_fix_cpu
Unexecuted instantiation: timer.c:_hvm_hw_fix_cpu
Unexecuted instantiation: trace.c:_hvm_hw_fix_cpu
Unexecuted instantiation: virtual_region.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vm_event.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmap.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vsprintf.c:_hvm_hw_fix_cpu
Unexecuted instantiation: wait.c:_hvm_hw_fix_cpu
Unexecuted instantiation: xenoprof.c:_hvm_hw_fix_cpu
Unexecuted instantiation: xmalloc_tlsf.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tmem.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tmem_xen.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tmem_control.c:_hvm_hw_fix_cpu
Unexecuted instantiation: llvm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: libelf-loader.c:_hvm_hw_fix_cpu
Unexecuted instantiation: console.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ns16550.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ehci-dbgp.c:_hvm_hw_fix_cpu
Unexecuted instantiation: serial.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpufreq.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpufreq_ondemand.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpufreq_misc_governors.c:_hvm_hw_fix_cpu
Unexecuted instantiation: utility.c:_hvm_hw_fix_cpu
Unexecuted instantiation: pci.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpci.c:_hvm_hw_fix_cpu
Unexecuted instantiation: header.c:_hvm_hw_fix_cpu
Unexecuted instantiation: msi.c:_hvm_hw_fix_cpu
Unexecuted instantiation: msix.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: io.c:_hvm_hw_fix_cpu
Unexecuted instantiation: dmar.c:_hvm_hw_fix_cpu
Unexecuted instantiation: utils.c:_hvm_hw_fix_cpu
Unexecuted instantiation: qinval.c:_hvm_hw_fix_cpu
Unexecuted instantiation: intremap.c:_hvm_hw_fix_cpu
Unexecuted instantiation: quirks.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vtd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ats.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu_init.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu_map.c:_hvm_hw_fix_cpu
Unexecuted instantiation: pci_amd_iommu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu_intr.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu_cmd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iommu_guest.c:_hvm_hw_fix_cpu
Unexecuted instantiation: numa.c:_hvm_hw_fix_cpu
Unexecuted instantiation: osl.c:_hvm_hw_fix_cpu
Unexecuted instantiation: pmstat.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hwregs.c:_hvm_hw_fix_cpu
Unexecuted instantiation: reboot.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tbutils.c:_hvm_hw_fix_cpu
Unexecuted instantiation: utglobal.c:_hvm_hw_fix_cpu
Unexecuted instantiation: erst.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hest.c:_hvm_hw_fix_cpu
Unexecuted instantiation: apei-base.c:_hvm_hw_fix_cpu
Unexecuted instantiation: apei-io.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vga.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vesa.c:_hvm_hw_fix_cpu
Unexecuted instantiation: xsm_core.c:_hvm_hw_fix_cpu
Unexecuted instantiation: apic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpuid.c:_hvm_hw_fix_cpu
Unexecuted instantiation: compat.c:_hvm_hw_fix_cpu
Unexecuted instantiation: crash.c:_hvm_hw_fix_cpu
Unexecuted instantiation: debug.c:_hvm_hw_fix_cpu
Unexecuted instantiation: delay.c:_hvm_hw_fix_cpu
Unexecuted instantiation: domain_page.c:_hvm_hw_fix_cpu
Unexecuted instantiation: e820.c:_hvm_hw_fix_cpu
Unexecuted instantiation: extable.c:_hvm_hw_fix_cpu
Unexecuted instantiation: flushtlb.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hypercall.c:_hvm_hw_fix_cpu
Unexecuted instantiation: i387.c:_hvm_hw_fix_cpu
Unexecuted instantiation: i8259.c:_hvm_hw_fix_cpu
Unexecuted instantiation: io_apic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: msr.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ioport_emulate.c:_hvm_hw_fix_cpu
Unexecuted instantiation: machine_kexec.c:_hvm_hw_fix_cpu
Unexecuted instantiation: microcode_amd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: microcode_intel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: microcode.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mpparse.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nmi.c:_hvm_hw_fix_cpu
Unexecuted instantiation: percpu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: physdev.c:_hvm_hw_fix_cpu
Unexecuted instantiation: platform_hypercall.c:_hvm_hw_fix_cpu
Unexecuted instantiation: psr.c:_hvm_hw_fix_cpu
Unexecuted instantiation: setup.c:_hvm_hw_fix_cpu
Unexecuted instantiation: smpboot.c:_hvm_hw_fix_cpu
Unexecuted instantiation: srat.c:_hvm_hw_fix_cpu
Unexecuted instantiation: traps.c:_hvm_hw_fix_cpu
Unexecuted instantiation: usercopy.c:_hvm_hw_fix_cpu
Unexecuted instantiation: x86_emulate.c:_hvm_hw_fix_cpu
Unexecuted instantiation: tboot.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hpet.c:_hvm_hw_fix_cpu
Unexecuted instantiation: xstate.c:_hvm_hw_fix_cpu
Unexecuted instantiation: lib.c:_hvm_hw_fix_cpu
Unexecuted instantiation: power.c:_hvm_hw_fix_cpu
Unexecuted instantiation: suspend.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpu_idle.c:_hvm_hw_fix_cpu
Unexecuted instantiation: cpuidle_menu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: powernow.c:_hvm_hw_fix_cpu
Unexecuted instantiation: amd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: centaur.c:_hvm_hw_fix_cpu
Unexecuted instantiation: common.c:_hvm_hw_fix_cpu
Unexecuted instantiation: intel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: intel_cacheinfo.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mwait-idle.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpmu.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpmu_amd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpmu_intel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: amd_nonfatal.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mce_amd.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mcaction.c:_hvm_hw_fix_cpu
Unexecuted instantiation: barrier.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mctelem.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mce.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mce-apei.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mce_intel.c:_hvm_hw_fix_cpu
Unexecuted instantiation: non-fatal.c:_hvm_hw_fix_cpu
Unexecuted instantiation: util.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmce.c:_hvm_hw_fix_cpu
Unexecuted instantiation: generic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: main.c:_hvm_hw_fix_cpu
Unexecuted instantiation: bigsmp.c:_hvm_hw_fix_cpu
Unexecuted instantiation: x2apic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: default.c:_hvm_hw_fix_cpu
Unexecuted instantiation: delivery.c:_hvm_hw_fix_cpu
Unexecuted instantiation: probe.c:_hvm_hw_fix_cpu
Unexecuted instantiation: asid.c:_hvm_hw_fix_cpu
Unexecuted instantiation: dm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: emulate.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hvm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: i8254.c:_hvm_hw_fix_cpu
Unexecuted instantiation: intercept.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ioreq.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mtrr.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nestedhvm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: pmtimer.c:_hvm_hw_fix_cpu
Unexecuted instantiation: rtc.c:_hvm_hw_fix_cpu
Unexecuted instantiation: save.c:_hvm_hw_fix_cpu
Unexecuted instantiation: stdvga.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vioapic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: viridian.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vlapic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmsi.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpic.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vpt.c:_hvm_hw_fix_cpu
Unexecuted instantiation: intr.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nestedsvm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: svm.c:_hvm_hw_fix_cpu
Unexecuted instantiation: svmdebug.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmcb.c:_hvm_hw_fix_cpu
Unexecuted instantiation: realmode.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmcs.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vmx.c:_hvm_hw_fix_cpu
Unexecuted instantiation: vvmx.c:_hvm_hw_fix_cpu
Unexecuted instantiation: paging.c:_hvm_hw_fix_cpu
Unexecuted instantiation: p2m.c:_hvm_hw_fix_cpu
Unexecuted instantiation: p2m-pt.c:_hvm_hw_fix_cpu
Unexecuted instantiation: p2m-ept.c:_hvm_hw_fix_cpu
Unexecuted instantiation: p2m-pod.c:_hvm_hw_fix_cpu
Unexecuted instantiation: altp2m.c:_hvm_hw_fix_cpu
Unexecuted instantiation: guest_walk.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mem_paging.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mem_sharing.c:_hvm_hw_fix_cpu
Unexecuted instantiation: multi.c:_hvm_hw_fix_cpu
Unexecuted instantiation: hap.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nested_hap.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nested_ept.c:_hvm_hw_fix_cpu
Unexecuted instantiation: nmi_int.c:_hvm_hw_fix_cpu
Unexecuted instantiation: op_model_p4.c:_hvm_hw_fix_cpu
Unexecuted instantiation: op_model_ppro.c:_hvm_hw_fix_cpu
Unexecuted instantiation: op_model_athlon.c:_hvm_hw_fix_cpu
Unexecuted instantiation: backtrace.c:_hvm_hw_fix_cpu
Unexecuted instantiation: callback.c:_hvm_hw_fix_cpu
Unexecuted instantiation: descriptor-tables.c:_hvm_hw_fix_cpu
Unexecuted instantiation: emul-gate-op.c:_hvm_hw_fix_cpu
Unexecuted instantiation: emul-inv-op.c:_hvm_hw_fix_cpu
Unexecuted instantiation: emul-priv-op.c:_hvm_hw_fix_cpu
Unexecuted instantiation: iret.c:_hvm_hw_fix_cpu
Unexecuted instantiation: misc-hypercalls.c:_hvm_hw_fix_cpu
Unexecuted instantiation: ro-page-fault.c:_hvm_hw_fix_cpu
Unexecuted instantiation: acpi_mmcfg.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mmconf-fam10h.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mmconfig_64.c:_hvm_hw_fix_cpu
Unexecuted instantiation: mmconfig-shared.c:_hvm_hw_fix_cpu
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
0
#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
1.31k
#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
1
#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_vector;
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
0
#define CPU_MSR_CODE  20
641
642
/* 
643
 * Largest type-code in use
644
 */
645
0
#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
 */