/root/src/xen/xen/include/asm/hvm/vcpu.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * vcpu.h: HVM per vcpu definitions |
3 | | * |
4 | | * Copyright (c) 2005, International Business Machines Corporation. |
5 | | * |
6 | | * This program is free software; you can redistribute it and/or modify it |
7 | | * under the terms and conditions of the GNU General Public License, |
8 | | * version 2, as published by the Free Software Foundation. |
9 | | * |
10 | | * This program is distributed in the hope it will be useful, but WITHOUT |
11 | | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
12 | | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
13 | | * more details. |
14 | | * |
15 | | * You should have received a copy of the GNU General Public License along with |
16 | | * this program; If not, see <http://www.gnu.org/licenses/>. |
17 | | */ |
18 | | |
19 | | #ifndef __ASM_X86_HVM_VCPU_H__ |
20 | | #define __ASM_X86_HVM_VCPU_H__ |
21 | | |
22 | | #include <xen/tasklet.h> |
23 | | #include <asm/hvm/io.h> |
24 | | #include <asm/hvm/vlapic.h> |
25 | | #include <asm/hvm/viridian.h> |
26 | | #include <asm/hvm/vmx/vmcs.h> |
27 | | #include <asm/hvm/vmx/vvmx.h> |
28 | | #include <asm/hvm/svm/vmcb.h> |
29 | | #include <asm/hvm/svm/nestedsvm.h> |
30 | | #include <asm/mtrr.h> |
31 | | |
32 | | enum hvm_io_completion { |
33 | | HVMIO_no_completion, |
34 | | HVMIO_mmio_completion, |
35 | | HVMIO_pio_completion, |
36 | | HVMIO_realmode_completion |
37 | | }; |
38 | | |
39 | | struct hvm_vcpu_asid { |
40 | | uint64_t generation; |
41 | | uint32_t asid; |
42 | | }; |
43 | | |
44 | | /* |
45 | | * We may read or write up to m256 as a number of device-model |
46 | | * transactions. |
47 | | */ |
48 | | struct hvm_mmio_cache { |
49 | | unsigned long gla; |
50 | | unsigned int size; |
51 | | uint8_t dir; |
52 | | uint8_t pad[3]; /* make buffer[] long-aligned */ |
53 | | uint8_t buffer[32]; |
54 | | }; |
55 | | |
56 | | struct hvm_vcpu_io { |
57 | | /* I/O request in flight to device model. */ |
58 | | enum hvm_io_completion io_completion; |
59 | | ioreq_t io_req; |
60 | | |
61 | | /* |
62 | | * HVM emulation: |
63 | | * Linear address @mmio_gla maps to MMIO physical frame @mmio_gpfn. |
64 | | * The latter is known to be an MMIO frame (not RAM). |
65 | | * This translation is only valid for accesses as per @mmio_access. |
66 | | */ |
67 | | struct npfec mmio_access; |
68 | | unsigned long mmio_gla; |
69 | | unsigned long mmio_gpfn; |
70 | | |
71 | | /* |
72 | | * We may need to handle up to 3 distinct memory accesses per |
73 | | * instruction. |
74 | | */ |
75 | | struct hvm_mmio_cache mmio_cache[3]; |
76 | | unsigned int mmio_cache_count; |
77 | | |
78 | | /* For retries we shouldn't re-fetch the instruction. */ |
79 | | unsigned int mmio_insn_bytes; |
80 | | unsigned char mmio_insn[16]; |
81 | | /* |
82 | | * For string instruction emulation we need to be able to signal a |
83 | | * necessary retry through other than function return codes. |
84 | | */ |
85 | | bool_t mmio_retry; |
86 | | |
87 | | unsigned long msix_unmask_address; |
88 | | unsigned long msix_snoop_address; |
89 | | unsigned long msix_snoop_gpa; |
90 | | |
91 | | const struct g2m_ioport *g2m_ioport; |
92 | | }; |
93 | | |
94 | | static inline bool_t hvm_vcpu_io_need_completion(const struct hvm_vcpu_io *vio) |
95 | 80.2k | { |
96 | 80.2k | return (vio->io_req.state == STATE_IOREQ_READY) && |
97 | 0 | !vio->io_req.data_is_ptr; |
98 | 80.2k | } Unexecuted instantiation: cpu.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpupool.c:hvm_vcpu_io_need_completion Unexecuted instantiation: domctl.c:hvm_vcpu_io_need_completion Unexecuted instantiation: domain.c:hvm_vcpu_io_need_completion Unexecuted instantiation: event_2l.c:hvm_vcpu_io_need_completion Unexecuted instantiation: event_channel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: event_fifo.c:hvm_vcpu_io_need_completion Unexecuted instantiation: grant_table.c:hvm_vcpu_io_need_completion Unexecuted instantiation: guestcopy.c:hvm_vcpu_io_need_completion Unexecuted instantiation: kernel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: keyhandler.c:hvm_vcpu_io_need_completion Unexecuted instantiation: kexec.c:hvm_vcpu_io_need_completion Unexecuted instantiation: kimage.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mem_access.c:hvm_vcpu_io_need_completion Unexecuted instantiation: memory.c:hvm_vcpu_io_need_completion Unexecuted instantiation: monitor.c:hvm_vcpu_io_need_completion Unexecuted instantiation: multicall.c:hvm_vcpu_io_need_completion Unexecuted instantiation: page_alloc.c:hvm_vcpu_io_need_completion Unexecuted instantiation: rangeset.c:hvm_vcpu_io_need_completion Unexecuted instantiation: rcupdate.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sched_arinc653.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sched_credit.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sched_credit2.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sched_rt.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sched_null.c:hvm_vcpu_io_need_completion Unexecuted instantiation: schedule.c:hvm_vcpu_io_need_completion Unexecuted instantiation: shutdown.c:hvm_vcpu_io_need_completion Unexecuted instantiation: softirq.c:hvm_vcpu_io_need_completion Unexecuted instantiation: spinlock.c:hvm_vcpu_io_need_completion Unexecuted instantiation: stop_machine.c:hvm_vcpu_io_need_completion Unexecuted instantiation: symbols.c:hvm_vcpu_io_need_completion Unexecuted instantiation: sysctl.c:hvm_vcpu_io_need_completion Unexecuted instantiation: tasklet.c:hvm_vcpu_io_need_completion Unexecuted instantiation: time.c:hvm_vcpu_io_need_completion Unexecuted instantiation: timer.c:hvm_vcpu_io_need_completion Unexecuted instantiation: trace.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vm_event.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vsprintf.c:hvm_vcpu_io_need_completion Unexecuted instantiation: wait.c:hvm_vcpu_io_need_completion Unexecuted instantiation: xenoprof.c:hvm_vcpu_io_need_completion Unexecuted instantiation: tmem.c:hvm_vcpu_io_need_completion Unexecuted instantiation: tmem_xen.c:hvm_vcpu_io_need_completion Unexecuted instantiation: tmem_control.c:hvm_vcpu_io_need_completion Unexecuted instantiation: llvm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: libelf-loader.c:hvm_vcpu_io_need_completion Unexecuted instantiation: console.c:hvm_vcpu_io_need_completion Unexecuted instantiation: ns16550.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpufreq.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpufreq_ondemand.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpufreq_misc_governors.c:hvm_vcpu_io_need_completion Unexecuted instantiation: utility.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpci.c:hvm_vcpu_io_need_completion Unexecuted instantiation: header.c:hvm_vcpu_io_need_completion Unexecuted instantiation: msi.c:hvm_vcpu_io_need_completion Unexecuted instantiation: msix.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu.c:hvm_vcpu_io_need_completion io.c:hvm_vcpu_io_need_completion Line | Count | Source | 95 | 80.2k | { | 96 | 80.2k | return (vio->io_req.state == STATE_IOREQ_READY) && | 97 | 0 | !vio->io_req.data_is_ptr; | 98 | 80.2k | } |
Unexecuted instantiation: pci.c:hvm_vcpu_io_need_completion Unexecuted instantiation: utils.c:hvm_vcpu_io_need_completion Unexecuted instantiation: qinval.c:hvm_vcpu_io_need_completion Unexecuted instantiation: intremap.c:hvm_vcpu_io_need_completion Unexecuted instantiation: quirks.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vtd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: ats.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu_init.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu_map.c:hvm_vcpu_io_need_completion Unexecuted instantiation: pci_amd_iommu.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu_intr.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu_cmd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iommu_guest.c:hvm_vcpu_io_need_completion Unexecuted instantiation: pmstat.c:hvm_vcpu_io_need_completion Unexecuted instantiation: xsm_core.c:hvm_vcpu_io_need_completion Unexecuted instantiation: apic.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpuid.c:hvm_vcpu_io_need_completion Unexecuted instantiation: compat.c:hvm_vcpu_io_need_completion Unexecuted instantiation: crash.c:hvm_vcpu_io_need_completion Unexecuted instantiation: debug.c:hvm_vcpu_io_need_completion Unexecuted instantiation: domain_page.c:hvm_vcpu_io_need_completion Unexecuted instantiation: flushtlb.c:hvm_vcpu_io_need_completion Unexecuted instantiation: hypercall.c:hvm_vcpu_io_need_completion Unexecuted instantiation: i387.c:hvm_vcpu_io_need_completion Unexecuted instantiation: i8259.c:hvm_vcpu_io_need_completion Unexecuted instantiation: io_apic.c:hvm_vcpu_io_need_completion Unexecuted instantiation: msr.c:hvm_vcpu_io_need_completion Unexecuted instantiation: ioport_emulate.c:hvm_vcpu_io_need_completion Unexecuted instantiation: irq.c:hvm_vcpu_io_need_completion Unexecuted instantiation: machine_kexec.c:hvm_vcpu_io_need_completion Unexecuted instantiation: microcode_amd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: microcode_intel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: microcode.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mpparse.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nmi.c:hvm_vcpu_io_need_completion Unexecuted instantiation: numa.c:hvm_vcpu_io_need_completion Unexecuted instantiation: physdev.c:hvm_vcpu_io_need_completion Unexecuted instantiation: platform_hypercall.c:hvm_vcpu_io_need_completion Unexecuted instantiation: psr.c:hvm_vcpu_io_need_completion Unexecuted instantiation: setup.c:hvm_vcpu_io_need_completion Unexecuted instantiation: smp.c:hvm_vcpu_io_need_completion Unexecuted instantiation: smpboot.c:hvm_vcpu_io_need_completion Unexecuted instantiation: traps.c:hvm_vcpu_io_need_completion Unexecuted instantiation: usercopy.c:hvm_vcpu_io_need_completion Unexecuted instantiation: x86_emulate.c:hvm_vcpu_io_need_completion Unexecuted instantiation: tboot.c:hvm_vcpu_io_need_completion Unexecuted instantiation: xstate.c:hvm_vcpu_io_need_completion Unexecuted instantiation: power.c:hvm_vcpu_io_need_completion Unexecuted instantiation: suspend.c:hvm_vcpu_io_need_completion Unexecuted instantiation: cpu_idle.c:hvm_vcpu_io_need_completion Unexecuted instantiation: amd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: common.c:hvm_vcpu_io_need_completion Unexecuted instantiation: intel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mwait-idle.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpmu.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpmu_amd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpmu_intel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: amd_nonfatal.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mce_amd.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mcaction.c:hvm_vcpu_io_need_completion Unexecuted instantiation: barrier.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mctelem.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mce.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mce-apei.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mce_intel.c:hvm_vcpu_io_need_completion Unexecuted instantiation: non-fatal.c:hvm_vcpu_io_need_completion Unexecuted instantiation: util.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vmce.c:hvm_vcpu_io_need_completion Unexecuted instantiation: delivery.c:hvm_vcpu_io_need_completion Unexecuted instantiation: asid.c:hvm_vcpu_io_need_completion Unexecuted instantiation: dm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: emulate.c:hvm_vcpu_io_need_completion Unexecuted instantiation: hpet.c:hvm_vcpu_io_need_completion Unexecuted instantiation: hvm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: i8254.c:hvm_vcpu_io_need_completion Unexecuted instantiation: intercept.c:hvm_vcpu_io_need_completion Unexecuted instantiation: ioreq.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mtrr.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nestedhvm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: pmtimer.c:hvm_vcpu_io_need_completion Unexecuted instantiation: rtc.c:hvm_vcpu_io_need_completion Unexecuted instantiation: save.c:hvm_vcpu_io_need_completion Unexecuted instantiation: stdvga.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vioapic.c:hvm_vcpu_io_need_completion Unexecuted instantiation: viridian.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vlapic.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vmsi.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpic.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vpt.c:hvm_vcpu_io_need_completion Unexecuted instantiation: intr.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nestedsvm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: svm.c:hvm_vcpu_io_need_completion Unexecuted instantiation: svmdebug.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vmcb.c:hvm_vcpu_io_need_completion Unexecuted instantiation: realmode.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vmcs.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vmx.c:hvm_vcpu_io_need_completion Unexecuted instantiation: vvmx.c:hvm_vcpu_io_need_completion Unexecuted instantiation: paging.c:hvm_vcpu_io_need_completion Unexecuted instantiation: p2m.c:hvm_vcpu_io_need_completion Unexecuted instantiation: p2m-pt.c:hvm_vcpu_io_need_completion Unexecuted instantiation: p2m-ept.c:hvm_vcpu_io_need_completion Unexecuted instantiation: p2m-pod.c:hvm_vcpu_io_need_completion Unexecuted instantiation: altp2m.c:hvm_vcpu_io_need_completion Unexecuted instantiation: guest_walk.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mem_paging.c:hvm_vcpu_io_need_completion Unexecuted instantiation: mem_sharing.c:hvm_vcpu_io_need_completion Unexecuted instantiation: multi.c:hvm_vcpu_io_need_completion Unexecuted instantiation: hap.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nested_hap.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nested_ept.c:hvm_vcpu_io_need_completion Unexecuted instantiation: nmi_int.c:hvm_vcpu_io_need_completion Unexecuted instantiation: op_model_ppro.c:hvm_vcpu_io_need_completion Unexecuted instantiation: op_model_athlon.c:hvm_vcpu_io_need_completion Unexecuted instantiation: backtrace.c:hvm_vcpu_io_need_completion Unexecuted instantiation: callback.c:hvm_vcpu_io_need_completion Unexecuted instantiation: descriptor-tables.c:hvm_vcpu_io_need_completion Unexecuted instantiation: emul-gate-op.c:hvm_vcpu_io_need_completion Unexecuted instantiation: emul-inv-op.c:hvm_vcpu_io_need_completion Unexecuted instantiation: emul-priv-op.c:hvm_vcpu_io_need_completion Unexecuted instantiation: iret.c:hvm_vcpu_io_need_completion Unexecuted instantiation: misc-hypercalls.c:hvm_vcpu_io_need_completion Unexecuted instantiation: ro-page-fault.c:hvm_vcpu_io_need_completion |
99 | | |
100 | | struct nestedvcpu { |
101 | | bool_t nv_guestmode; /* vcpu in guestmode? */ |
102 | | void *nv_vvmcx; /* l1 guest virtual VMCB/VMCS */ |
103 | | void *nv_n1vmcx; /* VMCB/VMCS used to run l1 guest */ |
104 | | void *nv_n2vmcx; /* shadow VMCB/VMCS used to run l2 guest */ |
105 | | |
106 | | uint64_t nv_vvmcxaddr; /* l1 guest physical address of nv_vvmcx */ |
107 | | paddr_t nv_n1vmcx_pa; /* host physical address of nv_n1vmcx */ |
108 | | paddr_t nv_n2vmcx_pa; /* host physical address of nv_n2vmcx */ |
109 | | |
110 | | /* SVM/VMX arch specific */ |
111 | | union { |
112 | | struct nestedsvm nsvm; |
113 | | struct nestedvmx nvmx; |
114 | | } u; |
115 | | |
116 | | bool_t nv_flushp2m; /* True, when p2m table must be flushed */ |
117 | | struct p2m_domain *nv_p2m; /* used p2m table for this vcpu */ |
118 | | bool stale_np2m; /* True when p2m_base in VMCx02 is no longer valid */ |
119 | | uint64_t np2m_generation; |
120 | | |
121 | | struct hvm_vcpu_asid nv_n2asid; |
122 | | |
123 | | bool_t nv_vmentry_pending; |
124 | | bool_t nv_vmexit_pending; |
125 | | bool_t nv_vmswitch_in_progress; /* true during vmentry/vmexit emulation */ |
126 | | |
127 | | /* Does l1 guest intercept io ports 0x80 and/or 0xED ? |
128 | | * Useful to optimize io permission handling. |
129 | | */ |
130 | | bool_t nv_ioport80; |
131 | | bool_t nv_ioportED; |
132 | | |
133 | | /* L2's control-resgister, just as the L2 sees them. */ |
134 | | unsigned long guest_cr[5]; |
135 | | }; |
136 | | |
137 | 76.8M | #define vcpu_nestedhvm(v) ((v)->arch.hvm_vcpu.nvcpu) |
138 | | |
139 | | struct altp2mvcpu { |
140 | | uint16_t p2midx; /* alternate p2m index */ |
141 | | gfn_t veinfo_gfn; /* #VE information page gfn */ |
142 | | }; |
143 | | |
144 | 0 | #define vcpu_altp2m(v) ((v)->arch.hvm_vcpu.avcpu) |
145 | | |
146 | | struct hvm_vcpu { |
147 | | /* Guest control-register and EFER values, just as the guest sees them. */ |
148 | | unsigned long guest_cr[5]; |
149 | | unsigned long guest_efer; |
150 | | |
151 | | /* |
152 | | * Processor-visible control-register values, while guest executes. |
153 | | * CR0, CR4: Used as a cache of VMCS contents by VMX only. |
154 | | * CR1, CR2: Never used (guest_cr[2] is always processor-visible CR2). |
155 | | * CR3: Always used and kept up to date by paging subsystem. |
156 | | */ |
157 | | unsigned long hw_cr[5]; |
158 | | |
159 | | struct vlapic vlapic; |
160 | | s64 cache_tsc_offset; |
161 | | u64 guest_time; |
162 | | |
163 | | /* Lock and list for virtual platform timers. */ |
164 | | spinlock_t tm_lock; |
165 | | struct list_head tm_list; |
166 | | |
167 | | bool flag_dr_dirty; |
168 | | bool debug_state_latch; |
169 | | bool single_step; |
170 | | |
171 | | struct hvm_vcpu_asid n1asid; |
172 | | |
173 | | u32 msr_tsc_aux; |
174 | | u64 msr_tsc_adjust; |
175 | | u64 msr_xss; |
176 | | |
177 | | union { |
178 | | struct arch_vmx_struct vmx; |
179 | | struct arch_svm_struct svm; |
180 | | } u; |
181 | | |
182 | | struct tasklet assert_evtchn_irq_tasklet; |
183 | | |
184 | | struct nestedvcpu nvcpu; |
185 | | |
186 | | struct altp2mvcpu avcpu; |
187 | | |
188 | | struct mtrr_state mtrr; |
189 | | u64 pat_cr; |
190 | | |
191 | | /* In mode delay_for_missed_ticks, VCPUs have differing guest times. */ |
192 | | int64_t stime_offset; |
193 | | |
194 | | u8 evtchn_upcall_vector; |
195 | | |
196 | | /* Which cache mode is this VCPU in (CR0:CD/NW)? */ |
197 | | u8 cache_mode; |
198 | | |
199 | | struct hvm_vcpu_io hvm_io; |
200 | | |
201 | | /* Callback into x86_emulate when emulating FPU/MMX/XMM instructions. */ |
202 | | void (*fpu_exception_callback)(void *, struct cpu_user_regs *); |
203 | | void *fpu_exception_callback_arg; |
204 | | |
205 | | /* Pending hw/sw interrupt (.vector = -1 means nothing pending). */ |
206 | | struct x86_event inject_event; |
207 | | |
208 | | struct viridian_vcpu viridian; |
209 | | }; |
210 | | |
211 | | #endif /* __ASM_X86_HVM_VCPU_H__ */ |
212 | | |
213 | | /* |
214 | | * Local variables: |
215 | | * mode: C |
216 | | * c-file-style: "BSD" |
217 | | * c-basic-offset: 4 |
218 | | * tab-width: 4 |
219 | | * indent-tabs-mode: nil |
220 | | * End: |
221 | | */ |