Coverage Report

Created: 2017-10-25 09:10

/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
 */