Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/asm/hvm/svm/nestedsvm.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * nestedsvm.h: Nested Virtualization
3
 * Copyright (c) 2011, Advanced Micro Devices, Inc
4
 *
5
 * This program is free software; you can redistribute it and/or modify it
6
 * under the terms and conditions of the GNU General Public License,
7
 * version 2, as published by the Free Software Foundation.
8
 *
9
 * This program is distributed in the hope it will be useful, but WITHOUT
10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12
 * more details.
13
 *
14
 * You should have received a copy of the GNU General Public License along with
15
 * this program; If not, see <http://www.gnu.org/licenses/>.
16
 *
17
 */
18
#ifndef __ASM_X86_HVM_SVM_NESTEDSVM_H__
19
#define __ASM_X86_HVM_SVM_NESTEDSVM_H__
20
21
#include <asm/hvm/hvm.h>
22
#include <asm/hvm/svm/vmcb.h>
23
24
/* SVM specific intblk types, cannot be an enum because gcc 4.5 complains */
25
/* GIF cleared */
26
0
#define hvm_intblk_svm_gif      hvm_intblk_arch
27
28
struct nestedsvm {
29
    bool_t ns_gif;
30
    uint64_t ns_msr_hsavepa; /* MSR HSAVE_PA value */
31
32
    /* l1 guest physical address of virtual vmcb used by prior VMRUN.
33
     * Needed for VMCB Cleanbit emulation.
34
     */
35
    uint64_t ns_ovvmcb_pa;
36
37
    /* virtual tscratio holding the value l1 guest writes to the
38
     * MSR_AMD64_TSC_RATIO MSR.
39
     */
40
    uint64_t ns_tscratio;
41
42
    /* Cached real intercepts of the l2 guest */
43
    uint32_t ns_cr_intercepts;
44
    uint32_t ns_dr_intercepts;
45
    uint32_t ns_exception_intercepts;
46
    uint32_t ns_general1_intercepts;
47
    uint32_t ns_general2_intercepts;
48
49
    /* Cached real lbr of the l2 guest */
50
    lbrctrl_t ns_lbr_control;
51
52
    /* Cached real MSR permission bitmaps of the l2 guest */
53
    unsigned long *ns_cached_msrpm;
54
    /* Merged MSR permission bitmap */
55
    unsigned long *ns_merged_msrpm;
56
57
    /* guest physical address of virtual io permission map */
58
    paddr_t ns_iomap_pa, ns_oiomap_pa;
59
    /* Shadow io permission map */
60
    unsigned long *ns_iomap;
61
62
    uint64_t ns_cr0; /* Cached guest_cr[0] of l1 guest while l2 guest runs.
63
                      * Needed to handle FPU context switching */
64
65
    /* Cache guest cr3/host cr3 the guest sets up for the l2 guest.
66
     * Used by Shadow-on-Shadow and Nested-on-Nested.
67
     * ns_vmcb_guestcr3: in l2 guest physical address space and points to
68
     *     the l2 guest page table
69
     * ns_vmcb_hostcr3: in l1 guest physical address space and points to
70
     *     the l1 guest nested page table
71
     */
72
    uint64_t ns_vmcb_guestcr3, ns_vmcb_hostcr3;
73
    uint32_t ns_guest_asid;
74
75
    bool_t ns_hap_enabled;
76
77
    /* Only meaningful when vmexit_pending flag is set */
78
    struct {
79
        uint64_t exitcode;  /* native exitcode to inject into l1 guest */
80
        uint64_t exitinfo1; /* additional information to the exitcode */
81
        uint64_t exitinfo2; /* additional information to the exitcode */
82
    } ns_vmexit;
83
    union {
84
        uint32_t bytes;
85
        struct {
86
            uint32_t rflagsif: 1;
87
            uint32_t vintrmask: 1;
88
            uint32_t reserved: 30;
89
        } fields;
90
    } ns_hostflags;
91
};
92
93
0
#define vcpu_nestedsvm(v) (vcpu_nestedhvm(v).u.nsvm)
94
95
/* True when l1 guest enabled SVM in EFER */
96
#define nsvm_efer_svm_enabled(v) \
97
0
    (!!((v)->arch.hvm_vcpu.guest_efer & EFER_SVME))
98
99
int nestedsvm_vmcb_map(struct vcpu *v, uint64_t vmcbaddr);
100
void nestedsvm_vmexit_defer(struct vcpu *v,
101
    uint64_t exitcode, uint64_t exitinfo1, uint64_t exitinfo2);
102
enum nestedhvm_vmexits
103
nestedsvm_vmexit_n2n1(struct vcpu *v, struct cpu_user_regs *regs);
104
enum nestedhvm_vmexits
105
nestedsvm_check_intercepts(struct vcpu *v, struct cpu_user_regs *regs,
106
    uint64_t exitcode);
107
108
/* Interface methods */
109
void nsvm_vcpu_destroy(struct vcpu *v);
110
int nsvm_vcpu_initialise(struct vcpu *v);
111
int nsvm_vcpu_reset(struct vcpu *v);
112
int nsvm_vcpu_vmrun(struct vcpu *v, struct cpu_user_regs *regs);
113
int nsvm_vcpu_vmexit_event(struct vcpu *v, const struct x86_event *event);
114
uint64_t nsvm_vcpu_hostcr3(struct vcpu *v);
115
bool_t nsvm_vmcb_guest_intercepts_event(
116
    struct vcpu *v, unsigned int vector, int errcode);
117
bool_t nsvm_vmcb_hap_enabled(struct vcpu *v);
118
enum hvm_intblk nsvm_intr_blocked(struct vcpu *v);
119
120
/* MSRs */
121
int nsvm_rdmsr(struct vcpu *v, unsigned int msr, uint64_t *msr_content);
122
int nsvm_wrmsr(struct vcpu *v, unsigned int msr, uint64_t msr_content);
123
124
/* Interrupts, vGIF */
125
void svm_vmexit_do_clgi(struct cpu_user_regs *regs, struct vcpu *v);
126
void svm_vmexit_do_stgi(struct cpu_user_regs *regs, struct vcpu *v);
127
bool_t nestedsvm_gif_isset(struct vcpu *v);
128
int nsvm_hap_walk_L1_p2m(struct vcpu *v, paddr_t L2_gpa, paddr_t *L1_gpa,
129
                         unsigned int *page_order, uint8_t *p2m_acc,
130
                         bool_t access_r, bool_t access_w, bool_t access_x);
131
132
0
#define NSVM_INTR_NOTHANDLED     3
133
0
#define NSVM_INTR_NOTINTERCEPTED 2
134
0
#define NSVM_INTR_FORCEVMEXIT    1
135
0
#define NSVM_INTR_MASKED         0
136
int nestedsvm_vcpu_interrupt(struct vcpu *v, const struct hvm_intack intack);
137
138
#endif /* ASM_X86_HVM_SVM_NESTEDSVM_H__ */
139
140
/*
141
 * Local variables:
142
 * mode: C
143
 * c-file-style: "BSD"
144
 * c-basic-offset: 4
145
 * tab-width: 4
146
 * indent-tabs-mode: nil
147
 * End:
148
 */