Statistics
| Branch: | Revision:

root / target-i386 / kvm.c @ 0fd53fec

History | View | Annotate | Download (71.3 kB)

1 05330448 aliguori
/*
2 05330448 aliguori
 * QEMU KVM support
3 05330448 aliguori
 *
4 05330448 aliguori
 * Copyright (C) 2006-2008 Qumranet Technologies
5 05330448 aliguori
 * Copyright IBM, Corp. 2008
6 05330448 aliguori
 *
7 05330448 aliguori
 * Authors:
8 05330448 aliguori
 *  Anthony Liguori   <aliguori@us.ibm.com>
9 05330448 aliguori
 *
10 05330448 aliguori
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
11 05330448 aliguori
 * See the COPYING file in the top-level directory.
12 05330448 aliguori
 *
13 05330448 aliguori
 */
14 05330448 aliguori
15 05330448 aliguori
#include <sys/types.h>
16 05330448 aliguori
#include <sys/ioctl.h>
17 05330448 aliguori
#include <sys/mman.h>
18 25d2e361 Marcelo Tosatti
#include <sys/utsname.h>
19 05330448 aliguori
20 05330448 aliguori
#include <linux/kvm.h>
21 5802e066 Jan Kiszka
#include <linux/kvm_para.h>
22 05330448 aliguori
23 05330448 aliguori
#include "qemu-common.h"
24 9c17d615 Paolo Bonzini
#include "sysemu/sysemu.h"
25 9c17d615 Paolo Bonzini
#include "sysemu/kvm.h"
26 1d31f66b Peter Maydell
#include "kvm_i386.h"
27 05330448 aliguori
#include "cpu.h"
28 022c62cb Paolo Bonzini
#include "exec/gdbstub.h"
29 1de7afc9 Paolo Bonzini
#include "qemu/host-utils.h"
30 1de7afc9 Paolo Bonzini
#include "qemu/config-file.h"
31 0d09e41a Paolo Bonzini
#include "hw/i386/pc.h"
32 0d09e41a Paolo Bonzini
#include "hw/i386/apic.h"
33 022c62cb Paolo Bonzini
#include "exec/ioport.h"
34 92067bf4 Igor Mammedov
#include <asm/hyperv.h>
35 a2cb15b0 Michael S. Tsirkin
#include "hw/pci/pci.h"
36 05330448 aliguori
37 05330448 aliguori
//#define DEBUG_KVM
38 05330448 aliguori
39 05330448 aliguori
#ifdef DEBUG_KVM
40 8c0d577e Blue Swirl
#define DPRINTF(fmt, ...) \
41 05330448 aliguori
    do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
42 05330448 aliguori
#else
43 8c0d577e Blue Swirl
#define DPRINTF(fmt, ...) \
44 05330448 aliguori
    do { } while (0)
45 05330448 aliguori
#endif
46 05330448 aliguori
47 1a03675d Glauber Costa
#define MSR_KVM_WALL_CLOCK  0x11
48 1a03675d Glauber Costa
#define MSR_KVM_SYSTEM_TIME 0x12
49 1a03675d Glauber Costa
50 c0532a76 Marcelo Tosatti
#ifndef BUS_MCEERR_AR
51 c0532a76 Marcelo Tosatti
#define BUS_MCEERR_AR 4
52 c0532a76 Marcelo Tosatti
#endif
53 c0532a76 Marcelo Tosatti
#ifndef BUS_MCEERR_AO
54 c0532a76 Marcelo Tosatti
#define BUS_MCEERR_AO 5
55 c0532a76 Marcelo Tosatti
#endif
56 c0532a76 Marcelo Tosatti
57 94a8d39a Jan Kiszka
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
58 94a8d39a Jan Kiszka
    KVM_CAP_INFO(SET_TSS_ADDR),
59 94a8d39a Jan Kiszka
    KVM_CAP_INFO(EXT_CPUID),
60 94a8d39a Jan Kiszka
    KVM_CAP_INFO(MP_STATE),
61 94a8d39a Jan Kiszka
    KVM_CAP_LAST_INFO
62 94a8d39a Jan Kiszka
};
63 25d2e361 Marcelo Tosatti
64 c3a3a7d3 Jan Kiszka
static bool has_msr_star;
65 c3a3a7d3 Jan Kiszka
static bool has_msr_hsave_pa;
66 f28558d3 Will Auld
static bool has_msr_tsc_adjust;
67 aa82ba54 Liu, Jinsong
static bool has_msr_tsc_deadline;
68 df67696e Liu Jinsong
static bool has_msr_feature_control;
69 c5999bfc Jan Kiszka
static bool has_msr_async_pf_en;
70 bc9a839d Michael S. Tsirkin
static bool has_msr_pv_eoi_en;
71 21e87c46 Avi Kivity
static bool has_msr_misc_enable;
72 917367aa Marcelo Tosatti
static bool has_msr_kvm_steal_time;
73 25d2e361 Marcelo Tosatti
static int lm_capable_kernel;
74 b827df58 Avi Kivity
75 0d894367 Paolo Bonzini
static bool has_msr_architectural_pmu;
76 0d894367 Paolo Bonzini
static uint32_t num_architectural_pmu_counters;
77 0d894367 Paolo Bonzini
78 1d31f66b Peter Maydell
bool kvm_allows_irq0_override(void)
79 1d31f66b Peter Maydell
{
80 1d31f66b Peter Maydell
    return !kvm_irqchip_in_kernel() || kvm_has_gsi_routing();
81 1d31f66b Peter Maydell
}
82 1d31f66b Peter Maydell
83 b827df58 Avi Kivity
static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
84 b827df58 Avi Kivity
{
85 b827df58 Avi Kivity
    struct kvm_cpuid2 *cpuid;
86 b827df58 Avi Kivity
    int r, size;
87 b827df58 Avi Kivity
88 b827df58 Avi Kivity
    size = sizeof(*cpuid) + max * sizeof(*cpuid->entries);
89 7267c094 Anthony Liguori
    cpuid = (struct kvm_cpuid2 *)g_malloc0(size);
90 b827df58 Avi Kivity
    cpuid->nent = max;
91 b827df58 Avi Kivity
    r = kvm_ioctl(s, KVM_GET_SUPPORTED_CPUID, cpuid);
92 76ae317f Mark McLoughlin
    if (r == 0 && cpuid->nent >= max) {
93 76ae317f Mark McLoughlin
        r = -E2BIG;
94 76ae317f Mark McLoughlin
    }
95 b827df58 Avi Kivity
    if (r < 0) {
96 b827df58 Avi Kivity
        if (r == -E2BIG) {
97 7267c094 Anthony Liguori
            g_free(cpuid);
98 b827df58 Avi Kivity
            return NULL;
99 b827df58 Avi Kivity
        } else {
100 b827df58 Avi Kivity
            fprintf(stderr, "KVM_GET_SUPPORTED_CPUID failed: %s\n",
101 b827df58 Avi Kivity
                    strerror(-r));
102 b827df58 Avi Kivity
            exit(1);
103 b827df58 Avi Kivity
        }
104 b827df58 Avi Kivity
    }
105 b827df58 Avi Kivity
    return cpuid;
106 b827df58 Avi Kivity
}
107 b827df58 Avi Kivity
108 dd87f8a6 Eduardo Habkost
/* Run KVM_GET_SUPPORTED_CPUID ioctl(), allocating a buffer large enough
109 dd87f8a6 Eduardo Habkost
 * for all entries.
110 dd87f8a6 Eduardo Habkost
 */
111 dd87f8a6 Eduardo Habkost
static struct kvm_cpuid2 *get_supported_cpuid(KVMState *s)
112 dd87f8a6 Eduardo Habkost
{
113 dd87f8a6 Eduardo Habkost
    struct kvm_cpuid2 *cpuid;
114 dd87f8a6 Eduardo Habkost
    int max = 1;
115 dd87f8a6 Eduardo Habkost
    while ((cpuid = try_get_cpuid(s, max)) == NULL) {
116 dd87f8a6 Eduardo Habkost
        max *= 2;
117 dd87f8a6 Eduardo Habkost
    }
118 dd87f8a6 Eduardo Habkost
    return cpuid;
119 dd87f8a6 Eduardo Habkost
}
120 dd87f8a6 Eduardo Habkost
121 0c31b744 Glauber Costa
struct kvm_para_features {
122 0c31b744 Glauber Costa
    int cap;
123 0c31b744 Glauber Costa
    int feature;
124 0c31b744 Glauber Costa
} para_features[] = {
125 0c31b744 Glauber Costa
    { KVM_CAP_CLOCKSOURCE, KVM_FEATURE_CLOCKSOURCE },
126 0c31b744 Glauber Costa
    { KVM_CAP_NOP_IO_DELAY, KVM_FEATURE_NOP_IO_DELAY },
127 0c31b744 Glauber Costa
    { KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP },
128 0c31b744 Glauber Costa
    { KVM_CAP_ASYNC_PF, KVM_FEATURE_ASYNC_PF },
129 0c31b744 Glauber Costa
    { -1, -1 }
130 0c31b744 Glauber Costa
};
131 0c31b744 Glauber Costa
132 ba9bc59e Jan Kiszka
static int get_para_features(KVMState *s)
133 0c31b744 Glauber Costa
{
134 0c31b744 Glauber Costa
    int i, features = 0;
135 0c31b744 Glauber Costa
136 0c31b744 Glauber Costa
    for (i = 0; i < ARRAY_SIZE(para_features) - 1; i++) {
137 ba9bc59e Jan Kiszka
        if (kvm_check_extension(s, para_features[i].cap)) {
138 0c31b744 Glauber Costa
            features |= (1 << para_features[i].feature);
139 0c31b744 Glauber Costa
        }
140 0c31b744 Glauber Costa
    }
141 0c31b744 Glauber Costa
142 0c31b744 Glauber Costa
    return features;
143 0c31b744 Glauber Costa
}
144 0c31b744 Glauber Costa
145 0c31b744 Glauber Costa
146 829ae2f9 Eduardo Habkost
/* Returns the value for a specific register on the cpuid entry
147 829ae2f9 Eduardo Habkost
 */
148 829ae2f9 Eduardo Habkost
static uint32_t cpuid_entry_get_reg(struct kvm_cpuid_entry2 *entry, int reg)
149 829ae2f9 Eduardo Habkost
{
150 829ae2f9 Eduardo Habkost
    uint32_t ret = 0;
151 829ae2f9 Eduardo Habkost
    switch (reg) {
152 829ae2f9 Eduardo Habkost
    case R_EAX:
153 829ae2f9 Eduardo Habkost
        ret = entry->eax;
154 829ae2f9 Eduardo Habkost
        break;
155 829ae2f9 Eduardo Habkost
    case R_EBX:
156 829ae2f9 Eduardo Habkost
        ret = entry->ebx;
157 829ae2f9 Eduardo Habkost
        break;
158 829ae2f9 Eduardo Habkost
    case R_ECX:
159 829ae2f9 Eduardo Habkost
        ret = entry->ecx;
160 829ae2f9 Eduardo Habkost
        break;
161 829ae2f9 Eduardo Habkost
    case R_EDX:
162 829ae2f9 Eduardo Habkost
        ret = entry->edx;
163 829ae2f9 Eduardo Habkost
        break;
164 829ae2f9 Eduardo Habkost
    }
165 829ae2f9 Eduardo Habkost
    return ret;
166 829ae2f9 Eduardo Habkost
}
167 829ae2f9 Eduardo Habkost
168 4fb73f1d Eduardo Habkost
/* Find matching entry for function/index on kvm_cpuid2 struct
169 4fb73f1d Eduardo Habkost
 */
170 4fb73f1d Eduardo Habkost
static struct kvm_cpuid_entry2 *cpuid_find_entry(struct kvm_cpuid2 *cpuid,
171 4fb73f1d Eduardo Habkost
                                                 uint32_t function,
172 4fb73f1d Eduardo Habkost
                                                 uint32_t index)
173 4fb73f1d Eduardo Habkost
{
174 4fb73f1d Eduardo Habkost
    int i;
175 4fb73f1d Eduardo Habkost
    for (i = 0; i < cpuid->nent; ++i) {
176 4fb73f1d Eduardo Habkost
        if (cpuid->entries[i].function == function &&
177 4fb73f1d Eduardo Habkost
            cpuid->entries[i].index == index) {
178 4fb73f1d Eduardo Habkost
            return &cpuid->entries[i];
179 4fb73f1d Eduardo Habkost
        }
180 4fb73f1d Eduardo Habkost
    }
181 4fb73f1d Eduardo Habkost
    /* not found: */
182 4fb73f1d Eduardo Habkost
    return NULL;
183 4fb73f1d Eduardo Habkost
}
184 4fb73f1d Eduardo Habkost
185 ba9bc59e Jan Kiszka
uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function,
186 c958a8bd Sheng Yang
                                      uint32_t index, int reg)
187 b827df58 Avi Kivity
{
188 b827df58 Avi Kivity
    struct kvm_cpuid2 *cpuid;
189 b827df58 Avi Kivity
    uint32_t ret = 0;
190 b827df58 Avi Kivity
    uint32_t cpuid_1_edx;
191 8c723b79 Eduardo Habkost
    bool found = false;
192 b827df58 Avi Kivity
193 dd87f8a6 Eduardo Habkost
    cpuid = get_supported_cpuid(s);
194 b827df58 Avi Kivity
195 4fb73f1d Eduardo Habkost
    struct kvm_cpuid_entry2 *entry = cpuid_find_entry(cpuid, function, index);
196 4fb73f1d Eduardo Habkost
    if (entry) {
197 4fb73f1d Eduardo Habkost
        found = true;
198 4fb73f1d Eduardo Habkost
        ret = cpuid_entry_get_reg(entry, reg);
199 b827df58 Avi Kivity
    }
200 b827df58 Avi Kivity
201 7b46e5ce Eduardo Habkost
    /* Fixups for the data returned by KVM, below */
202 7b46e5ce Eduardo Habkost
203 c2acb022 Eduardo Habkost
    if (function == 1 && reg == R_EDX) {
204 c2acb022 Eduardo Habkost
        /* KVM before 2.6.30 misreports the following features */
205 c2acb022 Eduardo Habkost
        ret |= CPUID_MTRR | CPUID_PAT | CPUID_MCE | CPUID_MCA;
206 84bd945c Eduardo Habkost
    } else if (function == 1 && reg == R_ECX) {
207 84bd945c Eduardo Habkost
        /* We can set the hypervisor flag, even if KVM does not return it on
208 84bd945c Eduardo Habkost
         * GET_SUPPORTED_CPUID
209 84bd945c Eduardo Habkost
         */
210 84bd945c Eduardo Habkost
        ret |= CPUID_EXT_HYPERVISOR;
211 ac67ee26 Eduardo Habkost
        /* tsc-deadline flag is not returned by GET_SUPPORTED_CPUID, but it
212 ac67ee26 Eduardo Habkost
         * can be enabled if the kernel has KVM_CAP_TSC_DEADLINE_TIMER,
213 ac67ee26 Eduardo Habkost
         * and the irqchip is in the kernel.
214 ac67ee26 Eduardo Habkost
         */
215 ac67ee26 Eduardo Habkost
        if (kvm_irqchip_in_kernel() &&
216 ac67ee26 Eduardo Habkost
                kvm_check_extension(s, KVM_CAP_TSC_DEADLINE_TIMER)) {
217 ac67ee26 Eduardo Habkost
            ret |= CPUID_EXT_TSC_DEADLINE_TIMER;
218 ac67ee26 Eduardo Habkost
        }
219 41e5e76d Eduardo Habkost
220 41e5e76d Eduardo Habkost
        /* x2apic is reported by GET_SUPPORTED_CPUID, but it can't be enabled
221 41e5e76d Eduardo Habkost
         * without the in-kernel irqchip
222 41e5e76d Eduardo Habkost
         */
223 41e5e76d Eduardo Habkost
        if (!kvm_irqchip_in_kernel()) {
224 41e5e76d Eduardo Habkost
            ret &= ~CPUID_EXT_X2APIC;
225 b827df58 Avi Kivity
        }
226 c2acb022 Eduardo Habkost
    } else if (function == 0x80000001 && reg == R_EDX) {
227 c2acb022 Eduardo Habkost
        /* On Intel, kvm returns cpuid according to the Intel spec,
228 c2acb022 Eduardo Habkost
         * so add missing bits according to the AMD spec:
229 c2acb022 Eduardo Habkost
         */
230 c2acb022 Eduardo Habkost
        cpuid_1_edx = kvm_arch_get_supported_cpuid(s, 1, 0, R_EDX);
231 c2acb022 Eduardo Habkost
        ret |= cpuid_1_edx & CPUID_EXT2_AMD_ALIASES;
232 b827df58 Avi Kivity
    }
233 b827df58 Avi Kivity
234 7267c094 Anthony Liguori
    g_free(cpuid);
235 b827df58 Avi Kivity
236 0c31b744 Glauber Costa
    /* fallback for older kernels */
237 8c723b79 Eduardo Habkost
    if ((function == KVM_CPUID_FEATURES) && !found) {
238 ba9bc59e Jan Kiszka
        ret = get_para_features(s);
239 b9bec74b Jan Kiszka
    }
240 0c31b744 Glauber Costa
241 0c31b744 Glauber Costa
    return ret;
242 bb0300dc Gleb Natapov
}
243 bb0300dc Gleb Natapov
244 3c85e74f Huang Ying
typedef struct HWPoisonPage {
245 3c85e74f Huang Ying
    ram_addr_t ram_addr;
246 3c85e74f Huang Ying
    QLIST_ENTRY(HWPoisonPage) list;
247 3c85e74f Huang Ying
} HWPoisonPage;
248 3c85e74f Huang Ying
249 3c85e74f Huang Ying
static QLIST_HEAD(, HWPoisonPage) hwpoison_page_list =
250 3c85e74f Huang Ying
    QLIST_HEAD_INITIALIZER(hwpoison_page_list);
251 3c85e74f Huang Ying
252 3c85e74f Huang Ying
static void kvm_unpoison_all(void *param)
253 3c85e74f Huang Ying
{
254 3c85e74f Huang Ying
    HWPoisonPage *page, *next_page;
255 3c85e74f Huang Ying
256 3c85e74f Huang Ying
    QLIST_FOREACH_SAFE(page, &hwpoison_page_list, list, next_page) {
257 3c85e74f Huang Ying
        QLIST_REMOVE(page, list);
258 3c85e74f Huang Ying
        qemu_ram_remap(page->ram_addr, TARGET_PAGE_SIZE);
259 7267c094 Anthony Liguori
        g_free(page);
260 3c85e74f Huang Ying
    }
261 3c85e74f Huang Ying
}
262 3c85e74f Huang Ying
263 3c85e74f Huang Ying
static void kvm_hwpoison_page_add(ram_addr_t ram_addr)
264 3c85e74f Huang Ying
{
265 3c85e74f Huang Ying
    HWPoisonPage *page;
266 3c85e74f Huang Ying
267 3c85e74f Huang Ying
    QLIST_FOREACH(page, &hwpoison_page_list, list) {
268 3c85e74f Huang Ying
        if (page->ram_addr == ram_addr) {
269 3c85e74f Huang Ying
            return;
270 3c85e74f Huang Ying
        }
271 3c85e74f Huang Ying
    }
272 7267c094 Anthony Liguori
    page = g_malloc(sizeof(HWPoisonPage));
273 3c85e74f Huang Ying
    page->ram_addr = ram_addr;
274 3c85e74f Huang Ying
    QLIST_INSERT_HEAD(&hwpoison_page_list, page, list);
275 3c85e74f Huang Ying
}
276 3c85e74f Huang Ying
277 e7701825 Marcelo Tosatti
static int kvm_get_mce_cap_supported(KVMState *s, uint64_t *mce_cap,
278 e7701825 Marcelo Tosatti
                                     int *max_banks)
279 e7701825 Marcelo Tosatti
{
280 e7701825 Marcelo Tosatti
    int r;
281 e7701825 Marcelo Tosatti
282 14a09518 Lai Jiangshan
    r = kvm_check_extension(s, KVM_CAP_MCE);
283 e7701825 Marcelo Tosatti
    if (r > 0) {
284 e7701825 Marcelo Tosatti
        *max_banks = r;
285 e7701825 Marcelo Tosatti
        return kvm_ioctl(s, KVM_X86_GET_MCE_CAP_SUPPORTED, mce_cap);
286 e7701825 Marcelo Tosatti
    }
287 e7701825 Marcelo Tosatti
    return -ENOSYS;
288 e7701825 Marcelo Tosatti
}
289 e7701825 Marcelo Tosatti
290 bee615d4 Andreas Fรคrber
static void kvm_mce_inject(X86CPU *cpu, hwaddr paddr, int code)
291 e7701825 Marcelo Tosatti
{
292 bee615d4 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
293 c34d440a Jan Kiszka
    uint64_t status = MCI_STATUS_VAL | MCI_STATUS_UC | MCI_STATUS_EN |
294 c34d440a Jan Kiszka
                      MCI_STATUS_MISCV | MCI_STATUS_ADDRV | MCI_STATUS_S;
295 c34d440a Jan Kiszka
    uint64_t mcg_status = MCG_STATUS_MCIP;
296 e7701825 Marcelo Tosatti
297 c34d440a Jan Kiszka
    if (code == BUS_MCEERR_AR) {
298 c34d440a Jan Kiszka
        status |= MCI_STATUS_AR | 0x134;
299 c34d440a Jan Kiszka
        mcg_status |= MCG_STATUS_EIPV;
300 c34d440a Jan Kiszka
    } else {
301 c34d440a Jan Kiszka
        status |= 0xc0;
302 c34d440a Jan Kiszka
        mcg_status |= MCG_STATUS_RIPV;
303 419fb20a Jan Kiszka
    }
304 8c5cf3b6 Andreas Fรคrber
    cpu_x86_inject_mce(NULL, cpu, 9, status, mcg_status, paddr,
305 c34d440a Jan Kiszka
                       (MCM_ADDR_PHYS << 6) | 0xc,
306 c34d440a Jan Kiszka
                       cpu_x86_support_mca_broadcast(env) ?
307 c34d440a Jan Kiszka
                       MCE_INJECT_BROADCAST : 0);
308 419fb20a Jan Kiszka
}
309 419fb20a Jan Kiszka
310 419fb20a Jan Kiszka
static void hardware_memory_error(void)
311 419fb20a Jan Kiszka
{
312 419fb20a Jan Kiszka
    fprintf(stderr, "Hardware memory error!\n");
313 419fb20a Jan Kiszka
    exit(1);
314 419fb20a Jan Kiszka
}
315 419fb20a Jan Kiszka
316 20d695a9 Andreas Fรคrber
int kvm_arch_on_sigbus_vcpu(CPUState *c, int code, void *addr)
317 419fb20a Jan Kiszka
{
318 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(c);
319 20d695a9 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
320 419fb20a Jan Kiszka
    ram_addr_t ram_addr;
321 a8170e5e Avi Kivity
    hwaddr paddr;
322 419fb20a Jan Kiszka
323 419fb20a Jan Kiszka
    if ((env->mcg_cap & MCG_SER_P) && addr
324 c34d440a Jan Kiszka
        && (code == BUS_MCEERR_AR || code == BUS_MCEERR_AO)) {
325 1b5ec234 Paolo Bonzini
        if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
326 a60f24b5 Andreas Fรคrber
            !kvm_physical_memory_addr_from_host(c->kvm_state, addr, &paddr)) {
327 419fb20a Jan Kiszka
            fprintf(stderr, "Hardware memory error for memory used by "
328 419fb20a Jan Kiszka
                    "QEMU itself instead of guest system!\n");
329 419fb20a Jan Kiszka
            /* Hope we are lucky for AO MCE */
330 419fb20a Jan Kiszka
            if (code == BUS_MCEERR_AO) {
331 419fb20a Jan Kiszka
                return 0;
332 419fb20a Jan Kiszka
            } else {
333 419fb20a Jan Kiszka
                hardware_memory_error();
334 419fb20a Jan Kiszka
            }
335 419fb20a Jan Kiszka
        }
336 3c85e74f Huang Ying
        kvm_hwpoison_page_add(ram_addr);
337 bee615d4 Andreas Fรคrber
        kvm_mce_inject(cpu, paddr, code);
338 e56ff191 Jan Kiszka
    } else {
339 419fb20a Jan Kiszka
        if (code == BUS_MCEERR_AO) {
340 419fb20a Jan Kiszka
            return 0;
341 419fb20a Jan Kiszka
        } else if (code == BUS_MCEERR_AR) {
342 419fb20a Jan Kiszka
            hardware_memory_error();
343 419fb20a Jan Kiszka
        } else {
344 419fb20a Jan Kiszka
            return 1;
345 419fb20a Jan Kiszka
        }
346 419fb20a Jan Kiszka
    }
347 419fb20a Jan Kiszka
    return 0;
348 419fb20a Jan Kiszka
}
349 419fb20a Jan Kiszka
350 419fb20a Jan Kiszka
int kvm_arch_on_sigbus(int code, void *addr)
351 419fb20a Jan Kiszka
{
352 182735ef Andreas Fรคrber
    X86CPU *cpu = X86_CPU(first_cpu);
353 182735ef Andreas Fรคrber
354 182735ef Andreas Fรคrber
    if ((cpu->env.mcg_cap & MCG_SER_P) && addr && code == BUS_MCEERR_AO) {
355 419fb20a Jan Kiszka
        ram_addr_t ram_addr;
356 a8170e5e Avi Kivity
        hwaddr paddr;
357 419fb20a Jan Kiszka
358 419fb20a Jan Kiszka
        /* Hope we are lucky for AO MCE */
359 1b5ec234 Paolo Bonzini
        if (qemu_ram_addr_from_host(addr, &ram_addr) == NULL ||
360 182735ef Andreas Fรคrber
            !kvm_physical_memory_addr_from_host(first_cpu->kvm_state,
361 a60f24b5 Andreas Fรคrber
                                                addr, &paddr)) {
362 419fb20a Jan Kiszka
            fprintf(stderr, "Hardware memory error for memory used by "
363 419fb20a Jan Kiszka
                    "QEMU itself instead of guest system!: %p\n", addr);
364 419fb20a Jan Kiszka
            return 0;
365 419fb20a Jan Kiszka
        }
366 3c85e74f Huang Ying
        kvm_hwpoison_page_add(ram_addr);
367 182735ef Andreas Fรคrber
        kvm_mce_inject(X86_CPU(first_cpu), paddr, code);
368 e56ff191 Jan Kiszka
    } else {
369 419fb20a Jan Kiszka
        if (code == BUS_MCEERR_AO) {
370 419fb20a Jan Kiszka
            return 0;
371 419fb20a Jan Kiszka
        } else if (code == BUS_MCEERR_AR) {
372 419fb20a Jan Kiszka
            hardware_memory_error();
373 419fb20a Jan Kiszka
        } else {
374 419fb20a Jan Kiszka
            return 1;
375 419fb20a Jan Kiszka
        }
376 419fb20a Jan Kiszka
    }
377 419fb20a Jan Kiszka
    return 0;
378 419fb20a Jan Kiszka
}
379 e7701825 Marcelo Tosatti
380 1bc22652 Andreas Fรคrber
static int kvm_inject_mce_oldstyle(X86CPU *cpu)
381 ab443475 Jan Kiszka
{
382 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
383 1bc22652 Andreas Fรคrber
384 ab443475 Jan Kiszka
    if (!kvm_has_vcpu_events() && env->exception_injected == EXCP12_MCHK) {
385 ab443475 Jan Kiszka
        unsigned int bank, bank_num = env->mcg_cap & 0xff;
386 ab443475 Jan Kiszka
        struct kvm_x86_mce mce;
387 ab443475 Jan Kiszka
388 ab443475 Jan Kiszka
        env->exception_injected = -1;
389 ab443475 Jan Kiszka
390 ab443475 Jan Kiszka
        /*
391 ab443475 Jan Kiszka
         * There must be at least one bank in use if an MCE is pending.
392 ab443475 Jan Kiszka
         * Find it and use its values for the event injection.
393 ab443475 Jan Kiszka
         */
394 ab443475 Jan Kiszka
        for (bank = 0; bank < bank_num; bank++) {
395 ab443475 Jan Kiszka
            if (env->mce_banks[bank * 4 + 1] & MCI_STATUS_VAL) {
396 ab443475 Jan Kiszka
                break;
397 ab443475 Jan Kiszka
            }
398 ab443475 Jan Kiszka
        }
399 ab443475 Jan Kiszka
        assert(bank < bank_num);
400 ab443475 Jan Kiszka
401 ab443475 Jan Kiszka
        mce.bank = bank;
402 ab443475 Jan Kiszka
        mce.status = env->mce_banks[bank * 4 + 1];
403 ab443475 Jan Kiszka
        mce.mcg_status = env->mcg_status;
404 ab443475 Jan Kiszka
        mce.addr = env->mce_banks[bank * 4 + 2];
405 ab443475 Jan Kiszka
        mce.misc = env->mce_banks[bank * 4 + 3];
406 ab443475 Jan Kiszka
407 1bc22652 Andreas Fรคrber
        return kvm_vcpu_ioctl(CPU(cpu), KVM_X86_SET_MCE, &mce);
408 ab443475 Jan Kiszka
    }
409 ab443475 Jan Kiszka
    return 0;
410 ab443475 Jan Kiszka
}
411 ab443475 Jan Kiszka
412 1dfb4dd9 Luiz Capitulino
static void cpu_update_state(void *opaque, int running, RunState state)
413 b8cc45d6 Glauber Costa
{
414 317ac620 Andreas Fรคrber
    CPUX86State *env = opaque;
415 b8cc45d6 Glauber Costa
416 b8cc45d6 Glauber Costa
    if (running) {
417 b8cc45d6 Glauber Costa
        env->tsc_valid = false;
418 b8cc45d6 Glauber Costa
    }
419 b8cc45d6 Glauber Costa
}
420 b8cc45d6 Glauber Costa
421 83b17af5 Eduardo Habkost
unsigned long kvm_arch_vcpu_id(CPUState *cs)
422 b164e48e Eduardo Habkost
{
423 83b17af5 Eduardo Habkost
    X86CPU *cpu = X86_CPU(cs);
424 83b17af5 Eduardo Habkost
    return cpu->env.cpuid_apic_id;
425 b164e48e Eduardo Habkost
}
426 b164e48e Eduardo Habkost
427 92067bf4 Igor Mammedov
#ifndef KVM_CPUID_SIGNATURE_NEXT
428 92067bf4 Igor Mammedov
#define KVM_CPUID_SIGNATURE_NEXT                0x40000100
429 92067bf4 Igor Mammedov
#endif
430 92067bf4 Igor Mammedov
431 92067bf4 Igor Mammedov
static bool hyperv_hypercall_available(X86CPU *cpu)
432 92067bf4 Igor Mammedov
{
433 92067bf4 Igor Mammedov
    return cpu->hyperv_vapic ||
434 92067bf4 Igor Mammedov
           (cpu->hyperv_spinlock_attempts != HYPERV_SPINLOCK_NEVER_RETRY);
435 92067bf4 Igor Mammedov
}
436 92067bf4 Igor Mammedov
437 92067bf4 Igor Mammedov
static bool hyperv_enabled(X86CPU *cpu)
438 92067bf4 Igor Mammedov
{
439 92067bf4 Igor Mammedov
    return hyperv_hypercall_available(cpu) ||
440 92067bf4 Igor Mammedov
           cpu->hyperv_relaxed_timing;
441 92067bf4 Igor Mammedov
}
442 92067bf4 Igor Mammedov
443 f8bb0565 Igor Mammedov
#define KVM_MAX_CPUID_ENTRIES  100
444 0893d460 Anthony Liguori
445 20d695a9 Andreas Fรคrber
int kvm_arch_init_vcpu(CPUState *cs)
446 05330448 aliguori
{
447 05330448 aliguori
    struct {
448 486bd5a2 aliguori
        struct kvm_cpuid2 cpuid;
449 f8bb0565 Igor Mammedov
        struct kvm_cpuid_entry2 entries[KVM_MAX_CPUID_ENTRIES];
450 541dc0d4 Stefan Weil
    } QEMU_PACKED cpuid_data;
451 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
452 20d695a9 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
453 486bd5a2 aliguori
    uint32_t limit, i, j, cpuid_i;
454 a33609ca aliguori
    uint32_t unused;
455 bb0300dc Gleb Natapov
    struct kvm_cpuid_entry2 *c;
456 bb0300dc Gleb Natapov
    uint32_t signature[3];
457 e7429073 Joerg Roedel
    int r;
458 05330448 aliguori
459 05330448 aliguori
    cpuid_i = 0;
460 05330448 aliguori
461 bb0300dc Gleb Natapov
    /* Paravirtualization CPUIDs */
462 bb0300dc Gleb Natapov
    c = &cpuid_data.entries[cpuid_i++];
463 bb0300dc Gleb Natapov
    memset(c, 0, sizeof(*c));
464 bb0300dc Gleb Natapov
    c->function = KVM_CPUID_SIGNATURE;
465 92067bf4 Igor Mammedov
    if (!hyperv_enabled(cpu)) {
466 eab70139 Vadim Rozenfeld
        memcpy(signature, "KVMKVMKVM\0\0\0", 12);
467 eab70139 Vadim Rozenfeld
        c->eax = 0;
468 eab70139 Vadim Rozenfeld
    } else {
469 eab70139 Vadim Rozenfeld
        memcpy(signature, "Microsoft Hv", 12);
470 eab70139 Vadim Rozenfeld
        c->eax = HYPERV_CPUID_MIN;
471 eab70139 Vadim Rozenfeld
    }
472 bb0300dc Gleb Natapov
    c->ebx = signature[0];
473 bb0300dc Gleb Natapov
    c->ecx = signature[1];
474 bb0300dc Gleb Natapov
    c->edx = signature[2];
475 bb0300dc Gleb Natapov
476 bb0300dc Gleb Natapov
    c = &cpuid_data.entries[cpuid_i++];
477 bb0300dc Gleb Natapov
    memset(c, 0, sizeof(*c));
478 bb0300dc Gleb Natapov
    c->function = KVM_CPUID_FEATURES;
479 0514ef2f Eduardo Habkost
    c->eax = env->features[FEAT_KVM];
480 0c31b744 Glauber Costa
481 92067bf4 Igor Mammedov
    if (hyperv_enabled(cpu)) {
482 eab70139 Vadim Rozenfeld
        memcpy(signature, "Hv#1\0\0\0\0\0\0\0\0", 12);
483 eab70139 Vadim Rozenfeld
        c->eax = signature[0];
484 eab70139 Vadim Rozenfeld
485 eab70139 Vadim Rozenfeld
        c = &cpuid_data.entries[cpuid_i++];
486 eab70139 Vadim Rozenfeld
        memset(c, 0, sizeof(*c));
487 eab70139 Vadim Rozenfeld
        c->function = HYPERV_CPUID_VERSION;
488 eab70139 Vadim Rozenfeld
        c->eax = 0x00001bbc;
489 eab70139 Vadim Rozenfeld
        c->ebx = 0x00060001;
490 eab70139 Vadim Rozenfeld
491 eab70139 Vadim Rozenfeld
        c = &cpuid_data.entries[cpuid_i++];
492 eab70139 Vadim Rozenfeld
        memset(c, 0, sizeof(*c));
493 eab70139 Vadim Rozenfeld
        c->function = HYPERV_CPUID_FEATURES;
494 92067bf4 Igor Mammedov
        if (cpu->hyperv_relaxed_timing) {
495 eab70139 Vadim Rozenfeld
            c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE;
496 eab70139 Vadim Rozenfeld
        }
497 92067bf4 Igor Mammedov
        if (cpu->hyperv_vapic) {
498 eab70139 Vadim Rozenfeld
            c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE;
499 eab70139 Vadim Rozenfeld
            c->eax |= HV_X64_MSR_APIC_ACCESS_AVAILABLE;
500 eab70139 Vadim Rozenfeld
        }
501 eab70139 Vadim Rozenfeld
502 eab70139 Vadim Rozenfeld
        c = &cpuid_data.entries[cpuid_i++];
503 eab70139 Vadim Rozenfeld
        memset(c, 0, sizeof(*c));
504 eab70139 Vadim Rozenfeld
        c->function = HYPERV_CPUID_ENLIGHTMENT_INFO;
505 92067bf4 Igor Mammedov
        if (cpu->hyperv_relaxed_timing) {
506 eab70139 Vadim Rozenfeld
            c->eax |= HV_X64_RELAXED_TIMING_RECOMMENDED;
507 eab70139 Vadim Rozenfeld
        }
508 92067bf4 Igor Mammedov
        if (cpu->hyperv_vapic) {
509 eab70139 Vadim Rozenfeld
            c->eax |= HV_X64_APIC_ACCESS_RECOMMENDED;
510 eab70139 Vadim Rozenfeld
        }
511 92067bf4 Igor Mammedov
        c->ebx = cpu->hyperv_spinlock_attempts;
512 eab70139 Vadim Rozenfeld
513 eab70139 Vadim Rozenfeld
        c = &cpuid_data.entries[cpuid_i++];
514 eab70139 Vadim Rozenfeld
        memset(c, 0, sizeof(*c));
515 eab70139 Vadim Rozenfeld
        c->function = HYPERV_CPUID_IMPLEMENT_LIMITS;
516 eab70139 Vadim Rozenfeld
        c->eax = 0x40;
517 eab70139 Vadim Rozenfeld
        c->ebx = 0x40;
518 eab70139 Vadim Rozenfeld
519 eab70139 Vadim Rozenfeld
        c = &cpuid_data.entries[cpuid_i++];
520 eab70139 Vadim Rozenfeld
        memset(c, 0, sizeof(*c));
521 eab70139 Vadim Rozenfeld
        c->function = KVM_CPUID_SIGNATURE_NEXT;
522 eab70139 Vadim Rozenfeld
        memcpy(signature, "KVMKVMKVM\0\0\0", 12);
523 eab70139 Vadim Rozenfeld
        c->eax = 0;
524 eab70139 Vadim Rozenfeld
        c->ebx = signature[0];
525 eab70139 Vadim Rozenfeld
        c->ecx = signature[1];
526 eab70139 Vadim Rozenfeld
        c->edx = signature[2];
527 eab70139 Vadim Rozenfeld
    }
528 eab70139 Vadim Rozenfeld
529 0c31b744 Glauber Costa
    has_msr_async_pf_en = c->eax & (1 << KVM_FEATURE_ASYNC_PF);
530 0c31b744 Glauber Costa
531 bc9a839d Michael S. Tsirkin
    has_msr_pv_eoi_en = c->eax & (1 << KVM_FEATURE_PV_EOI);
532 bc9a839d Michael S. Tsirkin
533 917367aa Marcelo Tosatti
    has_msr_kvm_steal_time = c->eax & (1 << KVM_FEATURE_STEAL_TIME);
534 917367aa Marcelo Tosatti
535 a33609ca aliguori
    cpu_x86_cpuid(env, 0, 0, &limit, &unused, &unused, &unused);
536 05330448 aliguori
537 05330448 aliguori
    for (i = 0; i <= limit; i++) {
538 f8bb0565 Igor Mammedov
        if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
539 f8bb0565 Igor Mammedov
            fprintf(stderr, "unsupported level value: 0x%x\n", limit);
540 f8bb0565 Igor Mammedov
            abort();
541 f8bb0565 Igor Mammedov
        }
542 bb0300dc Gleb Natapov
        c = &cpuid_data.entries[cpuid_i++];
543 486bd5a2 aliguori
544 486bd5a2 aliguori
        switch (i) {
545 a36b1029 aliguori
        case 2: {
546 a36b1029 aliguori
            /* Keep reading function 2 till all the input is received */
547 a36b1029 aliguori
            int times;
548 a36b1029 aliguori
549 a36b1029 aliguori
            c->function = i;
550 a33609ca aliguori
            c->flags = KVM_CPUID_FLAG_STATEFUL_FUNC |
551 a33609ca aliguori
                       KVM_CPUID_FLAG_STATE_READ_NEXT;
552 a33609ca aliguori
            cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
553 a33609ca aliguori
            times = c->eax & 0xff;
554 a36b1029 aliguori
555 a36b1029 aliguori
            for (j = 1; j < times; ++j) {
556 f8bb0565 Igor Mammedov
                if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
557 f8bb0565 Igor Mammedov
                    fprintf(stderr, "cpuid_data is full, no space for "
558 f8bb0565 Igor Mammedov
                            "cpuid(eax:2):eax & 0xf = 0x%x\n", times);
559 f8bb0565 Igor Mammedov
                    abort();
560 f8bb0565 Igor Mammedov
                }
561 a33609ca aliguori
                c = &cpuid_data.entries[cpuid_i++];
562 a36b1029 aliguori
                c->function = i;
563 a33609ca aliguori
                c->flags = KVM_CPUID_FLAG_STATEFUL_FUNC;
564 a33609ca aliguori
                cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
565 a36b1029 aliguori
            }
566 a36b1029 aliguori
            break;
567 a36b1029 aliguori
        }
568 486bd5a2 aliguori
        case 4:
569 486bd5a2 aliguori
        case 0xb:
570 486bd5a2 aliguori
        case 0xd:
571 486bd5a2 aliguori
            for (j = 0; ; j++) {
572 31e8c696 Andre Przywara
                if (i == 0xd && j == 64) {
573 31e8c696 Andre Przywara
                    break;
574 31e8c696 Andre Przywara
                }
575 486bd5a2 aliguori
                c->function = i;
576 486bd5a2 aliguori
                c->flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX;
577 486bd5a2 aliguori
                c->index = j;
578 a33609ca aliguori
                cpu_x86_cpuid(env, i, j, &c->eax, &c->ebx, &c->ecx, &c->edx);
579 486bd5a2 aliguori
580 b9bec74b Jan Kiszka
                if (i == 4 && c->eax == 0) {
581 486bd5a2 aliguori
                    break;
582 b9bec74b Jan Kiszka
                }
583 b9bec74b Jan Kiszka
                if (i == 0xb && !(c->ecx & 0xff00)) {
584 486bd5a2 aliguori
                    break;
585 b9bec74b Jan Kiszka
                }
586 b9bec74b Jan Kiszka
                if (i == 0xd && c->eax == 0) {
587 31e8c696 Andre Przywara
                    continue;
588 b9bec74b Jan Kiszka
                }
589 f8bb0565 Igor Mammedov
                if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
590 f8bb0565 Igor Mammedov
                    fprintf(stderr, "cpuid_data is full, no space for "
591 f8bb0565 Igor Mammedov
                            "cpuid(eax:0x%x,ecx:0x%x)\n", i, j);
592 f8bb0565 Igor Mammedov
                    abort();
593 f8bb0565 Igor Mammedov
                }
594 a33609ca aliguori
                c = &cpuid_data.entries[cpuid_i++];
595 486bd5a2 aliguori
            }
596 486bd5a2 aliguori
            break;
597 486bd5a2 aliguori
        default:
598 486bd5a2 aliguori
            c->function = i;
599 a33609ca aliguori
            c->flags = 0;
600 a33609ca aliguori
            cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
601 486bd5a2 aliguori
            break;
602 486bd5a2 aliguori
        }
603 05330448 aliguori
    }
604 0d894367 Paolo Bonzini
605 0d894367 Paolo Bonzini
    if (limit >= 0x0a) {
606 0d894367 Paolo Bonzini
        uint32_t ver;
607 0d894367 Paolo Bonzini
608 0d894367 Paolo Bonzini
        cpu_x86_cpuid(env, 0x0a, 0, &ver, &unused, &unused, &unused);
609 0d894367 Paolo Bonzini
        if ((ver & 0xff) > 0) {
610 0d894367 Paolo Bonzini
            has_msr_architectural_pmu = true;
611 0d894367 Paolo Bonzini
            num_architectural_pmu_counters = (ver & 0xff00) >> 8;
612 0d894367 Paolo Bonzini
613 0d894367 Paolo Bonzini
            /* Shouldn't be more than 32, since that's the number of bits
614 0d894367 Paolo Bonzini
             * available in EBX to tell us _which_ counters are available.
615 0d894367 Paolo Bonzini
             * Play it safe.
616 0d894367 Paolo Bonzini
             */
617 0d894367 Paolo Bonzini
            if (num_architectural_pmu_counters > MAX_GP_COUNTERS) {
618 0d894367 Paolo Bonzini
                num_architectural_pmu_counters = MAX_GP_COUNTERS;
619 0d894367 Paolo Bonzini
            }
620 0d894367 Paolo Bonzini
        }
621 0d894367 Paolo Bonzini
    }
622 0d894367 Paolo Bonzini
623 a33609ca aliguori
    cpu_x86_cpuid(env, 0x80000000, 0, &limit, &unused, &unused, &unused);
624 05330448 aliguori
625 05330448 aliguori
    for (i = 0x80000000; i <= limit; i++) {
626 f8bb0565 Igor Mammedov
        if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
627 f8bb0565 Igor Mammedov
            fprintf(stderr, "unsupported xlevel value: 0x%x\n", limit);
628 f8bb0565 Igor Mammedov
            abort();
629 f8bb0565 Igor Mammedov
        }
630 bb0300dc Gleb Natapov
        c = &cpuid_data.entries[cpuid_i++];
631 05330448 aliguori
632 05330448 aliguori
        c->function = i;
633 a33609ca aliguori
        c->flags = 0;
634 a33609ca aliguori
        cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
635 05330448 aliguori
    }
636 05330448 aliguori
637 b3baa152 brillywu@viatech.com.cn
    /* Call Centaur's CPUID instructions they are supported. */
638 b3baa152 brillywu@viatech.com.cn
    if (env->cpuid_xlevel2 > 0) {
639 b3baa152 brillywu@viatech.com.cn
        cpu_x86_cpuid(env, 0xC0000000, 0, &limit, &unused, &unused, &unused);
640 b3baa152 brillywu@viatech.com.cn
641 b3baa152 brillywu@viatech.com.cn
        for (i = 0xC0000000; i <= limit; i++) {
642 f8bb0565 Igor Mammedov
            if (cpuid_i == KVM_MAX_CPUID_ENTRIES) {
643 f8bb0565 Igor Mammedov
                fprintf(stderr, "unsupported xlevel2 value: 0x%x\n", limit);
644 f8bb0565 Igor Mammedov
                abort();
645 f8bb0565 Igor Mammedov
            }
646 b3baa152 brillywu@viatech.com.cn
            c = &cpuid_data.entries[cpuid_i++];
647 b3baa152 brillywu@viatech.com.cn
648 b3baa152 brillywu@viatech.com.cn
            c->function = i;
649 b3baa152 brillywu@viatech.com.cn
            c->flags = 0;
650 b3baa152 brillywu@viatech.com.cn
            cpu_x86_cpuid(env, i, 0, &c->eax, &c->ebx, &c->ecx, &c->edx);
651 b3baa152 brillywu@viatech.com.cn
        }
652 b3baa152 brillywu@viatech.com.cn
    }
653 b3baa152 brillywu@viatech.com.cn
654 05330448 aliguori
    cpuid_data.cpuid.nent = cpuid_i;
655 05330448 aliguori
656 e7701825 Marcelo Tosatti
    if (((env->cpuid_version >> 8)&0xF) >= 6
657 0514ef2f Eduardo Habkost
        && (env->features[FEAT_1_EDX] & (CPUID_MCE | CPUID_MCA)) ==
658 fc7a504c Eduardo Habkost
           (CPUID_MCE | CPUID_MCA)
659 a60f24b5 Andreas Fรคrber
        && kvm_check_extension(cs->kvm_state, KVM_CAP_MCE) > 0) {
660 e7701825 Marcelo Tosatti
        uint64_t mcg_cap;
661 e7701825 Marcelo Tosatti
        int banks;
662 32a42024 Jan Kiszka
        int ret;
663 e7701825 Marcelo Tosatti
664 a60f24b5 Andreas Fรคrber
        ret = kvm_get_mce_cap_supported(cs->kvm_state, &mcg_cap, &banks);
665 75d49497 Jan Kiszka
        if (ret < 0) {
666 75d49497 Jan Kiszka
            fprintf(stderr, "kvm_get_mce_cap_supported: %s", strerror(-ret));
667 75d49497 Jan Kiszka
            return ret;
668 e7701825 Marcelo Tosatti
        }
669 75d49497 Jan Kiszka
670 75d49497 Jan Kiszka
        if (banks > MCE_BANKS_DEF) {
671 75d49497 Jan Kiszka
            banks = MCE_BANKS_DEF;
672 75d49497 Jan Kiszka
        }
673 75d49497 Jan Kiszka
        mcg_cap &= MCE_CAP_DEF;
674 75d49497 Jan Kiszka
        mcg_cap |= banks;
675 1bc22652 Andreas Fรคrber
        ret = kvm_vcpu_ioctl(cs, KVM_X86_SETUP_MCE, &mcg_cap);
676 75d49497 Jan Kiszka
        if (ret < 0) {
677 75d49497 Jan Kiszka
            fprintf(stderr, "KVM_X86_SETUP_MCE: %s", strerror(-ret));
678 75d49497 Jan Kiszka
            return ret;
679 75d49497 Jan Kiszka
        }
680 75d49497 Jan Kiszka
681 75d49497 Jan Kiszka
        env->mcg_cap = mcg_cap;
682 e7701825 Marcelo Tosatti
    }
683 e7701825 Marcelo Tosatti
684 b8cc45d6 Glauber Costa
    qemu_add_vm_change_state_handler(cpu_update_state, env);
685 b8cc45d6 Glauber Costa
686 df67696e Liu Jinsong
    c = cpuid_find_entry(&cpuid_data.cpuid, 1, 0);
687 df67696e Liu Jinsong
    if (c) {
688 df67696e Liu Jinsong
        has_msr_feature_control = !!(c->ecx & CPUID_EXT_VMX) ||
689 df67696e Liu Jinsong
                                  !!(c->ecx & CPUID_EXT_SMX);
690 df67696e Liu Jinsong
    }
691 df67696e Liu Jinsong
692 7e680753 Michael S. Tsirkin
    cpuid_data.cpuid.padding = 0;
693 1bc22652 Andreas Fรคrber
    r = kvm_vcpu_ioctl(cs, KVM_SET_CPUID2, &cpuid_data);
694 fdc9c41a Jan Kiszka
    if (r) {
695 fdc9c41a Jan Kiszka
        return r;
696 fdc9c41a Jan Kiszka
    }
697 e7429073 Joerg Roedel
698 a60f24b5 Andreas Fรคrber
    r = kvm_check_extension(cs->kvm_state, KVM_CAP_TSC_CONTROL);
699 e7429073 Joerg Roedel
    if (r && env->tsc_khz) {
700 1bc22652 Andreas Fรคrber
        r = kvm_vcpu_ioctl(cs, KVM_SET_TSC_KHZ, env->tsc_khz);
701 e7429073 Joerg Roedel
        if (r < 0) {
702 e7429073 Joerg Roedel
            fprintf(stderr, "KVM_SET_TSC_KHZ failed\n");
703 e7429073 Joerg Roedel
            return r;
704 e7429073 Joerg Roedel
        }
705 e7429073 Joerg Roedel
    }
706 e7429073 Joerg Roedel
707 fabacc0f Jan Kiszka
    if (kvm_has_xsave()) {
708 fabacc0f Jan Kiszka
        env->kvm_xsave_buf = qemu_memalign(4096, sizeof(struct kvm_xsave));
709 fabacc0f Jan Kiszka
    }
710 fabacc0f Jan Kiszka
711 e7429073 Joerg Roedel
    return 0;
712 05330448 aliguori
}
713 05330448 aliguori
714 20d695a9 Andreas Fรคrber
void kvm_arch_reset_vcpu(CPUState *cs)
715 caa5af0f Jan Kiszka
{
716 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
717 20d695a9 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
718 dd673288 Igor Mammedov
719 e73223a5 Gleb Natapov
    env->exception_injected = -1;
720 0e607a80 Jan Kiszka
    env->interrupt_injected = -1;
721 1a5e9d2f Jan Kiszka
    env->xcr0 = 1;
722 ddced198 Marcelo Tosatti
    if (kvm_irqchip_in_kernel()) {
723 dd673288 Igor Mammedov
        env->mp_state = cpu_is_bsp(cpu) ? KVM_MP_STATE_RUNNABLE :
724 ddced198 Marcelo Tosatti
                                          KVM_MP_STATE_UNINITIALIZED;
725 ddced198 Marcelo Tosatti
    } else {
726 ddced198 Marcelo Tosatti
        env->mp_state = KVM_MP_STATE_RUNNABLE;
727 ddced198 Marcelo Tosatti
    }
728 caa5af0f Jan Kiszka
}
729 caa5af0f Jan Kiszka
730 c3a3a7d3 Jan Kiszka
static int kvm_get_supported_msrs(KVMState *s)
731 05330448 aliguori
{
732 75b10c43 Marcelo Tosatti
    static int kvm_supported_msrs;
733 c3a3a7d3 Jan Kiszka
    int ret = 0;
734 05330448 aliguori
735 05330448 aliguori
    /* first time */
736 75b10c43 Marcelo Tosatti
    if (kvm_supported_msrs == 0) {
737 05330448 aliguori
        struct kvm_msr_list msr_list, *kvm_msr_list;
738 05330448 aliguori
739 75b10c43 Marcelo Tosatti
        kvm_supported_msrs = -1;
740 05330448 aliguori
741 05330448 aliguori
        /* Obtain MSR list from KVM.  These are the MSRs that we must
742 05330448 aliguori
         * save/restore */
743 4c9f7372 aliguori
        msr_list.nmsrs = 0;
744 c3a3a7d3 Jan Kiszka
        ret = kvm_ioctl(s, KVM_GET_MSR_INDEX_LIST, &msr_list);
745 6fb6d245 Jan Kiszka
        if (ret < 0 && ret != -E2BIG) {
746 c3a3a7d3 Jan Kiszka
            return ret;
747 6fb6d245 Jan Kiszka
        }
748 d9db889f Jan Kiszka
        /* Old kernel modules had a bug and could write beyond the provided
749 d9db889f Jan Kiszka
           memory. Allocate at least a safe amount of 1K. */
750 7267c094 Anthony Liguori
        kvm_msr_list = g_malloc0(MAX(1024, sizeof(msr_list) +
751 d9db889f Jan Kiszka
                                              msr_list.nmsrs *
752 d9db889f Jan Kiszka
                                              sizeof(msr_list.indices[0])));
753 05330448 aliguori
754 55308450 aliguori
        kvm_msr_list->nmsrs = msr_list.nmsrs;
755 c3a3a7d3 Jan Kiszka
        ret = kvm_ioctl(s, KVM_GET_MSR_INDEX_LIST, kvm_msr_list);
756 05330448 aliguori
        if (ret >= 0) {
757 05330448 aliguori
            int i;
758 05330448 aliguori
759 05330448 aliguori
            for (i = 0; i < kvm_msr_list->nmsrs; i++) {
760 05330448 aliguori
                if (kvm_msr_list->indices[i] == MSR_STAR) {
761 c3a3a7d3 Jan Kiszka
                    has_msr_star = true;
762 75b10c43 Marcelo Tosatti
                    continue;
763 75b10c43 Marcelo Tosatti
                }
764 75b10c43 Marcelo Tosatti
                if (kvm_msr_list->indices[i] == MSR_VM_HSAVE_PA) {
765 c3a3a7d3 Jan Kiszka
                    has_msr_hsave_pa = true;
766 75b10c43 Marcelo Tosatti
                    continue;
767 05330448 aliguori
                }
768 f28558d3 Will Auld
                if (kvm_msr_list->indices[i] == MSR_TSC_ADJUST) {
769 f28558d3 Will Auld
                    has_msr_tsc_adjust = true;
770 f28558d3 Will Auld
                    continue;
771 f28558d3 Will Auld
                }
772 aa82ba54 Liu, Jinsong
                if (kvm_msr_list->indices[i] == MSR_IA32_TSCDEADLINE) {
773 aa82ba54 Liu, Jinsong
                    has_msr_tsc_deadline = true;
774 aa82ba54 Liu, Jinsong
                    continue;
775 aa82ba54 Liu, Jinsong
                }
776 21e87c46 Avi Kivity
                if (kvm_msr_list->indices[i] == MSR_IA32_MISC_ENABLE) {
777 21e87c46 Avi Kivity
                    has_msr_misc_enable = true;
778 21e87c46 Avi Kivity
                    continue;
779 21e87c46 Avi Kivity
                }
780 05330448 aliguori
            }
781 05330448 aliguori
        }
782 05330448 aliguori
783 7267c094 Anthony Liguori
        g_free(kvm_msr_list);
784 05330448 aliguori
    }
785 05330448 aliguori
786 c3a3a7d3 Jan Kiszka
    return ret;
787 05330448 aliguori
}
788 05330448 aliguori
789 cad1e282 Jan Kiszka
int kvm_arch_init(KVMState *s)
790 20420430 Sheng Yang
{
791 11076198 Jan Kiszka
    uint64_t identity_base = 0xfffbc000;
792 39d6960a Jan Kiszka
    uint64_t shadow_mem;
793 20420430 Sheng Yang
    int ret;
794 25d2e361 Marcelo Tosatti
    struct utsname utsname;
795 20420430 Sheng Yang
796 c3a3a7d3 Jan Kiszka
    ret = kvm_get_supported_msrs(s);
797 20420430 Sheng Yang
    if (ret < 0) {
798 20420430 Sheng Yang
        return ret;
799 20420430 Sheng Yang
    }
800 25d2e361 Marcelo Tosatti
801 25d2e361 Marcelo Tosatti
    uname(&utsname);
802 25d2e361 Marcelo Tosatti
    lm_capable_kernel = strcmp(utsname.machine, "x86_64") == 0;
803 25d2e361 Marcelo Tosatti
804 4c5b10b7 Jes Sorensen
    /*
805 11076198 Jan Kiszka
     * On older Intel CPUs, KVM uses vm86 mode to emulate 16-bit code directly.
806 11076198 Jan Kiszka
     * In order to use vm86 mode, an EPT identity map and a TSS  are needed.
807 11076198 Jan Kiszka
     * Since these must be part of guest physical memory, we need to allocate
808 11076198 Jan Kiszka
     * them, both by setting their start addresses in the kernel and by
809 11076198 Jan Kiszka
     * creating a corresponding e820 entry. We need 4 pages before the BIOS.
810 11076198 Jan Kiszka
     *
811 11076198 Jan Kiszka
     * Older KVM versions may not support setting the identity map base. In
812 11076198 Jan Kiszka
     * that case we need to stick with the default, i.e. a 256K maximum BIOS
813 11076198 Jan Kiszka
     * size.
814 4c5b10b7 Jes Sorensen
     */
815 11076198 Jan Kiszka
    if (kvm_check_extension(s, KVM_CAP_SET_IDENTITY_MAP_ADDR)) {
816 11076198 Jan Kiszka
        /* Allows up to 16M BIOSes. */
817 11076198 Jan Kiszka
        identity_base = 0xfeffc000;
818 11076198 Jan Kiszka
819 11076198 Jan Kiszka
        ret = kvm_vm_ioctl(s, KVM_SET_IDENTITY_MAP_ADDR, &identity_base);
820 11076198 Jan Kiszka
        if (ret < 0) {
821 11076198 Jan Kiszka
            return ret;
822 11076198 Jan Kiszka
        }
823 4c5b10b7 Jes Sorensen
    }
824 e56ff191 Jan Kiszka
825 11076198 Jan Kiszka
    /* Set TSS base one page after EPT identity map. */
826 11076198 Jan Kiszka
    ret = kvm_vm_ioctl(s, KVM_SET_TSS_ADDR, identity_base + 0x1000);
827 20420430 Sheng Yang
    if (ret < 0) {
828 20420430 Sheng Yang
        return ret;
829 20420430 Sheng Yang
    }
830 20420430 Sheng Yang
831 11076198 Jan Kiszka
    /* Tell fw_cfg to notify the BIOS to reserve the range. */
832 11076198 Jan Kiszka
    ret = e820_add_entry(identity_base, 0x4000, E820_RESERVED);
833 20420430 Sheng Yang
    if (ret < 0) {
834 11076198 Jan Kiszka
        fprintf(stderr, "e820_add_entry() table is full\n");
835 20420430 Sheng Yang
        return ret;
836 20420430 Sheng Yang
    }
837 3c85e74f Huang Ying
    qemu_register_reset(kvm_unpoison_all, NULL);
838 20420430 Sheng Yang
839 36ad0e94 Markus Armbruster
    shadow_mem = qemu_opt_get_size(qemu_get_machine_opts(),
840 36ad0e94 Markus Armbruster
                                   "kvm_shadow_mem", -1);
841 36ad0e94 Markus Armbruster
    if (shadow_mem != -1) {
842 36ad0e94 Markus Armbruster
        shadow_mem /= 4096;
843 36ad0e94 Markus Armbruster
        ret = kvm_vm_ioctl(s, KVM_SET_NR_MMU_PAGES, shadow_mem);
844 36ad0e94 Markus Armbruster
        if (ret < 0) {
845 36ad0e94 Markus Armbruster
            return ret;
846 39d6960a Jan Kiszka
        }
847 39d6960a Jan Kiszka
    }
848 11076198 Jan Kiszka
    return 0;
849 05330448 aliguori
}
850 b9bec74b Jan Kiszka
851 05330448 aliguori
static void set_v8086_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
852 05330448 aliguori
{
853 05330448 aliguori
    lhs->selector = rhs->selector;
854 05330448 aliguori
    lhs->base = rhs->base;
855 05330448 aliguori
    lhs->limit = rhs->limit;
856 05330448 aliguori
    lhs->type = 3;
857 05330448 aliguori
    lhs->present = 1;
858 05330448 aliguori
    lhs->dpl = 3;
859 05330448 aliguori
    lhs->db = 0;
860 05330448 aliguori
    lhs->s = 1;
861 05330448 aliguori
    lhs->l = 0;
862 05330448 aliguori
    lhs->g = 0;
863 05330448 aliguori
    lhs->avl = 0;
864 05330448 aliguori
    lhs->unusable = 0;
865 05330448 aliguori
}
866 05330448 aliguori
867 05330448 aliguori
static void set_seg(struct kvm_segment *lhs, const SegmentCache *rhs)
868 05330448 aliguori
{
869 05330448 aliguori
    unsigned flags = rhs->flags;
870 05330448 aliguori
    lhs->selector = rhs->selector;
871 05330448 aliguori
    lhs->base = rhs->base;
872 05330448 aliguori
    lhs->limit = rhs->limit;
873 05330448 aliguori
    lhs->type = (flags >> DESC_TYPE_SHIFT) & 15;
874 05330448 aliguori
    lhs->present = (flags & DESC_P_MASK) != 0;
875 acaa7550 Jan Kiszka
    lhs->dpl = (flags >> DESC_DPL_SHIFT) & 3;
876 05330448 aliguori
    lhs->db = (flags >> DESC_B_SHIFT) & 1;
877 05330448 aliguori
    lhs->s = (flags & DESC_S_MASK) != 0;
878 05330448 aliguori
    lhs->l = (flags >> DESC_L_SHIFT) & 1;
879 05330448 aliguori
    lhs->g = (flags & DESC_G_MASK) != 0;
880 05330448 aliguori
    lhs->avl = (flags & DESC_AVL_MASK) != 0;
881 05330448 aliguori
    lhs->unusable = 0;
882 7e680753 Michael S. Tsirkin
    lhs->padding = 0;
883 05330448 aliguori
}
884 05330448 aliguori
885 05330448 aliguori
static void get_seg(SegmentCache *lhs, const struct kvm_segment *rhs)
886 05330448 aliguori
{
887 05330448 aliguori
    lhs->selector = rhs->selector;
888 05330448 aliguori
    lhs->base = rhs->base;
889 05330448 aliguori
    lhs->limit = rhs->limit;
890 b9bec74b Jan Kiszka
    lhs->flags = (rhs->type << DESC_TYPE_SHIFT) |
891 b9bec74b Jan Kiszka
                 (rhs->present * DESC_P_MASK) |
892 b9bec74b Jan Kiszka
                 (rhs->dpl << DESC_DPL_SHIFT) |
893 b9bec74b Jan Kiszka
                 (rhs->db << DESC_B_SHIFT) |
894 b9bec74b Jan Kiszka
                 (rhs->s * DESC_S_MASK) |
895 b9bec74b Jan Kiszka
                 (rhs->l << DESC_L_SHIFT) |
896 b9bec74b Jan Kiszka
                 (rhs->g * DESC_G_MASK) |
897 b9bec74b Jan Kiszka
                 (rhs->avl * DESC_AVL_MASK);
898 05330448 aliguori
}
899 05330448 aliguori
900 05330448 aliguori
static void kvm_getput_reg(__u64 *kvm_reg, target_ulong *qemu_reg, int set)
901 05330448 aliguori
{
902 b9bec74b Jan Kiszka
    if (set) {
903 05330448 aliguori
        *kvm_reg = *qemu_reg;
904 b9bec74b Jan Kiszka
    } else {
905 05330448 aliguori
        *qemu_reg = *kvm_reg;
906 b9bec74b Jan Kiszka
    }
907 05330448 aliguori
}
908 05330448 aliguori
909 1bc22652 Andreas Fรคrber
static int kvm_getput_regs(X86CPU *cpu, int set)
910 05330448 aliguori
{
911 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
912 05330448 aliguori
    struct kvm_regs regs;
913 05330448 aliguori
    int ret = 0;
914 05330448 aliguori
915 05330448 aliguori
    if (!set) {
916 1bc22652 Andreas Fรคrber
        ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_REGS, &regs);
917 b9bec74b Jan Kiszka
        if (ret < 0) {
918 05330448 aliguori
            return ret;
919 b9bec74b Jan Kiszka
        }
920 05330448 aliguori
    }
921 05330448 aliguori
922 05330448 aliguori
    kvm_getput_reg(&regs.rax, &env->regs[R_EAX], set);
923 05330448 aliguori
    kvm_getput_reg(&regs.rbx, &env->regs[R_EBX], set);
924 05330448 aliguori
    kvm_getput_reg(&regs.rcx, &env->regs[R_ECX], set);
925 05330448 aliguori
    kvm_getput_reg(&regs.rdx, &env->regs[R_EDX], set);
926 05330448 aliguori
    kvm_getput_reg(&regs.rsi, &env->regs[R_ESI], set);
927 05330448 aliguori
    kvm_getput_reg(&regs.rdi, &env->regs[R_EDI], set);
928 05330448 aliguori
    kvm_getput_reg(&regs.rsp, &env->regs[R_ESP], set);
929 05330448 aliguori
    kvm_getput_reg(&regs.rbp, &env->regs[R_EBP], set);
930 05330448 aliguori
#ifdef TARGET_X86_64
931 05330448 aliguori
    kvm_getput_reg(&regs.r8, &env->regs[8], set);
932 05330448 aliguori
    kvm_getput_reg(&regs.r9, &env->regs[9], set);
933 05330448 aliguori
    kvm_getput_reg(&regs.r10, &env->regs[10], set);
934 05330448 aliguori
    kvm_getput_reg(&regs.r11, &env->regs[11], set);
935 05330448 aliguori
    kvm_getput_reg(&regs.r12, &env->regs[12], set);
936 05330448 aliguori
    kvm_getput_reg(&regs.r13, &env->regs[13], set);
937 05330448 aliguori
    kvm_getput_reg(&regs.r14, &env->regs[14], set);
938 05330448 aliguori
    kvm_getput_reg(&regs.r15, &env->regs[15], set);
939 05330448 aliguori
#endif
940 05330448 aliguori
941 05330448 aliguori
    kvm_getput_reg(&regs.rflags, &env->eflags, set);
942 05330448 aliguori
    kvm_getput_reg(&regs.rip, &env->eip, set);
943 05330448 aliguori
944 b9bec74b Jan Kiszka
    if (set) {
945 1bc22652 Andreas Fรคrber
        ret = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_REGS, &regs);
946 b9bec74b Jan Kiszka
    }
947 05330448 aliguori
948 05330448 aliguori
    return ret;
949 05330448 aliguori
}
950 05330448 aliguori
951 1bc22652 Andreas Fรคrber
static int kvm_put_fpu(X86CPU *cpu)
952 05330448 aliguori
{
953 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
954 05330448 aliguori
    struct kvm_fpu fpu;
955 05330448 aliguori
    int i;
956 05330448 aliguori
957 05330448 aliguori
    memset(&fpu, 0, sizeof fpu);
958 05330448 aliguori
    fpu.fsw = env->fpus & ~(7 << 11);
959 05330448 aliguori
    fpu.fsw |= (env->fpstt & 7) << 11;
960 05330448 aliguori
    fpu.fcw = env->fpuc;
961 42cc8fa6 Jan Kiszka
    fpu.last_opcode = env->fpop;
962 42cc8fa6 Jan Kiszka
    fpu.last_ip = env->fpip;
963 42cc8fa6 Jan Kiszka
    fpu.last_dp = env->fpdp;
964 b9bec74b Jan Kiszka
    for (i = 0; i < 8; ++i) {
965 b9bec74b Jan Kiszka
        fpu.ftwx |= (!env->fptags[i]) << i;
966 b9bec74b Jan Kiszka
    }
967 05330448 aliguori
    memcpy(fpu.fpr, env->fpregs, sizeof env->fpregs);
968 05330448 aliguori
    memcpy(fpu.xmm, env->xmm_regs, sizeof env->xmm_regs);
969 05330448 aliguori
    fpu.mxcsr = env->mxcsr;
970 05330448 aliguori
971 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_FPU, &fpu);
972 05330448 aliguori
}
973 05330448 aliguori
974 6b42494b Jan Kiszka
#define XSAVE_FCW_FSW     0
975 6b42494b Jan Kiszka
#define XSAVE_FTW_FOP     1
976 f1665b21 Sheng Yang
#define XSAVE_CWD_RIP     2
977 f1665b21 Sheng Yang
#define XSAVE_CWD_RDP     4
978 f1665b21 Sheng Yang
#define XSAVE_MXCSR       6
979 f1665b21 Sheng Yang
#define XSAVE_ST_SPACE    8
980 f1665b21 Sheng Yang
#define XSAVE_XMM_SPACE   40
981 f1665b21 Sheng Yang
#define XSAVE_XSTATE_BV   128
982 f1665b21 Sheng Yang
#define XSAVE_YMMH_SPACE  144
983 f1665b21 Sheng Yang
984 1bc22652 Andreas Fรคrber
static int kvm_put_xsave(X86CPU *cpu)
985 f1665b21 Sheng Yang
{
986 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
987 fabacc0f Jan Kiszka
    struct kvm_xsave* xsave = env->kvm_xsave_buf;
988 42cc8fa6 Jan Kiszka
    uint16_t cwd, swd, twd;
989 fabacc0f Jan Kiszka
    int i, r;
990 f1665b21 Sheng Yang
991 b9bec74b Jan Kiszka
    if (!kvm_has_xsave()) {
992 1bc22652 Andreas Fรคrber
        return kvm_put_fpu(cpu);
993 b9bec74b Jan Kiszka
    }
994 f1665b21 Sheng Yang
995 f1665b21 Sheng Yang
    memset(xsave, 0, sizeof(struct kvm_xsave));
996 6115c0a8 Blue Swirl
    twd = 0;
997 f1665b21 Sheng Yang
    swd = env->fpus & ~(7 << 11);
998 f1665b21 Sheng Yang
    swd |= (env->fpstt & 7) << 11;
999 f1665b21 Sheng Yang
    cwd = env->fpuc;
1000 b9bec74b Jan Kiszka
    for (i = 0; i < 8; ++i) {
1001 f1665b21 Sheng Yang
        twd |= (!env->fptags[i]) << i;
1002 b9bec74b Jan Kiszka
    }
1003 6b42494b Jan Kiszka
    xsave->region[XSAVE_FCW_FSW] = (uint32_t)(swd << 16) + cwd;
1004 6b42494b Jan Kiszka
    xsave->region[XSAVE_FTW_FOP] = (uint32_t)(env->fpop << 16) + twd;
1005 42cc8fa6 Jan Kiszka
    memcpy(&xsave->region[XSAVE_CWD_RIP], &env->fpip, sizeof(env->fpip));
1006 42cc8fa6 Jan Kiszka
    memcpy(&xsave->region[XSAVE_CWD_RDP], &env->fpdp, sizeof(env->fpdp));
1007 f1665b21 Sheng Yang
    memcpy(&xsave->region[XSAVE_ST_SPACE], env->fpregs,
1008 f1665b21 Sheng Yang
            sizeof env->fpregs);
1009 f1665b21 Sheng Yang
    memcpy(&xsave->region[XSAVE_XMM_SPACE], env->xmm_regs,
1010 f1665b21 Sheng Yang
            sizeof env->xmm_regs);
1011 f1665b21 Sheng Yang
    xsave->region[XSAVE_MXCSR] = env->mxcsr;
1012 f1665b21 Sheng Yang
    *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV] = env->xstate_bv;
1013 f1665b21 Sheng Yang
    memcpy(&xsave->region[XSAVE_YMMH_SPACE], env->ymmh_regs,
1014 f1665b21 Sheng Yang
            sizeof env->ymmh_regs);
1015 1bc22652 Andreas Fรคrber
    r = kvm_vcpu_ioctl(CPU(cpu), KVM_SET_XSAVE, xsave);
1016 0f53994f Marcelo Tosatti
    return r;
1017 f1665b21 Sheng Yang
}
1018 f1665b21 Sheng Yang
1019 1bc22652 Andreas Fรคrber
static int kvm_put_xcrs(X86CPU *cpu)
1020 f1665b21 Sheng Yang
{
1021 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1022 f1665b21 Sheng Yang
    struct kvm_xcrs xcrs;
1023 f1665b21 Sheng Yang
1024 b9bec74b Jan Kiszka
    if (!kvm_has_xcrs()) {
1025 f1665b21 Sheng Yang
        return 0;
1026 b9bec74b Jan Kiszka
    }
1027 f1665b21 Sheng Yang
1028 f1665b21 Sheng Yang
    xcrs.nr_xcrs = 1;
1029 f1665b21 Sheng Yang
    xcrs.flags = 0;
1030 f1665b21 Sheng Yang
    xcrs.xcrs[0].xcr = 0;
1031 f1665b21 Sheng Yang
    xcrs.xcrs[0].value = env->xcr0;
1032 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_XCRS, &xcrs);
1033 f1665b21 Sheng Yang
}
1034 f1665b21 Sheng Yang
1035 1bc22652 Andreas Fรคrber
static int kvm_put_sregs(X86CPU *cpu)
1036 05330448 aliguori
{
1037 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1038 05330448 aliguori
    struct kvm_sregs sregs;
1039 05330448 aliguori
1040 0e607a80 Jan Kiszka
    memset(sregs.interrupt_bitmap, 0, sizeof(sregs.interrupt_bitmap));
1041 0e607a80 Jan Kiszka
    if (env->interrupt_injected >= 0) {
1042 0e607a80 Jan Kiszka
        sregs.interrupt_bitmap[env->interrupt_injected / 64] |=
1043 0e607a80 Jan Kiszka
                (uint64_t)1 << (env->interrupt_injected % 64);
1044 0e607a80 Jan Kiszka
    }
1045 05330448 aliguori
1046 05330448 aliguori
    if ((env->eflags & VM_MASK)) {
1047 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.cs, &env->segs[R_CS]);
1048 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.ds, &env->segs[R_DS]);
1049 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.es, &env->segs[R_ES]);
1050 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.fs, &env->segs[R_FS]);
1051 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.gs, &env->segs[R_GS]);
1052 b9bec74b Jan Kiszka
        set_v8086_seg(&sregs.ss, &env->segs[R_SS]);
1053 05330448 aliguori
    } else {
1054 b9bec74b Jan Kiszka
        set_seg(&sregs.cs, &env->segs[R_CS]);
1055 b9bec74b Jan Kiszka
        set_seg(&sregs.ds, &env->segs[R_DS]);
1056 b9bec74b Jan Kiszka
        set_seg(&sregs.es, &env->segs[R_ES]);
1057 b9bec74b Jan Kiszka
        set_seg(&sregs.fs, &env->segs[R_FS]);
1058 b9bec74b Jan Kiszka
        set_seg(&sregs.gs, &env->segs[R_GS]);
1059 b9bec74b Jan Kiszka
        set_seg(&sregs.ss, &env->segs[R_SS]);
1060 05330448 aliguori
    }
1061 05330448 aliguori
1062 05330448 aliguori
    set_seg(&sregs.tr, &env->tr);
1063 05330448 aliguori
    set_seg(&sregs.ldt, &env->ldt);
1064 05330448 aliguori
1065 05330448 aliguori
    sregs.idt.limit = env->idt.limit;
1066 05330448 aliguori
    sregs.idt.base = env->idt.base;
1067 7e680753 Michael S. Tsirkin
    memset(sregs.idt.padding, 0, sizeof sregs.idt.padding);
1068 05330448 aliguori
    sregs.gdt.limit = env->gdt.limit;
1069 05330448 aliguori
    sregs.gdt.base = env->gdt.base;
1070 7e680753 Michael S. Tsirkin
    memset(sregs.gdt.padding, 0, sizeof sregs.gdt.padding);
1071 05330448 aliguori
1072 05330448 aliguori
    sregs.cr0 = env->cr[0];
1073 05330448 aliguori
    sregs.cr2 = env->cr[2];
1074 05330448 aliguori
    sregs.cr3 = env->cr[3];
1075 05330448 aliguori
    sregs.cr4 = env->cr[4];
1076 05330448 aliguori
1077 4a942cea Blue Swirl
    sregs.cr8 = cpu_get_apic_tpr(env->apic_state);
1078 4a942cea Blue Swirl
    sregs.apic_base = cpu_get_apic_base(env->apic_state);
1079 05330448 aliguori
1080 05330448 aliguori
    sregs.efer = env->efer;
1081 05330448 aliguori
1082 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_SREGS, &sregs);
1083 05330448 aliguori
}
1084 05330448 aliguori
1085 05330448 aliguori
static void kvm_msr_entry_set(struct kvm_msr_entry *entry,
1086 05330448 aliguori
                              uint32_t index, uint64_t value)
1087 05330448 aliguori
{
1088 05330448 aliguori
    entry->index = index;
1089 05330448 aliguori
    entry->data = value;
1090 05330448 aliguori
}
1091 05330448 aliguori
1092 7477cd38 Marcelo Tosatti
static int kvm_put_tscdeadline_msr(X86CPU *cpu)
1093 7477cd38 Marcelo Tosatti
{
1094 7477cd38 Marcelo Tosatti
    CPUX86State *env = &cpu->env;
1095 7477cd38 Marcelo Tosatti
    struct {
1096 7477cd38 Marcelo Tosatti
        struct kvm_msrs info;
1097 7477cd38 Marcelo Tosatti
        struct kvm_msr_entry entries[1];
1098 7477cd38 Marcelo Tosatti
    } msr_data;
1099 7477cd38 Marcelo Tosatti
    struct kvm_msr_entry *msrs = msr_data.entries;
1100 7477cd38 Marcelo Tosatti
1101 7477cd38 Marcelo Tosatti
    if (!has_msr_tsc_deadline) {
1102 7477cd38 Marcelo Tosatti
        return 0;
1103 7477cd38 Marcelo Tosatti
    }
1104 7477cd38 Marcelo Tosatti
1105 7477cd38 Marcelo Tosatti
    kvm_msr_entry_set(&msrs[0], MSR_IA32_TSCDEADLINE, env->tsc_deadline);
1106 7477cd38 Marcelo Tosatti
1107 7477cd38 Marcelo Tosatti
    msr_data.info.nmsrs = 1;
1108 7477cd38 Marcelo Tosatti
1109 7477cd38 Marcelo Tosatti
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MSRS, &msr_data);
1110 7477cd38 Marcelo Tosatti
}
1111 7477cd38 Marcelo Tosatti
1112 1bc22652 Andreas Fรคrber
static int kvm_put_msrs(X86CPU *cpu, int level)
1113 05330448 aliguori
{
1114 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1115 05330448 aliguori
    struct {
1116 05330448 aliguori
        struct kvm_msrs info;
1117 05330448 aliguori
        struct kvm_msr_entry entries[100];
1118 05330448 aliguori
    } msr_data;
1119 05330448 aliguori
    struct kvm_msr_entry *msrs = msr_data.entries;
1120 0d894367 Paolo Bonzini
    int n = 0, i;
1121 05330448 aliguori
1122 05330448 aliguori
    kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_CS, env->sysenter_cs);
1123 05330448 aliguori
    kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_ESP, env->sysenter_esp);
1124 05330448 aliguori
    kvm_msr_entry_set(&msrs[n++], MSR_IA32_SYSENTER_EIP, env->sysenter_eip);
1125 0c03266a Jan Kiszka
    kvm_msr_entry_set(&msrs[n++], MSR_PAT, env->pat);
1126 c3a3a7d3 Jan Kiszka
    if (has_msr_star) {
1127 b9bec74b Jan Kiszka
        kvm_msr_entry_set(&msrs[n++], MSR_STAR, env->star);
1128 b9bec74b Jan Kiszka
    }
1129 c3a3a7d3 Jan Kiszka
    if (has_msr_hsave_pa) {
1130 75b10c43 Marcelo Tosatti
        kvm_msr_entry_set(&msrs[n++], MSR_VM_HSAVE_PA, env->vm_hsave);
1131 b9bec74b Jan Kiszka
    }
1132 f28558d3 Will Auld
    if (has_msr_tsc_adjust) {
1133 f28558d3 Will Auld
        kvm_msr_entry_set(&msrs[n++], MSR_TSC_ADJUST, env->tsc_adjust);
1134 f28558d3 Will Auld
    }
1135 21e87c46 Avi Kivity
    if (has_msr_misc_enable) {
1136 21e87c46 Avi Kivity
        kvm_msr_entry_set(&msrs[n++], MSR_IA32_MISC_ENABLE,
1137 21e87c46 Avi Kivity
                          env->msr_ia32_misc_enable);
1138 21e87c46 Avi Kivity
    }
1139 05330448 aliguori
#ifdef TARGET_X86_64
1140 25d2e361 Marcelo Tosatti
    if (lm_capable_kernel) {
1141 25d2e361 Marcelo Tosatti
        kvm_msr_entry_set(&msrs[n++], MSR_CSTAR, env->cstar);
1142 25d2e361 Marcelo Tosatti
        kvm_msr_entry_set(&msrs[n++], MSR_KERNELGSBASE, env->kernelgsbase);
1143 25d2e361 Marcelo Tosatti
        kvm_msr_entry_set(&msrs[n++], MSR_FMASK, env->fmask);
1144 25d2e361 Marcelo Tosatti
        kvm_msr_entry_set(&msrs[n++], MSR_LSTAR, env->lstar);
1145 25d2e361 Marcelo Tosatti
    }
1146 05330448 aliguori
#endif
1147 ea643051 Jan Kiszka
    if (level == KVM_PUT_FULL_STATE) {
1148 384331a6 Marcelo Tosatti
        /*
1149 384331a6 Marcelo Tosatti
         * KVM is yet unable to synchronize TSC values of multiple VCPUs on
1150 384331a6 Marcelo Tosatti
         * writeback. Until this is fixed, we only write the offset to SMP
1151 384331a6 Marcelo Tosatti
         * guests after migration, desynchronizing the VCPUs, but avoiding
1152 384331a6 Marcelo Tosatti
         * huge jump-backs that would occur without any writeback at all.
1153 384331a6 Marcelo Tosatti
         */
1154 384331a6 Marcelo Tosatti
        if (smp_cpus == 1 || env->tsc != 0) {
1155 384331a6 Marcelo Tosatti
            kvm_msr_entry_set(&msrs[n++], MSR_IA32_TSC, env->tsc);
1156 384331a6 Marcelo Tosatti
        }
1157 ff5c186b Jan Kiszka
    }
1158 ff5c186b Jan Kiszka
    /*
1159 0d894367 Paolo Bonzini
     * The following MSRs have side effects on the guest or are too heavy
1160 0d894367 Paolo Bonzini
     * for normal writeback. Limit them to reset or full state updates.
1161 ff5c186b Jan Kiszka
     */
1162 ff5c186b Jan Kiszka
    if (level >= KVM_PUT_RESET_STATE) {
1163 ea643051 Jan Kiszka
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_SYSTEM_TIME,
1164 ea643051 Jan Kiszka
                          env->system_time_msr);
1165 ea643051 Jan Kiszka
        kvm_msr_entry_set(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_msr);
1166 c5999bfc Jan Kiszka
        if (has_msr_async_pf_en) {
1167 c5999bfc Jan Kiszka
            kvm_msr_entry_set(&msrs[n++], MSR_KVM_ASYNC_PF_EN,
1168 c5999bfc Jan Kiszka
                              env->async_pf_en_msr);
1169 c5999bfc Jan Kiszka
        }
1170 bc9a839d Michael S. Tsirkin
        if (has_msr_pv_eoi_en) {
1171 bc9a839d Michael S. Tsirkin
            kvm_msr_entry_set(&msrs[n++], MSR_KVM_PV_EOI_EN,
1172 bc9a839d Michael S. Tsirkin
                              env->pv_eoi_en_msr);
1173 bc9a839d Michael S. Tsirkin
        }
1174 917367aa Marcelo Tosatti
        if (has_msr_kvm_steal_time) {
1175 917367aa Marcelo Tosatti
            kvm_msr_entry_set(&msrs[n++], MSR_KVM_STEAL_TIME,
1176 917367aa Marcelo Tosatti
                              env->steal_time_msr);
1177 917367aa Marcelo Tosatti
        }
1178 0d894367 Paolo Bonzini
        if (has_msr_architectural_pmu) {
1179 0d894367 Paolo Bonzini
            /* Stop the counter.  */
1180 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_FIXED_CTR_CTRL, 0);
1181 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_CTRL, 0);
1182 0d894367 Paolo Bonzini
1183 0d894367 Paolo Bonzini
            /* Set the counter values.  */
1184 0d894367 Paolo Bonzini
            for (i = 0; i < MAX_FIXED_COUNTERS; i++) {
1185 0d894367 Paolo Bonzini
                kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_FIXED_CTR0 + i,
1186 0d894367 Paolo Bonzini
                                  env->msr_fixed_counters[i]);
1187 0d894367 Paolo Bonzini
            }
1188 0d894367 Paolo Bonzini
            for (i = 0; i < num_architectural_pmu_counters; i++) {
1189 0d894367 Paolo Bonzini
                kvm_msr_entry_set(&msrs[n++], MSR_P6_PERFCTR0 + i,
1190 0d894367 Paolo Bonzini
                                  env->msr_gp_counters[i]);
1191 0d894367 Paolo Bonzini
                kvm_msr_entry_set(&msrs[n++], MSR_P6_EVNTSEL0 + i,
1192 0d894367 Paolo Bonzini
                                  env->msr_gp_evtsel[i]);
1193 0d894367 Paolo Bonzini
            }
1194 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_STATUS,
1195 0d894367 Paolo Bonzini
                              env->msr_global_status);
1196 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_OVF_CTRL,
1197 0d894367 Paolo Bonzini
                              env->msr_global_ovf_ctrl);
1198 0d894367 Paolo Bonzini
1199 0d894367 Paolo Bonzini
            /* Now start the PMU.  */
1200 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_FIXED_CTR_CTRL,
1201 0d894367 Paolo Bonzini
                              env->msr_fixed_ctr_ctrl);
1202 0d894367 Paolo Bonzini
            kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_CTRL,
1203 0d894367 Paolo Bonzini
                              env->msr_global_ctrl);
1204 0d894367 Paolo Bonzini
        }
1205 92067bf4 Igor Mammedov
        if (hyperv_hypercall_available(cpu)) {
1206 eab70139 Vadim Rozenfeld
            kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_GUEST_OS_ID, 0);
1207 eab70139 Vadim Rozenfeld
            kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_HYPERCALL, 0);
1208 eab70139 Vadim Rozenfeld
        }
1209 92067bf4 Igor Mammedov
        if (cpu->hyperv_vapic) {
1210 eab70139 Vadim Rozenfeld
            kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_APIC_ASSIST_PAGE, 0);
1211 eab70139 Vadim Rozenfeld
        }
1212 df67696e Liu Jinsong
        if (has_msr_feature_control) {
1213 df67696e Liu Jinsong
            kvm_msr_entry_set(&msrs[n++], MSR_IA32_FEATURE_CONTROL,
1214 df67696e Liu Jinsong
                              env->msr_ia32_feature_control);
1215 df67696e Liu Jinsong
        }
1216 ea643051 Jan Kiszka
    }
1217 57780495 Marcelo Tosatti
    if (env->mcg_cap) {
1218 d8da8574 Hidetoshi Seto
        int i;
1219 b9bec74b Jan Kiszka
1220 c34d440a Jan Kiszka
        kvm_msr_entry_set(&msrs[n++], MSR_MCG_STATUS, env->mcg_status);
1221 c34d440a Jan Kiszka
        kvm_msr_entry_set(&msrs[n++], MSR_MCG_CTL, env->mcg_ctl);
1222 c34d440a Jan Kiszka
        for (i = 0; i < (env->mcg_cap & 0xff) * 4; i++) {
1223 c34d440a Jan Kiszka
            kvm_msr_entry_set(&msrs[n++], MSR_MC0_CTL + i, env->mce_banks[i]);
1224 57780495 Marcelo Tosatti
        }
1225 57780495 Marcelo Tosatti
    }
1226 1a03675d Glauber Costa
1227 05330448 aliguori
    msr_data.info.nmsrs = n;
1228 05330448 aliguori
1229 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MSRS, &msr_data);
1230 05330448 aliguori
1231 05330448 aliguori
}
1232 05330448 aliguori
1233 05330448 aliguori
1234 1bc22652 Andreas Fรคrber
static int kvm_get_fpu(X86CPU *cpu)
1235 05330448 aliguori
{
1236 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1237 05330448 aliguori
    struct kvm_fpu fpu;
1238 05330448 aliguori
    int i, ret;
1239 05330448 aliguori
1240 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_FPU, &fpu);
1241 b9bec74b Jan Kiszka
    if (ret < 0) {
1242 05330448 aliguori
        return ret;
1243 b9bec74b Jan Kiszka
    }
1244 05330448 aliguori
1245 05330448 aliguori
    env->fpstt = (fpu.fsw >> 11) & 7;
1246 05330448 aliguori
    env->fpus = fpu.fsw;
1247 05330448 aliguori
    env->fpuc = fpu.fcw;
1248 42cc8fa6 Jan Kiszka
    env->fpop = fpu.last_opcode;
1249 42cc8fa6 Jan Kiszka
    env->fpip = fpu.last_ip;
1250 42cc8fa6 Jan Kiszka
    env->fpdp = fpu.last_dp;
1251 b9bec74b Jan Kiszka
    for (i = 0; i < 8; ++i) {
1252 b9bec74b Jan Kiszka
        env->fptags[i] = !((fpu.ftwx >> i) & 1);
1253 b9bec74b Jan Kiszka
    }
1254 05330448 aliguori
    memcpy(env->fpregs, fpu.fpr, sizeof env->fpregs);
1255 05330448 aliguori
    memcpy(env->xmm_regs, fpu.xmm, sizeof env->xmm_regs);
1256 05330448 aliguori
    env->mxcsr = fpu.mxcsr;
1257 05330448 aliguori
1258 05330448 aliguori
    return 0;
1259 05330448 aliguori
}
1260 05330448 aliguori
1261 1bc22652 Andreas Fรคrber
static int kvm_get_xsave(X86CPU *cpu)
1262 f1665b21 Sheng Yang
{
1263 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1264 fabacc0f Jan Kiszka
    struct kvm_xsave* xsave = env->kvm_xsave_buf;
1265 f1665b21 Sheng Yang
    int ret, i;
1266 42cc8fa6 Jan Kiszka
    uint16_t cwd, swd, twd;
1267 f1665b21 Sheng Yang
1268 b9bec74b Jan Kiszka
    if (!kvm_has_xsave()) {
1269 1bc22652 Andreas Fรคrber
        return kvm_get_fpu(cpu);
1270 b9bec74b Jan Kiszka
    }
1271 f1665b21 Sheng Yang
1272 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_XSAVE, xsave);
1273 0f53994f Marcelo Tosatti
    if (ret < 0) {
1274 f1665b21 Sheng Yang
        return ret;
1275 0f53994f Marcelo Tosatti
    }
1276 f1665b21 Sheng Yang
1277 6b42494b Jan Kiszka
    cwd = (uint16_t)xsave->region[XSAVE_FCW_FSW];
1278 6b42494b Jan Kiszka
    swd = (uint16_t)(xsave->region[XSAVE_FCW_FSW] >> 16);
1279 6b42494b Jan Kiszka
    twd = (uint16_t)xsave->region[XSAVE_FTW_FOP];
1280 6b42494b Jan Kiszka
    env->fpop = (uint16_t)(xsave->region[XSAVE_FTW_FOP] >> 16);
1281 f1665b21 Sheng Yang
    env->fpstt = (swd >> 11) & 7;
1282 f1665b21 Sheng Yang
    env->fpus = swd;
1283 f1665b21 Sheng Yang
    env->fpuc = cwd;
1284 b9bec74b Jan Kiszka
    for (i = 0; i < 8; ++i) {
1285 f1665b21 Sheng Yang
        env->fptags[i] = !((twd >> i) & 1);
1286 b9bec74b Jan Kiszka
    }
1287 42cc8fa6 Jan Kiszka
    memcpy(&env->fpip, &xsave->region[XSAVE_CWD_RIP], sizeof(env->fpip));
1288 42cc8fa6 Jan Kiszka
    memcpy(&env->fpdp, &xsave->region[XSAVE_CWD_RDP], sizeof(env->fpdp));
1289 f1665b21 Sheng Yang
    env->mxcsr = xsave->region[XSAVE_MXCSR];
1290 f1665b21 Sheng Yang
    memcpy(env->fpregs, &xsave->region[XSAVE_ST_SPACE],
1291 f1665b21 Sheng Yang
            sizeof env->fpregs);
1292 f1665b21 Sheng Yang
    memcpy(env->xmm_regs, &xsave->region[XSAVE_XMM_SPACE],
1293 f1665b21 Sheng Yang
            sizeof env->xmm_regs);
1294 f1665b21 Sheng Yang
    env->xstate_bv = *(uint64_t *)&xsave->region[XSAVE_XSTATE_BV];
1295 f1665b21 Sheng Yang
    memcpy(env->ymmh_regs, &xsave->region[XSAVE_YMMH_SPACE],
1296 f1665b21 Sheng Yang
            sizeof env->ymmh_regs);
1297 f1665b21 Sheng Yang
    return 0;
1298 f1665b21 Sheng Yang
}
1299 f1665b21 Sheng Yang
1300 1bc22652 Andreas Fรคrber
static int kvm_get_xcrs(X86CPU *cpu)
1301 f1665b21 Sheng Yang
{
1302 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1303 f1665b21 Sheng Yang
    int i, ret;
1304 f1665b21 Sheng Yang
    struct kvm_xcrs xcrs;
1305 f1665b21 Sheng Yang
1306 b9bec74b Jan Kiszka
    if (!kvm_has_xcrs()) {
1307 f1665b21 Sheng Yang
        return 0;
1308 b9bec74b Jan Kiszka
    }
1309 f1665b21 Sheng Yang
1310 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_XCRS, &xcrs);
1311 b9bec74b Jan Kiszka
    if (ret < 0) {
1312 f1665b21 Sheng Yang
        return ret;
1313 b9bec74b Jan Kiszka
    }
1314 f1665b21 Sheng Yang
1315 b9bec74b Jan Kiszka
    for (i = 0; i < xcrs.nr_xcrs; i++) {
1316 f1665b21 Sheng Yang
        /* Only support xcr0 now */
1317 0fd53fec Paolo Bonzini
        if (xcrs.xcrs[i].xcr == 0) {
1318 0fd53fec Paolo Bonzini
            env->xcr0 = xcrs.xcrs[i].value;
1319 f1665b21 Sheng Yang
            break;
1320 f1665b21 Sheng Yang
        }
1321 b9bec74b Jan Kiszka
    }
1322 f1665b21 Sheng Yang
    return 0;
1323 f1665b21 Sheng Yang
}
1324 f1665b21 Sheng Yang
1325 1bc22652 Andreas Fรคrber
static int kvm_get_sregs(X86CPU *cpu)
1326 05330448 aliguori
{
1327 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1328 05330448 aliguori
    struct kvm_sregs sregs;
1329 05330448 aliguori
    uint32_t hflags;
1330 0e607a80 Jan Kiszka
    int bit, i, ret;
1331 05330448 aliguori
1332 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_SREGS, &sregs);
1333 b9bec74b Jan Kiszka
    if (ret < 0) {
1334 05330448 aliguori
        return ret;
1335 b9bec74b Jan Kiszka
    }
1336 05330448 aliguori
1337 0e607a80 Jan Kiszka
    /* There can only be one pending IRQ set in the bitmap at a time, so try
1338 0e607a80 Jan Kiszka
       to find it and save its number instead (-1 for none). */
1339 0e607a80 Jan Kiszka
    env->interrupt_injected = -1;
1340 0e607a80 Jan Kiszka
    for (i = 0; i < ARRAY_SIZE(sregs.interrupt_bitmap); i++) {
1341 0e607a80 Jan Kiszka
        if (sregs.interrupt_bitmap[i]) {
1342 0e607a80 Jan Kiszka
            bit = ctz64(sregs.interrupt_bitmap[i]);
1343 0e607a80 Jan Kiszka
            env->interrupt_injected = i * 64 + bit;
1344 0e607a80 Jan Kiszka
            break;
1345 0e607a80 Jan Kiszka
        }
1346 0e607a80 Jan Kiszka
    }
1347 05330448 aliguori
1348 05330448 aliguori
    get_seg(&env->segs[R_CS], &sregs.cs);
1349 05330448 aliguori
    get_seg(&env->segs[R_DS], &sregs.ds);
1350 05330448 aliguori
    get_seg(&env->segs[R_ES], &sregs.es);
1351 05330448 aliguori
    get_seg(&env->segs[R_FS], &sregs.fs);
1352 05330448 aliguori
    get_seg(&env->segs[R_GS], &sregs.gs);
1353 05330448 aliguori
    get_seg(&env->segs[R_SS], &sregs.ss);
1354 05330448 aliguori
1355 05330448 aliguori
    get_seg(&env->tr, &sregs.tr);
1356 05330448 aliguori
    get_seg(&env->ldt, &sregs.ldt);
1357 05330448 aliguori
1358 05330448 aliguori
    env->idt.limit = sregs.idt.limit;
1359 05330448 aliguori
    env->idt.base = sregs.idt.base;
1360 05330448 aliguori
    env->gdt.limit = sregs.gdt.limit;
1361 05330448 aliguori
    env->gdt.base = sregs.gdt.base;
1362 05330448 aliguori
1363 05330448 aliguori
    env->cr[0] = sregs.cr0;
1364 05330448 aliguori
    env->cr[2] = sregs.cr2;
1365 05330448 aliguori
    env->cr[3] = sregs.cr3;
1366 05330448 aliguori
    env->cr[4] = sregs.cr4;
1367 05330448 aliguori
1368 05330448 aliguori
    env->efer = sregs.efer;
1369 cce47516 Jan Kiszka
1370 cce47516 Jan Kiszka
    /* changes to apic base and cr8/tpr are read back via kvm_arch_post_run */
1371 05330448 aliguori
1372 b9bec74b Jan Kiszka
#define HFLAG_COPY_MASK \
1373 b9bec74b Jan Kiszka
    ~( HF_CPL_MASK | HF_PE_MASK | HF_MP_MASK | HF_EM_MASK | \
1374 b9bec74b Jan Kiszka
       HF_TS_MASK | HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK | \
1375 b9bec74b Jan Kiszka
       HF_OSFXSR_MASK | HF_LMA_MASK | HF_CS32_MASK | \
1376 b9bec74b Jan Kiszka
       HF_SS32_MASK | HF_CS64_MASK | HF_ADDSEG_MASK)
1377 05330448 aliguori
1378 05330448 aliguori
    hflags = (env->segs[R_CS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK;
1379 05330448 aliguori
    hflags |= (env->cr[0] & CR0_PE_MASK) << (HF_PE_SHIFT - CR0_PE_SHIFT);
1380 05330448 aliguori
    hflags |= (env->cr[0] << (HF_MP_SHIFT - CR0_MP_SHIFT)) &
1381 b9bec74b Jan Kiszka
                (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK);
1382 05330448 aliguori
    hflags |= (env->eflags & (HF_TF_MASK | HF_VM_MASK | HF_IOPL_MASK));
1383 05330448 aliguori
    hflags |= (env->cr[4] & CR4_OSFXSR_MASK) <<
1384 b9bec74b Jan Kiszka
                (HF_OSFXSR_SHIFT - CR4_OSFXSR_SHIFT);
1385 05330448 aliguori
1386 05330448 aliguori
    if (env->efer & MSR_EFER_LMA) {
1387 05330448 aliguori
        hflags |= HF_LMA_MASK;
1388 05330448 aliguori
    }
1389 05330448 aliguori
1390 05330448 aliguori
    if ((hflags & HF_LMA_MASK) && (env->segs[R_CS].flags & DESC_L_MASK)) {
1391 05330448 aliguori
        hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
1392 05330448 aliguori
    } else {
1393 05330448 aliguori
        hflags |= (env->segs[R_CS].flags & DESC_B_MASK) >>
1394 b9bec74b Jan Kiszka
                    (DESC_B_SHIFT - HF_CS32_SHIFT);
1395 05330448 aliguori
        hflags |= (env->segs[R_SS].flags & DESC_B_MASK) >>
1396 b9bec74b Jan Kiszka
                    (DESC_B_SHIFT - HF_SS32_SHIFT);
1397 b9bec74b Jan Kiszka
        if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK) ||
1398 b9bec74b Jan Kiszka
            !(hflags & HF_CS32_MASK)) {
1399 b9bec74b Jan Kiszka
            hflags |= HF_ADDSEG_MASK;
1400 b9bec74b Jan Kiszka
        } else {
1401 b9bec74b Jan Kiszka
            hflags |= ((env->segs[R_DS].base | env->segs[R_ES].base |
1402 b9bec74b Jan Kiszka
                        env->segs[R_SS].base) != 0) << HF_ADDSEG_SHIFT;
1403 b9bec74b Jan Kiszka
        }
1404 05330448 aliguori
    }
1405 05330448 aliguori
    env->hflags = (env->hflags & HFLAG_COPY_MASK) | hflags;
1406 05330448 aliguori
1407 05330448 aliguori
    return 0;
1408 05330448 aliguori
}
1409 05330448 aliguori
1410 1bc22652 Andreas Fรคrber
static int kvm_get_msrs(X86CPU *cpu)
1411 05330448 aliguori
{
1412 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1413 05330448 aliguori
    struct {
1414 05330448 aliguori
        struct kvm_msrs info;
1415 05330448 aliguori
        struct kvm_msr_entry entries[100];
1416 05330448 aliguori
    } msr_data;
1417 05330448 aliguori
    struct kvm_msr_entry *msrs = msr_data.entries;
1418 05330448 aliguori
    int ret, i, n;
1419 05330448 aliguori
1420 05330448 aliguori
    n = 0;
1421 05330448 aliguori
    msrs[n++].index = MSR_IA32_SYSENTER_CS;
1422 05330448 aliguori
    msrs[n++].index = MSR_IA32_SYSENTER_ESP;
1423 05330448 aliguori
    msrs[n++].index = MSR_IA32_SYSENTER_EIP;
1424 0c03266a Jan Kiszka
    msrs[n++].index = MSR_PAT;
1425 c3a3a7d3 Jan Kiszka
    if (has_msr_star) {
1426 b9bec74b Jan Kiszka
        msrs[n++].index = MSR_STAR;
1427 b9bec74b Jan Kiszka
    }
1428 c3a3a7d3 Jan Kiszka
    if (has_msr_hsave_pa) {
1429 75b10c43 Marcelo Tosatti
        msrs[n++].index = MSR_VM_HSAVE_PA;
1430 b9bec74b Jan Kiszka
    }
1431 f28558d3 Will Auld
    if (has_msr_tsc_adjust) {
1432 f28558d3 Will Auld
        msrs[n++].index = MSR_TSC_ADJUST;
1433 f28558d3 Will Auld
    }
1434 aa82ba54 Liu, Jinsong
    if (has_msr_tsc_deadline) {
1435 aa82ba54 Liu, Jinsong
        msrs[n++].index = MSR_IA32_TSCDEADLINE;
1436 aa82ba54 Liu, Jinsong
    }
1437 21e87c46 Avi Kivity
    if (has_msr_misc_enable) {
1438 21e87c46 Avi Kivity
        msrs[n++].index = MSR_IA32_MISC_ENABLE;
1439 21e87c46 Avi Kivity
    }
1440 df67696e Liu Jinsong
    if (has_msr_feature_control) {
1441 df67696e Liu Jinsong
        msrs[n++].index = MSR_IA32_FEATURE_CONTROL;
1442 df67696e Liu Jinsong
    }
1443 b8cc45d6 Glauber Costa
1444 b8cc45d6 Glauber Costa
    if (!env->tsc_valid) {
1445 b8cc45d6 Glauber Costa
        msrs[n++].index = MSR_IA32_TSC;
1446 1354869c Luiz Capitulino
        env->tsc_valid = !runstate_is_running();
1447 b8cc45d6 Glauber Costa
    }
1448 b8cc45d6 Glauber Costa
1449 05330448 aliguori
#ifdef TARGET_X86_64
1450 25d2e361 Marcelo Tosatti
    if (lm_capable_kernel) {
1451 25d2e361 Marcelo Tosatti
        msrs[n++].index = MSR_CSTAR;
1452 25d2e361 Marcelo Tosatti
        msrs[n++].index = MSR_KERNELGSBASE;
1453 25d2e361 Marcelo Tosatti
        msrs[n++].index = MSR_FMASK;
1454 25d2e361 Marcelo Tosatti
        msrs[n++].index = MSR_LSTAR;
1455 25d2e361 Marcelo Tosatti
    }
1456 05330448 aliguori
#endif
1457 1a03675d Glauber Costa
    msrs[n++].index = MSR_KVM_SYSTEM_TIME;
1458 1a03675d Glauber Costa
    msrs[n++].index = MSR_KVM_WALL_CLOCK;
1459 c5999bfc Jan Kiszka
    if (has_msr_async_pf_en) {
1460 c5999bfc Jan Kiszka
        msrs[n++].index = MSR_KVM_ASYNC_PF_EN;
1461 c5999bfc Jan Kiszka
    }
1462 bc9a839d Michael S. Tsirkin
    if (has_msr_pv_eoi_en) {
1463 bc9a839d Michael S. Tsirkin
        msrs[n++].index = MSR_KVM_PV_EOI_EN;
1464 bc9a839d Michael S. Tsirkin
    }
1465 917367aa Marcelo Tosatti
    if (has_msr_kvm_steal_time) {
1466 917367aa Marcelo Tosatti
        msrs[n++].index = MSR_KVM_STEAL_TIME;
1467 917367aa Marcelo Tosatti
    }
1468 0d894367 Paolo Bonzini
    if (has_msr_architectural_pmu) {
1469 0d894367 Paolo Bonzini
        msrs[n++].index = MSR_CORE_PERF_FIXED_CTR_CTRL;
1470 0d894367 Paolo Bonzini
        msrs[n++].index = MSR_CORE_PERF_GLOBAL_CTRL;
1471 0d894367 Paolo Bonzini
        msrs[n++].index = MSR_CORE_PERF_GLOBAL_STATUS;
1472 0d894367 Paolo Bonzini
        msrs[n++].index = MSR_CORE_PERF_GLOBAL_OVF_CTRL;
1473 0d894367 Paolo Bonzini
        for (i = 0; i < MAX_FIXED_COUNTERS; i++) {
1474 0d894367 Paolo Bonzini
            msrs[n++].index = MSR_CORE_PERF_FIXED_CTR0 + i;
1475 0d894367 Paolo Bonzini
        }
1476 0d894367 Paolo Bonzini
        for (i = 0; i < num_architectural_pmu_counters; i++) {
1477 0d894367 Paolo Bonzini
            msrs[n++].index = MSR_P6_PERFCTR0 + i;
1478 0d894367 Paolo Bonzini
            msrs[n++].index = MSR_P6_EVNTSEL0 + i;
1479 0d894367 Paolo Bonzini
        }
1480 0d894367 Paolo Bonzini
    }
1481 1a03675d Glauber Costa
1482 57780495 Marcelo Tosatti
    if (env->mcg_cap) {
1483 57780495 Marcelo Tosatti
        msrs[n++].index = MSR_MCG_STATUS;
1484 57780495 Marcelo Tosatti
        msrs[n++].index = MSR_MCG_CTL;
1485 b9bec74b Jan Kiszka
        for (i = 0; i < (env->mcg_cap & 0xff) * 4; i++) {
1486 57780495 Marcelo Tosatti
            msrs[n++].index = MSR_MC0_CTL + i;
1487 b9bec74b Jan Kiszka
        }
1488 57780495 Marcelo Tosatti
    }
1489 57780495 Marcelo Tosatti
1490 05330448 aliguori
    msr_data.info.nmsrs = n;
1491 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_MSRS, &msr_data);
1492 b9bec74b Jan Kiszka
    if (ret < 0) {
1493 05330448 aliguori
        return ret;
1494 b9bec74b Jan Kiszka
    }
1495 05330448 aliguori
1496 05330448 aliguori
    for (i = 0; i < ret; i++) {
1497 0d894367 Paolo Bonzini
        uint32_t index = msrs[i].index;
1498 0d894367 Paolo Bonzini
        switch (index) {
1499 05330448 aliguori
        case MSR_IA32_SYSENTER_CS:
1500 05330448 aliguori
            env->sysenter_cs = msrs[i].data;
1501 05330448 aliguori
            break;
1502 05330448 aliguori
        case MSR_IA32_SYSENTER_ESP:
1503 05330448 aliguori
            env->sysenter_esp = msrs[i].data;
1504 05330448 aliguori
            break;
1505 05330448 aliguori
        case MSR_IA32_SYSENTER_EIP:
1506 05330448 aliguori
            env->sysenter_eip = msrs[i].data;
1507 05330448 aliguori
            break;
1508 0c03266a Jan Kiszka
        case MSR_PAT:
1509 0c03266a Jan Kiszka
            env->pat = msrs[i].data;
1510 0c03266a Jan Kiszka
            break;
1511 05330448 aliguori
        case MSR_STAR:
1512 05330448 aliguori
            env->star = msrs[i].data;
1513 05330448 aliguori
            break;
1514 05330448 aliguori
#ifdef TARGET_X86_64
1515 05330448 aliguori
        case MSR_CSTAR:
1516 05330448 aliguori
            env->cstar = msrs[i].data;
1517 05330448 aliguori
            break;
1518 05330448 aliguori
        case MSR_KERNELGSBASE:
1519 05330448 aliguori
            env->kernelgsbase = msrs[i].data;
1520 05330448 aliguori
            break;
1521 05330448 aliguori
        case MSR_FMASK:
1522 05330448 aliguori
            env->fmask = msrs[i].data;
1523 05330448 aliguori
            break;
1524 05330448 aliguori
        case MSR_LSTAR:
1525 05330448 aliguori
            env->lstar = msrs[i].data;
1526 05330448 aliguori
            break;
1527 05330448 aliguori
#endif
1528 05330448 aliguori
        case MSR_IA32_TSC:
1529 05330448 aliguori
            env->tsc = msrs[i].data;
1530 05330448 aliguori
            break;
1531 f28558d3 Will Auld
        case MSR_TSC_ADJUST:
1532 f28558d3 Will Auld
            env->tsc_adjust = msrs[i].data;
1533 f28558d3 Will Auld
            break;
1534 aa82ba54 Liu, Jinsong
        case MSR_IA32_TSCDEADLINE:
1535 aa82ba54 Liu, Jinsong
            env->tsc_deadline = msrs[i].data;
1536 aa82ba54 Liu, Jinsong
            break;
1537 aa851e36 Marcelo Tosatti
        case MSR_VM_HSAVE_PA:
1538 aa851e36 Marcelo Tosatti
            env->vm_hsave = msrs[i].data;
1539 aa851e36 Marcelo Tosatti
            break;
1540 1a03675d Glauber Costa
        case MSR_KVM_SYSTEM_TIME:
1541 1a03675d Glauber Costa
            env->system_time_msr = msrs[i].data;
1542 1a03675d Glauber Costa
            break;
1543 1a03675d Glauber Costa
        case MSR_KVM_WALL_CLOCK:
1544 1a03675d Glauber Costa
            env->wall_clock_msr = msrs[i].data;
1545 1a03675d Glauber Costa
            break;
1546 57780495 Marcelo Tosatti
        case MSR_MCG_STATUS:
1547 57780495 Marcelo Tosatti
            env->mcg_status = msrs[i].data;
1548 57780495 Marcelo Tosatti
            break;
1549 57780495 Marcelo Tosatti
        case MSR_MCG_CTL:
1550 57780495 Marcelo Tosatti
            env->mcg_ctl = msrs[i].data;
1551 57780495 Marcelo Tosatti
            break;
1552 21e87c46 Avi Kivity
        case MSR_IA32_MISC_ENABLE:
1553 21e87c46 Avi Kivity
            env->msr_ia32_misc_enable = msrs[i].data;
1554 21e87c46 Avi Kivity
            break;
1555 0779caeb Arthur Chunqi Li
        case MSR_IA32_FEATURE_CONTROL:
1556 0779caeb Arthur Chunqi Li
            env->msr_ia32_feature_control = msrs[i].data;
1557 df67696e Liu Jinsong
            break;
1558 57780495 Marcelo Tosatti
        default:
1559 57780495 Marcelo Tosatti
            if (msrs[i].index >= MSR_MC0_CTL &&
1560 57780495 Marcelo Tosatti
                msrs[i].index < MSR_MC0_CTL + (env->mcg_cap & 0xff) * 4) {
1561 57780495 Marcelo Tosatti
                env->mce_banks[msrs[i].index - MSR_MC0_CTL] = msrs[i].data;
1562 57780495 Marcelo Tosatti
            }
1563 d8da8574 Hidetoshi Seto
            break;
1564 f6584ee2 Gleb Natapov
        case MSR_KVM_ASYNC_PF_EN:
1565 f6584ee2 Gleb Natapov
            env->async_pf_en_msr = msrs[i].data;
1566 f6584ee2 Gleb Natapov
            break;
1567 bc9a839d Michael S. Tsirkin
        case MSR_KVM_PV_EOI_EN:
1568 bc9a839d Michael S. Tsirkin
            env->pv_eoi_en_msr = msrs[i].data;
1569 bc9a839d Michael S. Tsirkin
            break;
1570 917367aa Marcelo Tosatti
        case MSR_KVM_STEAL_TIME:
1571 917367aa Marcelo Tosatti
            env->steal_time_msr = msrs[i].data;
1572 917367aa Marcelo Tosatti
            break;
1573 0d894367 Paolo Bonzini
        case MSR_CORE_PERF_FIXED_CTR_CTRL:
1574 0d894367 Paolo Bonzini
            env->msr_fixed_ctr_ctrl = msrs[i].data;
1575 0d894367 Paolo Bonzini
            break;
1576 0d894367 Paolo Bonzini
        case MSR_CORE_PERF_GLOBAL_CTRL:
1577 0d894367 Paolo Bonzini
            env->msr_global_ctrl = msrs[i].data;
1578 0d894367 Paolo Bonzini
            break;
1579 0d894367 Paolo Bonzini
        case MSR_CORE_PERF_GLOBAL_STATUS:
1580 0d894367 Paolo Bonzini
            env->msr_global_status = msrs[i].data;
1581 0d894367 Paolo Bonzini
            break;
1582 0d894367 Paolo Bonzini
        case MSR_CORE_PERF_GLOBAL_OVF_CTRL:
1583 0d894367 Paolo Bonzini
            env->msr_global_ovf_ctrl = msrs[i].data;
1584 0d894367 Paolo Bonzini
            break;
1585 0d894367 Paolo Bonzini
        case MSR_CORE_PERF_FIXED_CTR0 ... MSR_CORE_PERF_FIXED_CTR0 + MAX_FIXED_COUNTERS - 1:
1586 0d894367 Paolo Bonzini
            env->msr_fixed_counters[index - MSR_CORE_PERF_FIXED_CTR0] = msrs[i].data;
1587 0d894367 Paolo Bonzini
            break;
1588 0d894367 Paolo Bonzini
        case MSR_P6_PERFCTR0 ... MSR_P6_PERFCTR0 + MAX_GP_COUNTERS - 1:
1589 0d894367 Paolo Bonzini
            env->msr_gp_counters[index - MSR_P6_PERFCTR0] = msrs[i].data;
1590 0d894367 Paolo Bonzini
            break;
1591 0d894367 Paolo Bonzini
        case MSR_P6_EVNTSEL0 ... MSR_P6_EVNTSEL0 + MAX_GP_COUNTERS - 1:
1592 0d894367 Paolo Bonzini
            env->msr_gp_evtsel[index - MSR_P6_EVNTSEL0] = msrs[i].data;
1593 0d894367 Paolo Bonzini
            break;
1594 05330448 aliguori
        }
1595 05330448 aliguori
    }
1596 05330448 aliguori
1597 05330448 aliguori
    return 0;
1598 05330448 aliguori
}
1599 05330448 aliguori
1600 1bc22652 Andreas Fรคrber
static int kvm_put_mp_state(X86CPU *cpu)
1601 9bdbe550 Hollis Blanchard
{
1602 1bc22652 Andreas Fรคrber
    struct kvm_mp_state mp_state = { .mp_state = cpu->env.mp_state };
1603 9bdbe550 Hollis Blanchard
1604 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_MP_STATE, &mp_state);
1605 9bdbe550 Hollis Blanchard
}
1606 9bdbe550 Hollis Blanchard
1607 23d02d9b Andreas Fรคrber
static int kvm_get_mp_state(X86CPU *cpu)
1608 9bdbe550 Hollis Blanchard
{
1609 259186a7 Andreas Fรคrber
    CPUState *cs = CPU(cpu);
1610 23d02d9b Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1611 9bdbe550 Hollis Blanchard
    struct kvm_mp_state mp_state;
1612 9bdbe550 Hollis Blanchard
    int ret;
1613 9bdbe550 Hollis Blanchard
1614 259186a7 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(cs, KVM_GET_MP_STATE, &mp_state);
1615 9bdbe550 Hollis Blanchard
    if (ret < 0) {
1616 9bdbe550 Hollis Blanchard
        return ret;
1617 9bdbe550 Hollis Blanchard
    }
1618 9bdbe550 Hollis Blanchard
    env->mp_state = mp_state.mp_state;
1619 c14750e8 Jan Kiszka
    if (kvm_irqchip_in_kernel()) {
1620 259186a7 Andreas Fรคrber
        cs->halted = (mp_state.mp_state == KVM_MP_STATE_HALTED);
1621 c14750e8 Jan Kiszka
    }
1622 9bdbe550 Hollis Blanchard
    return 0;
1623 9bdbe550 Hollis Blanchard
}
1624 9bdbe550 Hollis Blanchard
1625 1bc22652 Andreas Fรคrber
static int kvm_get_apic(X86CPU *cpu)
1626 680c1c6f Jan Kiszka
{
1627 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1628 680c1c6f Jan Kiszka
    DeviceState *apic = env->apic_state;
1629 680c1c6f Jan Kiszka
    struct kvm_lapic_state kapic;
1630 680c1c6f Jan Kiszka
    int ret;
1631 680c1c6f Jan Kiszka
1632 3d4b2649 Jan Kiszka
    if (apic && kvm_irqchip_in_kernel()) {
1633 1bc22652 Andreas Fรคrber
        ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_LAPIC, &kapic);
1634 680c1c6f Jan Kiszka
        if (ret < 0) {
1635 680c1c6f Jan Kiszka
            return ret;
1636 680c1c6f Jan Kiszka
        }
1637 680c1c6f Jan Kiszka
1638 680c1c6f Jan Kiszka
        kvm_get_apic_state(apic, &kapic);
1639 680c1c6f Jan Kiszka
    }
1640 680c1c6f Jan Kiszka
    return 0;
1641 680c1c6f Jan Kiszka
}
1642 680c1c6f Jan Kiszka
1643 1bc22652 Andreas Fรคrber
static int kvm_put_apic(X86CPU *cpu)
1644 680c1c6f Jan Kiszka
{
1645 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1646 680c1c6f Jan Kiszka
    DeviceState *apic = env->apic_state;
1647 680c1c6f Jan Kiszka
    struct kvm_lapic_state kapic;
1648 680c1c6f Jan Kiszka
1649 3d4b2649 Jan Kiszka
    if (apic && kvm_irqchip_in_kernel()) {
1650 680c1c6f Jan Kiszka
        kvm_put_apic_state(apic, &kapic);
1651 680c1c6f Jan Kiszka
1652 1bc22652 Andreas Fรคrber
        return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_LAPIC, &kapic);
1653 680c1c6f Jan Kiszka
    }
1654 680c1c6f Jan Kiszka
    return 0;
1655 680c1c6f Jan Kiszka
}
1656 680c1c6f Jan Kiszka
1657 1bc22652 Andreas Fรคrber
static int kvm_put_vcpu_events(X86CPU *cpu, int level)
1658 a0fb002c Jan Kiszka
{
1659 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1660 a0fb002c Jan Kiszka
    struct kvm_vcpu_events events;
1661 a0fb002c Jan Kiszka
1662 a0fb002c Jan Kiszka
    if (!kvm_has_vcpu_events()) {
1663 a0fb002c Jan Kiszka
        return 0;
1664 a0fb002c Jan Kiszka
    }
1665 a0fb002c Jan Kiszka
1666 31827373 Jan Kiszka
    events.exception.injected = (env->exception_injected >= 0);
1667 31827373 Jan Kiszka
    events.exception.nr = env->exception_injected;
1668 a0fb002c Jan Kiszka
    events.exception.has_error_code = env->has_error_code;
1669 a0fb002c Jan Kiszka
    events.exception.error_code = env->error_code;
1670 7e680753 Michael S. Tsirkin
    events.exception.pad = 0;
1671 a0fb002c Jan Kiszka
1672 a0fb002c Jan Kiszka
    events.interrupt.injected = (env->interrupt_injected >= 0);
1673 a0fb002c Jan Kiszka
    events.interrupt.nr = env->interrupt_injected;
1674 a0fb002c Jan Kiszka
    events.interrupt.soft = env->soft_interrupt;
1675 a0fb002c Jan Kiszka
1676 a0fb002c Jan Kiszka
    events.nmi.injected = env->nmi_injected;
1677 a0fb002c Jan Kiszka
    events.nmi.pending = env->nmi_pending;
1678 a0fb002c Jan Kiszka
    events.nmi.masked = !!(env->hflags2 & HF2_NMI_MASK);
1679 7e680753 Michael S. Tsirkin
    events.nmi.pad = 0;
1680 a0fb002c Jan Kiszka
1681 a0fb002c Jan Kiszka
    events.sipi_vector = env->sipi_vector;
1682 a0fb002c Jan Kiszka
1683 ea643051 Jan Kiszka
    events.flags = 0;
1684 ea643051 Jan Kiszka
    if (level >= KVM_PUT_RESET_STATE) {
1685 ea643051 Jan Kiszka
        events.flags |=
1686 ea643051 Jan Kiszka
            KVM_VCPUEVENT_VALID_NMI_PENDING | KVM_VCPUEVENT_VALID_SIPI_VECTOR;
1687 ea643051 Jan Kiszka
    }
1688 aee028b9 Jan Kiszka
1689 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_VCPU_EVENTS, &events);
1690 a0fb002c Jan Kiszka
}
1691 a0fb002c Jan Kiszka
1692 1bc22652 Andreas Fรคrber
static int kvm_get_vcpu_events(X86CPU *cpu)
1693 a0fb002c Jan Kiszka
{
1694 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1695 a0fb002c Jan Kiszka
    struct kvm_vcpu_events events;
1696 a0fb002c Jan Kiszka
    int ret;
1697 a0fb002c Jan Kiszka
1698 a0fb002c Jan Kiszka
    if (!kvm_has_vcpu_events()) {
1699 a0fb002c Jan Kiszka
        return 0;
1700 a0fb002c Jan Kiszka
    }
1701 a0fb002c Jan Kiszka
1702 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_VCPU_EVENTS, &events);
1703 a0fb002c Jan Kiszka
    if (ret < 0) {
1704 a0fb002c Jan Kiszka
       return ret;
1705 a0fb002c Jan Kiszka
    }
1706 31827373 Jan Kiszka
    env->exception_injected =
1707 a0fb002c Jan Kiszka
       events.exception.injected ? events.exception.nr : -1;
1708 a0fb002c Jan Kiszka
    env->has_error_code = events.exception.has_error_code;
1709 a0fb002c Jan Kiszka
    env->error_code = events.exception.error_code;
1710 a0fb002c Jan Kiszka
1711 a0fb002c Jan Kiszka
    env->interrupt_injected =
1712 a0fb002c Jan Kiszka
        events.interrupt.injected ? events.interrupt.nr : -1;
1713 a0fb002c Jan Kiszka
    env->soft_interrupt = events.interrupt.soft;
1714 a0fb002c Jan Kiszka
1715 a0fb002c Jan Kiszka
    env->nmi_injected = events.nmi.injected;
1716 a0fb002c Jan Kiszka
    env->nmi_pending = events.nmi.pending;
1717 a0fb002c Jan Kiszka
    if (events.nmi.masked) {
1718 a0fb002c Jan Kiszka
        env->hflags2 |= HF2_NMI_MASK;
1719 a0fb002c Jan Kiszka
    } else {
1720 a0fb002c Jan Kiszka
        env->hflags2 &= ~HF2_NMI_MASK;
1721 a0fb002c Jan Kiszka
    }
1722 a0fb002c Jan Kiszka
1723 a0fb002c Jan Kiszka
    env->sipi_vector = events.sipi_vector;
1724 a0fb002c Jan Kiszka
1725 a0fb002c Jan Kiszka
    return 0;
1726 a0fb002c Jan Kiszka
}
1727 a0fb002c Jan Kiszka
1728 1bc22652 Andreas Fรคrber
static int kvm_guest_debug_workarounds(X86CPU *cpu)
1729 b0b1d690 Jan Kiszka
{
1730 ed2803da Andreas Fรคrber
    CPUState *cs = CPU(cpu);
1731 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1732 b0b1d690 Jan Kiszka
    int ret = 0;
1733 b0b1d690 Jan Kiszka
    unsigned long reinject_trap = 0;
1734 b0b1d690 Jan Kiszka
1735 b0b1d690 Jan Kiszka
    if (!kvm_has_vcpu_events()) {
1736 b0b1d690 Jan Kiszka
        if (env->exception_injected == 1) {
1737 b0b1d690 Jan Kiszka
            reinject_trap = KVM_GUESTDBG_INJECT_DB;
1738 b0b1d690 Jan Kiszka
        } else if (env->exception_injected == 3) {
1739 b0b1d690 Jan Kiszka
            reinject_trap = KVM_GUESTDBG_INJECT_BP;
1740 b0b1d690 Jan Kiszka
        }
1741 b0b1d690 Jan Kiszka
        env->exception_injected = -1;
1742 b0b1d690 Jan Kiszka
    }
1743 b0b1d690 Jan Kiszka
1744 b0b1d690 Jan Kiszka
    /*
1745 b0b1d690 Jan Kiszka
     * Kernels before KVM_CAP_X86_ROBUST_SINGLESTEP overwrote flags.TF
1746 b0b1d690 Jan Kiszka
     * injected via SET_GUEST_DEBUG while updating GP regs. Work around this
1747 b0b1d690 Jan Kiszka
     * by updating the debug state once again if single-stepping is on.
1748 b0b1d690 Jan Kiszka
     * Another reason to call kvm_update_guest_debug here is a pending debug
1749 b0b1d690 Jan Kiszka
     * trap raise by the guest. On kernels without SET_VCPU_EVENTS we have to
1750 b0b1d690 Jan Kiszka
     * reinject them via SET_GUEST_DEBUG.
1751 b0b1d690 Jan Kiszka
     */
1752 b0b1d690 Jan Kiszka
    if (reinject_trap ||
1753 ed2803da Andreas Fรคrber
        (!kvm_has_robust_singlestep() && cs->singlestep_enabled)) {
1754 38e478ec Stefan Weil
        ret = kvm_update_guest_debug(cs, reinject_trap);
1755 b0b1d690 Jan Kiszka
    }
1756 b0b1d690 Jan Kiszka
    return ret;
1757 b0b1d690 Jan Kiszka
}
1758 b0b1d690 Jan Kiszka
1759 1bc22652 Andreas Fรคrber
static int kvm_put_debugregs(X86CPU *cpu)
1760 ff44f1a3 Jan Kiszka
{
1761 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1762 ff44f1a3 Jan Kiszka
    struct kvm_debugregs dbgregs;
1763 ff44f1a3 Jan Kiszka
    int i;
1764 ff44f1a3 Jan Kiszka
1765 ff44f1a3 Jan Kiszka
    if (!kvm_has_debugregs()) {
1766 ff44f1a3 Jan Kiszka
        return 0;
1767 ff44f1a3 Jan Kiszka
    }
1768 ff44f1a3 Jan Kiszka
1769 ff44f1a3 Jan Kiszka
    for (i = 0; i < 4; i++) {
1770 ff44f1a3 Jan Kiszka
        dbgregs.db[i] = env->dr[i];
1771 ff44f1a3 Jan Kiszka
    }
1772 ff44f1a3 Jan Kiszka
    dbgregs.dr6 = env->dr[6];
1773 ff44f1a3 Jan Kiszka
    dbgregs.dr7 = env->dr[7];
1774 ff44f1a3 Jan Kiszka
    dbgregs.flags = 0;
1775 ff44f1a3 Jan Kiszka
1776 1bc22652 Andreas Fรคrber
    return kvm_vcpu_ioctl(CPU(cpu), KVM_SET_DEBUGREGS, &dbgregs);
1777 ff44f1a3 Jan Kiszka
}
1778 ff44f1a3 Jan Kiszka
1779 1bc22652 Andreas Fรคrber
static int kvm_get_debugregs(X86CPU *cpu)
1780 ff44f1a3 Jan Kiszka
{
1781 1bc22652 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1782 ff44f1a3 Jan Kiszka
    struct kvm_debugregs dbgregs;
1783 ff44f1a3 Jan Kiszka
    int i, ret;
1784 ff44f1a3 Jan Kiszka
1785 ff44f1a3 Jan Kiszka
    if (!kvm_has_debugregs()) {
1786 ff44f1a3 Jan Kiszka
        return 0;
1787 ff44f1a3 Jan Kiszka
    }
1788 ff44f1a3 Jan Kiszka
1789 1bc22652 Andreas Fรคrber
    ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_DEBUGREGS, &dbgregs);
1790 ff44f1a3 Jan Kiszka
    if (ret < 0) {
1791 b9bec74b Jan Kiszka
        return ret;
1792 ff44f1a3 Jan Kiszka
    }
1793 ff44f1a3 Jan Kiszka
    for (i = 0; i < 4; i++) {
1794 ff44f1a3 Jan Kiszka
        env->dr[i] = dbgregs.db[i];
1795 ff44f1a3 Jan Kiszka
    }
1796 ff44f1a3 Jan Kiszka
    env->dr[4] = env->dr[6] = dbgregs.dr6;
1797 ff44f1a3 Jan Kiszka
    env->dr[5] = env->dr[7] = dbgregs.dr7;
1798 ff44f1a3 Jan Kiszka
1799 ff44f1a3 Jan Kiszka
    return 0;
1800 ff44f1a3 Jan Kiszka
}
1801 ff44f1a3 Jan Kiszka
1802 20d695a9 Andreas Fรคrber
int kvm_arch_put_registers(CPUState *cpu, int level)
1803 05330448 aliguori
{
1804 20d695a9 Andreas Fรคrber
    X86CPU *x86_cpu = X86_CPU(cpu);
1805 05330448 aliguori
    int ret;
1806 05330448 aliguori
1807 2fa45344 Andreas Fรคrber
    assert(cpu_is_stopped(cpu) || qemu_cpu_is_self(cpu));
1808 dbaa07c4 Jan Kiszka
1809 1bc22652 Andreas Fรคrber
    ret = kvm_getput_regs(x86_cpu, 1);
1810 b9bec74b Jan Kiszka
    if (ret < 0) {
1811 05330448 aliguori
        return ret;
1812 b9bec74b Jan Kiszka
    }
1813 1bc22652 Andreas Fรคrber
    ret = kvm_put_xsave(x86_cpu);
1814 b9bec74b Jan Kiszka
    if (ret < 0) {
1815 f1665b21 Sheng Yang
        return ret;
1816 b9bec74b Jan Kiszka
    }
1817 1bc22652 Andreas Fรคrber
    ret = kvm_put_xcrs(x86_cpu);
1818 b9bec74b Jan Kiszka
    if (ret < 0) {
1819 05330448 aliguori
        return ret;
1820 b9bec74b Jan Kiszka
    }
1821 1bc22652 Andreas Fรคrber
    ret = kvm_put_sregs(x86_cpu);
1822 b9bec74b Jan Kiszka
    if (ret < 0) {
1823 05330448 aliguori
        return ret;
1824 b9bec74b Jan Kiszka
    }
1825 ab443475 Jan Kiszka
    /* must be before kvm_put_msrs */
1826 1bc22652 Andreas Fรคrber
    ret = kvm_inject_mce_oldstyle(x86_cpu);
1827 ab443475 Jan Kiszka
    if (ret < 0) {
1828 ab443475 Jan Kiszka
        return ret;
1829 ab443475 Jan Kiszka
    }
1830 1bc22652 Andreas Fรคrber
    ret = kvm_put_msrs(x86_cpu, level);
1831 b9bec74b Jan Kiszka
    if (ret < 0) {
1832 05330448 aliguori
        return ret;
1833 b9bec74b Jan Kiszka
    }
1834 ea643051 Jan Kiszka
    if (level >= KVM_PUT_RESET_STATE) {
1835 1bc22652 Andreas Fรคrber
        ret = kvm_put_mp_state(x86_cpu);
1836 b9bec74b Jan Kiszka
        if (ret < 0) {
1837 ea643051 Jan Kiszka
            return ret;
1838 b9bec74b Jan Kiszka
        }
1839 1bc22652 Andreas Fรคrber
        ret = kvm_put_apic(x86_cpu);
1840 680c1c6f Jan Kiszka
        if (ret < 0) {
1841 680c1c6f Jan Kiszka
            return ret;
1842 680c1c6f Jan Kiszka
        }
1843 ea643051 Jan Kiszka
    }
1844 7477cd38 Marcelo Tosatti
1845 7477cd38 Marcelo Tosatti
    ret = kvm_put_tscdeadline_msr(x86_cpu);
1846 7477cd38 Marcelo Tosatti
    if (ret < 0) {
1847 7477cd38 Marcelo Tosatti
        return ret;
1848 7477cd38 Marcelo Tosatti
    }
1849 7477cd38 Marcelo Tosatti
1850 1bc22652 Andreas Fรคrber
    ret = kvm_put_vcpu_events(x86_cpu, level);
1851 b9bec74b Jan Kiszka
    if (ret < 0) {
1852 a0fb002c Jan Kiszka
        return ret;
1853 b9bec74b Jan Kiszka
    }
1854 1bc22652 Andreas Fรคrber
    ret = kvm_put_debugregs(x86_cpu);
1855 b9bec74b Jan Kiszka
    if (ret < 0) {
1856 b0b1d690 Jan Kiszka
        return ret;
1857 b9bec74b Jan Kiszka
    }
1858 b0b1d690 Jan Kiszka
    /* must be last */
1859 1bc22652 Andreas Fรคrber
    ret = kvm_guest_debug_workarounds(x86_cpu);
1860 b9bec74b Jan Kiszka
    if (ret < 0) {
1861 ff44f1a3 Jan Kiszka
        return ret;
1862 b9bec74b Jan Kiszka
    }
1863 05330448 aliguori
    return 0;
1864 05330448 aliguori
}
1865 05330448 aliguori
1866 20d695a9 Andreas Fรคrber
int kvm_arch_get_registers(CPUState *cs)
1867 05330448 aliguori
{
1868 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
1869 05330448 aliguori
    int ret;
1870 05330448 aliguori
1871 20d695a9 Andreas Fรคrber
    assert(cpu_is_stopped(cs) || qemu_cpu_is_self(cs));
1872 dbaa07c4 Jan Kiszka
1873 1bc22652 Andreas Fรคrber
    ret = kvm_getput_regs(cpu, 0);
1874 b9bec74b Jan Kiszka
    if (ret < 0) {
1875 05330448 aliguori
        return ret;
1876 b9bec74b Jan Kiszka
    }
1877 1bc22652 Andreas Fรคrber
    ret = kvm_get_xsave(cpu);
1878 b9bec74b Jan Kiszka
    if (ret < 0) {
1879 f1665b21 Sheng Yang
        return ret;
1880 b9bec74b Jan Kiszka
    }
1881 1bc22652 Andreas Fรคrber
    ret = kvm_get_xcrs(cpu);
1882 b9bec74b Jan Kiszka
    if (ret < 0) {
1883 05330448 aliguori
        return ret;
1884 b9bec74b Jan Kiszka
    }
1885 1bc22652 Andreas Fรคrber
    ret = kvm_get_sregs(cpu);
1886 b9bec74b Jan Kiszka
    if (ret < 0) {
1887 05330448 aliguori
        return ret;
1888 b9bec74b Jan Kiszka
    }
1889 1bc22652 Andreas Fรคrber
    ret = kvm_get_msrs(cpu);
1890 b9bec74b Jan Kiszka
    if (ret < 0) {
1891 05330448 aliguori
        return ret;
1892 b9bec74b Jan Kiszka
    }
1893 23d02d9b Andreas Fรคrber
    ret = kvm_get_mp_state(cpu);
1894 b9bec74b Jan Kiszka
    if (ret < 0) {
1895 5a2e3c2e Jan Kiszka
        return ret;
1896 b9bec74b Jan Kiszka
    }
1897 1bc22652 Andreas Fรคrber
    ret = kvm_get_apic(cpu);
1898 680c1c6f Jan Kiszka
    if (ret < 0) {
1899 680c1c6f Jan Kiszka
        return ret;
1900 680c1c6f Jan Kiszka
    }
1901 1bc22652 Andreas Fรคrber
    ret = kvm_get_vcpu_events(cpu);
1902 b9bec74b Jan Kiszka
    if (ret < 0) {
1903 a0fb002c Jan Kiszka
        return ret;
1904 b9bec74b Jan Kiszka
    }
1905 1bc22652 Andreas Fรคrber
    ret = kvm_get_debugregs(cpu);
1906 b9bec74b Jan Kiszka
    if (ret < 0) {
1907 ff44f1a3 Jan Kiszka
        return ret;
1908 b9bec74b Jan Kiszka
    }
1909 05330448 aliguori
    return 0;
1910 05330448 aliguori
}
1911 05330448 aliguori
1912 20d695a9 Andreas Fรคrber
void kvm_arch_pre_run(CPUState *cpu, struct kvm_run *run)
1913 05330448 aliguori
{
1914 20d695a9 Andreas Fรคrber
    X86CPU *x86_cpu = X86_CPU(cpu);
1915 20d695a9 Andreas Fรคrber
    CPUX86State *env = &x86_cpu->env;
1916 ce377af3 Jan Kiszka
    int ret;
1917 ce377af3 Jan Kiszka
1918 276ce815 Lai Jiangshan
    /* Inject NMI */
1919 259186a7 Andreas Fรคrber
    if (cpu->interrupt_request & CPU_INTERRUPT_NMI) {
1920 259186a7 Andreas Fรคrber
        cpu->interrupt_request &= ~CPU_INTERRUPT_NMI;
1921 276ce815 Lai Jiangshan
        DPRINTF("injected NMI\n");
1922 1bc22652 Andreas Fรคrber
        ret = kvm_vcpu_ioctl(cpu, KVM_NMI);
1923 ce377af3 Jan Kiszka
        if (ret < 0) {
1924 ce377af3 Jan Kiszka
            fprintf(stderr, "KVM: injection failed, NMI lost (%s)\n",
1925 ce377af3 Jan Kiszka
                    strerror(-ret));
1926 ce377af3 Jan Kiszka
        }
1927 276ce815 Lai Jiangshan
    }
1928 276ce815 Lai Jiangshan
1929 db1669bc Jan Kiszka
    if (!kvm_irqchip_in_kernel()) {
1930 d362e757 Jan Kiszka
        /* Force the VCPU out of its inner loop to process any INIT requests
1931 d362e757 Jan Kiszka
         * or pending TPR access reports. */
1932 259186a7 Andreas Fรคrber
        if (cpu->interrupt_request &
1933 d362e757 Jan Kiszka
            (CPU_INTERRUPT_INIT | CPU_INTERRUPT_TPR)) {
1934 fcd7d003 Andreas Fรคrber
            cpu->exit_request = 1;
1935 05330448 aliguori
        }
1936 05330448 aliguori
1937 db1669bc Jan Kiszka
        /* Try to inject an interrupt if the guest can accept it */
1938 db1669bc Jan Kiszka
        if (run->ready_for_interrupt_injection &&
1939 259186a7 Andreas Fรคrber
            (cpu->interrupt_request & CPU_INTERRUPT_HARD) &&
1940 db1669bc Jan Kiszka
            (env->eflags & IF_MASK)) {
1941 db1669bc Jan Kiszka
            int irq;
1942 db1669bc Jan Kiszka
1943 259186a7 Andreas Fรคrber
            cpu->interrupt_request &= ~CPU_INTERRUPT_HARD;
1944 db1669bc Jan Kiszka
            irq = cpu_get_pic_interrupt(env);
1945 db1669bc Jan Kiszka
            if (irq >= 0) {
1946 db1669bc Jan Kiszka
                struct kvm_interrupt intr;
1947 db1669bc Jan Kiszka
1948 db1669bc Jan Kiszka
                intr.irq = irq;
1949 db1669bc Jan Kiszka
                DPRINTF("injected interrupt %d\n", irq);
1950 1bc22652 Andreas Fรคrber
                ret = kvm_vcpu_ioctl(cpu, KVM_INTERRUPT, &intr);
1951 ce377af3 Jan Kiszka
                if (ret < 0) {
1952 ce377af3 Jan Kiszka
                    fprintf(stderr,
1953 ce377af3 Jan Kiszka
                            "KVM: injection failed, interrupt lost (%s)\n",
1954 ce377af3 Jan Kiszka
                            strerror(-ret));
1955 ce377af3 Jan Kiszka
                }
1956 db1669bc Jan Kiszka
            }
1957 db1669bc Jan Kiszka
        }
1958 05330448 aliguori
1959 db1669bc Jan Kiszka
        /* If we have an interrupt but the guest is not ready to receive an
1960 db1669bc Jan Kiszka
         * interrupt, request an interrupt window exit.  This will
1961 db1669bc Jan Kiszka
         * cause a return to userspace as soon as the guest is ready to
1962 db1669bc Jan Kiszka
         * receive interrupts. */
1963 259186a7 Andreas Fรคrber
        if ((cpu->interrupt_request & CPU_INTERRUPT_HARD)) {
1964 db1669bc Jan Kiszka
            run->request_interrupt_window = 1;
1965 db1669bc Jan Kiszka
        } else {
1966 db1669bc Jan Kiszka
            run->request_interrupt_window = 0;
1967 db1669bc Jan Kiszka
        }
1968 db1669bc Jan Kiszka
1969 db1669bc Jan Kiszka
        DPRINTF("setting tpr\n");
1970 db1669bc Jan Kiszka
        run->cr8 = cpu_get_apic_tpr(env->apic_state);
1971 db1669bc Jan Kiszka
    }
1972 05330448 aliguori
}
1973 05330448 aliguori
1974 20d695a9 Andreas Fรคrber
void kvm_arch_post_run(CPUState *cpu, struct kvm_run *run)
1975 05330448 aliguori
{
1976 20d695a9 Andreas Fรคrber
    X86CPU *x86_cpu = X86_CPU(cpu);
1977 20d695a9 Andreas Fรคrber
    CPUX86State *env = &x86_cpu->env;
1978 20d695a9 Andreas Fรคrber
1979 b9bec74b Jan Kiszka
    if (run->if_flag) {
1980 05330448 aliguori
        env->eflags |= IF_MASK;
1981 b9bec74b Jan Kiszka
    } else {
1982 05330448 aliguori
        env->eflags &= ~IF_MASK;
1983 b9bec74b Jan Kiszka
    }
1984 4a942cea Blue Swirl
    cpu_set_apic_tpr(env->apic_state, run->cr8);
1985 4a942cea Blue Swirl
    cpu_set_apic_base(env->apic_state, run->apic_base);
1986 05330448 aliguori
}
1987 05330448 aliguori
1988 20d695a9 Andreas Fรคrber
int kvm_arch_process_async_events(CPUState *cs)
1989 0af691d7 Marcelo Tosatti
{
1990 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
1991 20d695a9 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
1992 232fc23b Andreas Fรคrber
1993 259186a7 Andreas Fรคrber
    if (cs->interrupt_request & CPU_INTERRUPT_MCE) {
1994 ab443475 Jan Kiszka
        /* We must not raise CPU_INTERRUPT_MCE if it's not supported. */
1995 ab443475 Jan Kiszka
        assert(env->mcg_cap);
1996 ab443475 Jan Kiszka
1997 259186a7 Andreas Fรคrber
        cs->interrupt_request &= ~CPU_INTERRUPT_MCE;
1998 ab443475 Jan Kiszka
1999 dd1750d7 Andreas Fรคrber
        kvm_cpu_synchronize_state(cs);
2000 ab443475 Jan Kiszka
2001 ab443475 Jan Kiszka
        if (env->exception_injected == EXCP08_DBLE) {
2002 ab443475 Jan Kiszka
            /* this means triple fault */
2003 ab443475 Jan Kiszka
            qemu_system_reset_request();
2004 fcd7d003 Andreas Fรคrber
            cs->exit_request = 1;
2005 ab443475 Jan Kiszka
            return 0;
2006 ab443475 Jan Kiszka
        }
2007 ab443475 Jan Kiszka
        env->exception_injected = EXCP12_MCHK;
2008 ab443475 Jan Kiszka
        env->has_error_code = 0;
2009 ab443475 Jan Kiszka
2010 259186a7 Andreas Fรคrber
        cs->halted = 0;
2011 ab443475 Jan Kiszka
        if (kvm_irqchip_in_kernel() && env->mp_state == KVM_MP_STATE_HALTED) {
2012 ab443475 Jan Kiszka
            env->mp_state = KVM_MP_STATE_RUNNABLE;
2013 ab443475 Jan Kiszka
        }
2014 ab443475 Jan Kiszka
    }
2015 ab443475 Jan Kiszka
2016 db1669bc Jan Kiszka
    if (kvm_irqchip_in_kernel()) {
2017 db1669bc Jan Kiszka
        return 0;
2018 db1669bc Jan Kiszka
    }
2019 db1669bc Jan Kiszka
2020 259186a7 Andreas Fรคrber
    if (cs->interrupt_request & CPU_INTERRUPT_POLL) {
2021 259186a7 Andreas Fรคrber
        cs->interrupt_request &= ~CPU_INTERRUPT_POLL;
2022 5d62c43a Jan Kiszka
        apic_poll_irq(env->apic_state);
2023 5d62c43a Jan Kiszka
    }
2024 259186a7 Andreas Fรคrber
    if (((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
2025 4601f7b0 Jan Kiszka
         (env->eflags & IF_MASK)) ||
2026 259186a7 Andreas Fรคrber
        (cs->interrupt_request & CPU_INTERRUPT_NMI)) {
2027 259186a7 Andreas Fรคrber
        cs->halted = 0;
2028 6792a57b Jan Kiszka
    }
2029 259186a7 Andreas Fรคrber
    if (cs->interrupt_request & CPU_INTERRUPT_INIT) {
2030 dd1750d7 Andreas Fรคrber
        kvm_cpu_synchronize_state(cs);
2031 232fc23b Andreas Fรคrber
        do_cpu_init(cpu);
2032 0af691d7 Marcelo Tosatti
    }
2033 259186a7 Andreas Fรคrber
    if (cs->interrupt_request & CPU_INTERRUPT_SIPI) {
2034 dd1750d7 Andreas Fรคrber
        kvm_cpu_synchronize_state(cs);
2035 232fc23b Andreas Fรคrber
        do_cpu_sipi(cpu);
2036 0af691d7 Marcelo Tosatti
    }
2037 259186a7 Andreas Fรคrber
    if (cs->interrupt_request & CPU_INTERRUPT_TPR) {
2038 259186a7 Andreas Fรคrber
        cs->interrupt_request &= ~CPU_INTERRUPT_TPR;
2039 dd1750d7 Andreas Fรคrber
        kvm_cpu_synchronize_state(cs);
2040 d362e757 Jan Kiszka
        apic_handle_tpr_access_report(env->apic_state, env->eip,
2041 d362e757 Jan Kiszka
                                      env->tpr_access_type);
2042 d362e757 Jan Kiszka
    }
2043 0af691d7 Marcelo Tosatti
2044 259186a7 Andreas Fรคrber
    return cs->halted;
2045 0af691d7 Marcelo Tosatti
}
2046 0af691d7 Marcelo Tosatti
2047 839b5630 Andreas Fรคrber
static int kvm_handle_halt(X86CPU *cpu)
2048 05330448 aliguori
{
2049 259186a7 Andreas Fรคrber
    CPUState *cs = CPU(cpu);
2050 839b5630 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
2051 839b5630 Andreas Fรคrber
2052 259186a7 Andreas Fรคrber
    if (!((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
2053 05330448 aliguori
          (env->eflags & IF_MASK)) &&
2054 259186a7 Andreas Fรคrber
        !(cs->interrupt_request & CPU_INTERRUPT_NMI)) {
2055 259186a7 Andreas Fรคrber
        cs->halted = 1;
2056 bb4ea393 Jan Kiszka
        return EXCP_HLT;
2057 05330448 aliguori
    }
2058 05330448 aliguori
2059 bb4ea393 Jan Kiszka
    return 0;
2060 05330448 aliguori
}
2061 05330448 aliguori
2062 f7575c96 Andreas Fรคrber
static int kvm_handle_tpr_access(X86CPU *cpu)
2063 d362e757 Jan Kiszka
{
2064 f7575c96 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
2065 f7575c96 Andreas Fรคrber
    CPUState *cs = CPU(cpu);
2066 f7575c96 Andreas Fรคrber
    struct kvm_run *run = cs->kvm_run;
2067 d362e757 Jan Kiszka
2068 d362e757 Jan Kiszka
    apic_handle_tpr_access_report(env->apic_state, run->tpr_access.rip,
2069 d362e757 Jan Kiszka
                                  run->tpr_access.is_write ? TPR_ACCESS_WRITE
2070 d362e757 Jan Kiszka
                                                           : TPR_ACCESS_READ);
2071 d362e757 Jan Kiszka
    return 1;
2072 d362e757 Jan Kiszka
}
2073 d362e757 Jan Kiszka
2074 f17ec444 Andreas Fรคrber
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
2075 e22a25c9 aliguori
{
2076 38972938 Juan Quintela
    static const uint8_t int3 = 0xcc;
2077 64bf3f4e aliguori
2078 f17ec444 Andreas Fรคrber
    if (cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 0) ||
2079 f17ec444 Andreas Fรคrber
        cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&int3, 1, 1)) {
2080 e22a25c9 aliguori
        return -EINVAL;
2081 b9bec74b Jan Kiszka
    }
2082 e22a25c9 aliguori
    return 0;
2083 e22a25c9 aliguori
}
2084 e22a25c9 aliguori
2085 f17ec444 Andreas Fรคrber
int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
2086 e22a25c9 aliguori
{
2087 e22a25c9 aliguori
    uint8_t int3;
2088 e22a25c9 aliguori
2089 f17ec444 Andreas Fรคrber
    if (cpu_memory_rw_debug(cs, bp->pc, &int3, 1, 0) || int3 != 0xcc ||
2090 f17ec444 Andreas Fรคrber
        cpu_memory_rw_debug(cs, bp->pc, (uint8_t *)&bp->saved_insn, 1, 1)) {
2091 e22a25c9 aliguori
        return -EINVAL;
2092 b9bec74b Jan Kiszka
    }
2093 e22a25c9 aliguori
    return 0;
2094 e22a25c9 aliguori
}
2095 e22a25c9 aliguori
2096 e22a25c9 aliguori
static struct {
2097 e22a25c9 aliguori
    target_ulong addr;
2098 e22a25c9 aliguori
    int len;
2099 e22a25c9 aliguori
    int type;
2100 e22a25c9 aliguori
} hw_breakpoint[4];
2101 e22a25c9 aliguori
2102 e22a25c9 aliguori
static int nb_hw_breakpoint;
2103 e22a25c9 aliguori
2104 e22a25c9 aliguori
static int find_hw_breakpoint(target_ulong addr, int len, int type)
2105 e22a25c9 aliguori
{
2106 e22a25c9 aliguori
    int n;
2107 e22a25c9 aliguori
2108 b9bec74b Jan Kiszka
    for (n = 0; n < nb_hw_breakpoint; n++) {
2109 e22a25c9 aliguori
        if (hw_breakpoint[n].addr == addr && hw_breakpoint[n].type == type &&
2110 b9bec74b Jan Kiszka
            (hw_breakpoint[n].len == len || len == -1)) {
2111 e22a25c9 aliguori
            return n;
2112 b9bec74b Jan Kiszka
        }
2113 b9bec74b Jan Kiszka
    }
2114 e22a25c9 aliguori
    return -1;
2115 e22a25c9 aliguori
}
2116 e22a25c9 aliguori
2117 e22a25c9 aliguori
int kvm_arch_insert_hw_breakpoint(target_ulong addr,
2118 e22a25c9 aliguori
                                  target_ulong len, int type)
2119 e22a25c9 aliguori
{
2120 e22a25c9 aliguori
    switch (type) {
2121 e22a25c9 aliguori
    case GDB_BREAKPOINT_HW:
2122 e22a25c9 aliguori
        len = 1;
2123 e22a25c9 aliguori
        break;
2124 e22a25c9 aliguori
    case GDB_WATCHPOINT_WRITE:
2125 e22a25c9 aliguori
    case GDB_WATCHPOINT_ACCESS:
2126 e22a25c9 aliguori
        switch (len) {
2127 e22a25c9 aliguori
        case 1:
2128 e22a25c9 aliguori
            break;
2129 e22a25c9 aliguori
        case 2:
2130 e22a25c9 aliguori
        case 4:
2131 e22a25c9 aliguori
        case 8:
2132 b9bec74b Jan Kiszka
            if (addr & (len - 1)) {
2133 e22a25c9 aliguori
                return -EINVAL;
2134 b9bec74b Jan Kiszka
            }
2135 e22a25c9 aliguori
            break;
2136 e22a25c9 aliguori
        default:
2137 e22a25c9 aliguori
            return -EINVAL;
2138 e22a25c9 aliguori
        }
2139 e22a25c9 aliguori
        break;
2140 e22a25c9 aliguori
    default:
2141 e22a25c9 aliguori
        return -ENOSYS;
2142 e22a25c9 aliguori
    }
2143 e22a25c9 aliguori
2144 b9bec74b Jan Kiszka
    if (nb_hw_breakpoint == 4) {
2145 e22a25c9 aliguori
        return -ENOBUFS;
2146 b9bec74b Jan Kiszka
    }
2147 b9bec74b Jan Kiszka
    if (find_hw_breakpoint(addr, len, type) >= 0) {
2148 e22a25c9 aliguori
        return -EEXIST;
2149 b9bec74b Jan Kiszka
    }
2150 e22a25c9 aliguori
    hw_breakpoint[nb_hw_breakpoint].addr = addr;
2151 e22a25c9 aliguori
    hw_breakpoint[nb_hw_breakpoint].len = len;
2152 e22a25c9 aliguori
    hw_breakpoint[nb_hw_breakpoint].type = type;
2153 e22a25c9 aliguori
    nb_hw_breakpoint++;
2154 e22a25c9 aliguori
2155 e22a25c9 aliguori
    return 0;
2156 e22a25c9 aliguori
}
2157 e22a25c9 aliguori
2158 e22a25c9 aliguori
int kvm_arch_remove_hw_breakpoint(target_ulong addr,
2159 e22a25c9 aliguori
                                  target_ulong len, int type)
2160 e22a25c9 aliguori
{
2161 e22a25c9 aliguori
    int n;
2162 e22a25c9 aliguori
2163 e22a25c9 aliguori
    n = find_hw_breakpoint(addr, (type == GDB_BREAKPOINT_HW) ? 1 : len, type);
2164 b9bec74b Jan Kiszka
    if (n < 0) {
2165 e22a25c9 aliguori
        return -ENOENT;
2166 b9bec74b Jan Kiszka
    }
2167 e22a25c9 aliguori
    nb_hw_breakpoint--;
2168 e22a25c9 aliguori
    hw_breakpoint[n] = hw_breakpoint[nb_hw_breakpoint];
2169 e22a25c9 aliguori
2170 e22a25c9 aliguori
    return 0;
2171 e22a25c9 aliguori
}
2172 e22a25c9 aliguori
2173 e22a25c9 aliguori
void kvm_arch_remove_all_hw_breakpoints(void)
2174 e22a25c9 aliguori
{
2175 e22a25c9 aliguori
    nb_hw_breakpoint = 0;
2176 e22a25c9 aliguori
}
2177 e22a25c9 aliguori
2178 e22a25c9 aliguori
static CPUWatchpoint hw_watchpoint;
2179 e22a25c9 aliguori
2180 a60f24b5 Andreas Fรคrber
static int kvm_handle_debug(X86CPU *cpu,
2181 48405526 Blue Swirl
                            struct kvm_debug_exit_arch *arch_info)
2182 e22a25c9 aliguori
{
2183 ed2803da Andreas Fรคrber
    CPUState *cs = CPU(cpu);
2184 a60f24b5 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
2185 f2574737 Jan Kiszka
    int ret = 0;
2186 e22a25c9 aliguori
    int n;
2187 e22a25c9 aliguori
2188 e22a25c9 aliguori
    if (arch_info->exception == 1) {
2189 e22a25c9 aliguori
        if (arch_info->dr6 & (1 << 14)) {
2190 ed2803da Andreas Fรคrber
            if (cs->singlestep_enabled) {
2191 f2574737 Jan Kiszka
                ret = EXCP_DEBUG;
2192 b9bec74b Jan Kiszka
            }
2193 e22a25c9 aliguori
        } else {
2194 b9bec74b Jan Kiszka
            for (n = 0; n < 4; n++) {
2195 b9bec74b Jan Kiszka
                if (arch_info->dr6 & (1 << n)) {
2196 e22a25c9 aliguori
                    switch ((arch_info->dr7 >> (16 + n*4)) & 0x3) {
2197 e22a25c9 aliguori
                    case 0x0:
2198 f2574737 Jan Kiszka
                        ret = EXCP_DEBUG;
2199 e22a25c9 aliguori
                        break;
2200 e22a25c9 aliguori
                    case 0x1:
2201 f2574737 Jan Kiszka
                        ret = EXCP_DEBUG;
2202 48405526 Blue Swirl
                        env->watchpoint_hit = &hw_watchpoint;
2203 e22a25c9 aliguori
                        hw_watchpoint.vaddr = hw_breakpoint[n].addr;
2204 e22a25c9 aliguori
                        hw_watchpoint.flags = BP_MEM_WRITE;
2205 e22a25c9 aliguori
                        break;
2206 e22a25c9 aliguori
                    case 0x3:
2207 f2574737 Jan Kiszka
                        ret = EXCP_DEBUG;
2208 48405526 Blue Swirl
                        env->watchpoint_hit = &hw_watchpoint;
2209 e22a25c9 aliguori
                        hw_watchpoint.vaddr = hw_breakpoint[n].addr;
2210 e22a25c9 aliguori
                        hw_watchpoint.flags = BP_MEM_ACCESS;
2211 e22a25c9 aliguori
                        break;
2212 e22a25c9 aliguori
                    }
2213 b9bec74b Jan Kiszka
                }
2214 b9bec74b Jan Kiszka
            }
2215 e22a25c9 aliguori
        }
2216 a60f24b5 Andreas Fรคrber
    } else if (kvm_find_sw_breakpoint(CPU(cpu), arch_info->pc)) {
2217 f2574737 Jan Kiszka
        ret = EXCP_DEBUG;
2218 b9bec74b Jan Kiszka
    }
2219 f2574737 Jan Kiszka
    if (ret == 0) {
2220 cb446eca Andreas Fรคrber
        cpu_synchronize_state(CPU(cpu));
2221 48405526 Blue Swirl
        assert(env->exception_injected == -1);
2222 b0b1d690 Jan Kiszka
2223 f2574737 Jan Kiszka
        /* pass to guest */
2224 48405526 Blue Swirl
        env->exception_injected = arch_info->exception;
2225 48405526 Blue Swirl
        env->has_error_code = 0;
2226 b0b1d690 Jan Kiszka
    }
2227 e22a25c9 aliguori
2228 f2574737 Jan Kiszka
    return ret;
2229 e22a25c9 aliguori
}
2230 e22a25c9 aliguori
2231 20d695a9 Andreas Fรคrber
void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg)
2232 e22a25c9 aliguori
{
2233 e22a25c9 aliguori
    const uint8_t type_code[] = {
2234 e22a25c9 aliguori
        [GDB_BREAKPOINT_HW] = 0x0,
2235 e22a25c9 aliguori
        [GDB_WATCHPOINT_WRITE] = 0x1,
2236 e22a25c9 aliguori
        [GDB_WATCHPOINT_ACCESS] = 0x3
2237 e22a25c9 aliguori
    };
2238 e22a25c9 aliguori
    const uint8_t len_code[] = {
2239 e22a25c9 aliguori
        [1] = 0x0, [2] = 0x1, [4] = 0x3, [8] = 0x2
2240 e22a25c9 aliguori
    };
2241 e22a25c9 aliguori
    int n;
2242 e22a25c9 aliguori
2243 a60f24b5 Andreas Fรคrber
    if (kvm_sw_breakpoints_active(cpu)) {
2244 e22a25c9 aliguori
        dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_SW_BP;
2245 b9bec74b Jan Kiszka
    }
2246 e22a25c9 aliguori
    if (nb_hw_breakpoint > 0) {
2247 e22a25c9 aliguori
        dbg->control |= KVM_GUESTDBG_ENABLE | KVM_GUESTDBG_USE_HW_BP;
2248 e22a25c9 aliguori
        dbg->arch.debugreg[7] = 0x0600;
2249 e22a25c9 aliguori
        for (n = 0; n < nb_hw_breakpoint; n++) {
2250 e22a25c9 aliguori
            dbg->arch.debugreg[n] = hw_breakpoint[n].addr;
2251 e22a25c9 aliguori
            dbg->arch.debugreg[7] |= (2 << (n * 2)) |
2252 e22a25c9 aliguori
                (type_code[hw_breakpoint[n].type] << (16 + n*4)) |
2253 95c077c9 Jan Kiszka
                ((uint32_t)len_code[hw_breakpoint[n].len] << (18 + n*4));
2254 e22a25c9 aliguori
        }
2255 e22a25c9 aliguori
    }
2256 e22a25c9 aliguori
}
2257 4513d923 Gleb Natapov
2258 2a4dac83 Jan Kiszka
static bool host_supports_vmx(void)
2259 2a4dac83 Jan Kiszka
{
2260 2a4dac83 Jan Kiszka
    uint32_t ecx, unused;
2261 2a4dac83 Jan Kiszka
2262 2a4dac83 Jan Kiszka
    host_cpuid(1, 0, &unused, &unused, &ecx, &unused);
2263 2a4dac83 Jan Kiszka
    return ecx & CPUID_EXT_VMX;
2264 2a4dac83 Jan Kiszka
}
2265 2a4dac83 Jan Kiszka
2266 2a4dac83 Jan Kiszka
#define VMX_INVALID_GUEST_STATE 0x80000021
2267 2a4dac83 Jan Kiszka
2268 20d695a9 Andreas Fรคrber
int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
2269 2a4dac83 Jan Kiszka
{
2270 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
2271 2a4dac83 Jan Kiszka
    uint64_t code;
2272 2a4dac83 Jan Kiszka
    int ret;
2273 2a4dac83 Jan Kiszka
2274 2a4dac83 Jan Kiszka
    switch (run->exit_reason) {
2275 2a4dac83 Jan Kiszka
    case KVM_EXIT_HLT:
2276 2a4dac83 Jan Kiszka
        DPRINTF("handle_hlt\n");
2277 839b5630 Andreas Fรคrber
        ret = kvm_handle_halt(cpu);
2278 2a4dac83 Jan Kiszka
        break;
2279 2a4dac83 Jan Kiszka
    case KVM_EXIT_SET_TPR:
2280 2a4dac83 Jan Kiszka
        ret = 0;
2281 2a4dac83 Jan Kiszka
        break;
2282 d362e757 Jan Kiszka
    case KVM_EXIT_TPR_ACCESS:
2283 f7575c96 Andreas Fรคrber
        ret = kvm_handle_tpr_access(cpu);
2284 d362e757 Jan Kiszka
        break;
2285 2a4dac83 Jan Kiszka
    case KVM_EXIT_FAIL_ENTRY:
2286 2a4dac83 Jan Kiszka
        code = run->fail_entry.hardware_entry_failure_reason;
2287 2a4dac83 Jan Kiszka
        fprintf(stderr, "KVM: entry failed, hardware error 0x%" PRIx64 "\n",
2288 2a4dac83 Jan Kiszka
                code);
2289 2a4dac83 Jan Kiszka
        if (host_supports_vmx() && code == VMX_INVALID_GUEST_STATE) {
2290 2a4dac83 Jan Kiszka
            fprintf(stderr,
2291 12619721 Vagrant Cascadian
                    "\nIf you're running a guest on an Intel machine without "
2292 2a4dac83 Jan Kiszka
                        "unrestricted mode\n"
2293 2a4dac83 Jan Kiszka
                    "support, the failure can be most likely due to the guest "
2294 2a4dac83 Jan Kiszka
                        "entering an invalid\n"
2295 2a4dac83 Jan Kiszka
                    "state for Intel VT. For example, the guest maybe running "
2296 2a4dac83 Jan Kiszka
                        "in big real mode\n"
2297 2a4dac83 Jan Kiszka
                    "which is not supported on less recent Intel processors."
2298 2a4dac83 Jan Kiszka
                        "\n\n");
2299 2a4dac83 Jan Kiszka
        }
2300 2a4dac83 Jan Kiszka
        ret = -1;
2301 2a4dac83 Jan Kiszka
        break;
2302 2a4dac83 Jan Kiszka
    case KVM_EXIT_EXCEPTION:
2303 2a4dac83 Jan Kiszka
        fprintf(stderr, "KVM: exception %d exit (error code 0x%x)\n",
2304 2a4dac83 Jan Kiszka
                run->ex.exception, run->ex.error_code);
2305 2a4dac83 Jan Kiszka
        ret = -1;
2306 2a4dac83 Jan Kiszka
        break;
2307 f2574737 Jan Kiszka
    case KVM_EXIT_DEBUG:
2308 f2574737 Jan Kiszka
        DPRINTF("kvm_exit_debug\n");
2309 a60f24b5 Andreas Fรคrber
        ret = kvm_handle_debug(cpu, &run->debug.arch);
2310 f2574737 Jan Kiszka
        break;
2311 2a4dac83 Jan Kiszka
    default:
2312 2a4dac83 Jan Kiszka
        fprintf(stderr, "KVM: unknown exit reason %d\n", run->exit_reason);
2313 2a4dac83 Jan Kiszka
        ret = -1;
2314 2a4dac83 Jan Kiszka
        break;
2315 2a4dac83 Jan Kiszka
    }
2316 2a4dac83 Jan Kiszka
2317 2a4dac83 Jan Kiszka
    return ret;
2318 2a4dac83 Jan Kiszka
}
2319 2a4dac83 Jan Kiszka
2320 20d695a9 Andreas Fรคrber
bool kvm_arch_stop_on_emulation_error(CPUState *cs)
2321 4513d923 Gleb Natapov
{
2322 20d695a9 Andreas Fรคrber
    X86CPU *cpu = X86_CPU(cs);
2323 20d695a9 Andreas Fรคrber
    CPUX86State *env = &cpu->env;
2324 20d695a9 Andreas Fรคrber
2325 dd1750d7 Andreas Fรคrber
    kvm_cpu_synchronize_state(cs);
2326 b9bec74b Jan Kiszka
    return !(env->cr[0] & CR0_PE_MASK) ||
2327 b9bec74b Jan Kiszka
           ((env->segs[R_CS].selector  & 3) != 3);
2328 4513d923 Gleb Natapov
}
2329 84b058d7 Jan Kiszka
2330 84b058d7 Jan Kiszka
void kvm_arch_init_irq_routing(KVMState *s)
2331 84b058d7 Jan Kiszka
{
2332 84b058d7 Jan Kiszka
    if (!kvm_check_extension(s, KVM_CAP_IRQ_ROUTING)) {
2333 84b058d7 Jan Kiszka
        /* If kernel can't do irq routing, interrupt source
2334 84b058d7 Jan Kiszka
         * override 0->2 cannot be set up as required by HPET.
2335 84b058d7 Jan Kiszka
         * So we have to disable it.
2336 84b058d7 Jan Kiszka
         */
2337 84b058d7 Jan Kiszka
        no_hpet = 1;
2338 84b058d7 Jan Kiszka
    }
2339 cc7e0ddf Peter Maydell
    /* We know at this point that we're using the in-kernel
2340 614e41bc Peter Maydell
     * irqchip, so we can use irqfds, and on x86 we know
2341 f3e1bed8 Peter Maydell
     * we can use msi via irqfd and GSI routing.
2342 cc7e0ddf Peter Maydell
     */
2343 cc7e0ddf Peter Maydell
    kvm_irqfds_allowed = true;
2344 614e41bc Peter Maydell
    kvm_msi_via_irqfd_allowed = true;
2345 f3e1bed8 Peter Maydell
    kvm_gsi_routing_allowed = true;
2346 84b058d7 Jan Kiszka
}
2347 b139bd30 Jan Kiszka
2348 b139bd30 Jan Kiszka
/* Classic KVM device assignment interface. Will remain x86 only. */
2349 b139bd30 Jan Kiszka
int kvm_device_pci_assign(KVMState *s, PCIHostDeviceAddress *dev_addr,
2350 b139bd30 Jan Kiszka
                          uint32_t flags, uint32_t *dev_id)
2351 b139bd30 Jan Kiszka
{
2352 b139bd30 Jan Kiszka
    struct kvm_assigned_pci_dev dev_data = {
2353 b139bd30 Jan Kiszka
        .segnr = dev_addr->domain,
2354 b139bd30 Jan Kiszka
        .busnr = dev_addr->bus,
2355 b139bd30 Jan Kiszka
        .devfn = PCI_DEVFN(dev_addr->slot, dev_addr->function),
2356 b139bd30 Jan Kiszka
        .flags = flags,
2357 b139bd30 Jan Kiszka
    };
2358 b139bd30 Jan Kiszka
    int ret;
2359 b139bd30 Jan Kiszka
2360 b139bd30 Jan Kiszka
    dev_data.assigned_dev_id =
2361 b139bd30 Jan Kiszka
        (dev_addr->domain << 16) | (dev_addr->bus << 8) | dev_data.devfn;
2362 b139bd30 Jan Kiszka
2363 b139bd30 Jan Kiszka
    ret = kvm_vm_ioctl(s, KVM_ASSIGN_PCI_DEVICE, &dev_data);
2364 b139bd30 Jan Kiszka
    if (ret < 0) {
2365 b139bd30 Jan Kiszka
        return ret;
2366 b139bd30 Jan Kiszka
    }
2367 b139bd30 Jan Kiszka
2368 b139bd30 Jan Kiszka
    *dev_id = dev_data.assigned_dev_id;
2369 b139bd30 Jan Kiszka
2370 b139bd30 Jan Kiszka
    return 0;
2371 b139bd30 Jan Kiszka
}
2372 b139bd30 Jan Kiszka
2373 b139bd30 Jan Kiszka
int kvm_device_pci_deassign(KVMState *s, uint32_t dev_id)
2374 b139bd30 Jan Kiszka
{
2375 b139bd30 Jan Kiszka
    struct kvm_assigned_pci_dev dev_data = {
2376 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2377 b139bd30 Jan Kiszka
    };
2378 b139bd30 Jan Kiszka
2379 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_DEASSIGN_PCI_DEVICE, &dev_data);
2380 b139bd30 Jan Kiszka
}
2381 b139bd30 Jan Kiszka
2382 b139bd30 Jan Kiszka
static int kvm_assign_irq_internal(KVMState *s, uint32_t dev_id,
2383 b139bd30 Jan Kiszka
                                   uint32_t irq_type, uint32_t guest_irq)
2384 b139bd30 Jan Kiszka
{
2385 b139bd30 Jan Kiszka
    struct kvm_assigned_irq assigned_irq = {
2386 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2387 b139bd30 Jan Kiszka
        .guest_irq = guest_irq,
2388 b139bd30 Jan Kiszka
        .flags = irq_type,
2389 b139bd30 Jan Kiszka
    };
2390 b139bd30 Jan Kiszka
2391 b139bd30 Jan Kiszka
    if (kvm_check_extension(s, KVM_CAP_ASSIGN_DEV_IRQ)) {
2392 b139bd30 Jan Kiszka
        return kvm_vm_ioctl(s, KVM_ASSIGN_DEV_IRQ, &assigned_irq);
2393 b139bd30 Jan Kiszka
    } else {
2394 b139bd30 Jan Kiszka
        return kvm_vm_ioctl(s, KVM_ASSIGN_IRQ, &assigned_irq);
2395 b139bd30 Jan Kiszka
    }
2396 b139bd30 Jan Kiszka
}
2397 b139bd30 Jan Kiszka
2398 b139bd30 Jan Kiszka
int kvm_device_intx_assign(KVMState *s, uint32_t dev_id, bool use_host_msi,
2399 b139bd30 Jan Kiszka
                           uint32_t guest_irq)
2400 b139bd30 Jan Kiszka
{
2401 b139bd30 Jan Kiszka
    uint32_t irq_type = KVM_DEV_IRQ_GUEST_INTX |
2402 b139bd30 Jan Kiszka
        (use_host_msi ? KVM_DEV_IRQ_HOST_MSI : KVM_DEV_IRQ_HOST_INTX);
2403 b139bd30 Jan Kiszka
2404 b139bd30 Jan Kiszka
    return kvm_assign_irq_internal(s, dev_id, irq_type, guest_irq);
2405 b139bd30 Jan Kiszka
}
2406 b139bd30 Jan Kiszka
2407 b139bd30 Jan Kiszka
int kvm_device_intx_set_mask(KVMState *s, uint32_t dev_id, bool masked)
2408 b139bd30 Jan Kiszka
{
2409 b139bd30 Jan Kiszka
    struct kvm_assigned_pci_dev dev_data = {
2410 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2411 b139bd30 Jan Kiszka
        .flags = masked ? KVM_DEV_ASSIGN_MASK_INTX : 0,
2412 b139bd30 Jan Kiszka
    };
2413 b139bd30 Jan Kiszka
2414 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_INTX_MASK, &dev_data);
2415 b139bd30 Jan Kiszka
}
2416 b139bd30 Jan Kiszka
2417 b139bd30 Jan Kiszka
static int kvm_deassign_irq_internal(KVMState *s, uint32_t dev_id,
2418 b139bd30 Jan Kiszka
                                     uint32_t type)
2419 b139bd30 Jan Kiszka
{
2420 b139bd30 Jan Kiszka
    struct kvm_assigned_irq assigned_irq = {
2421 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2422 b139bd30 Jan Kiszka
        .flags = type,
2423 b139bd30 Jan Kiszka
    };
2424 b139bd30 Jan Kiszka
2425 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_DEASSIGN_DEV_IRQ, &assigned_irq);
2426 b139bd30 Jan Kiszka
}
2427 b139bd30 Jan Kiszka
2428 b139bd30 Jan Kiszka
int kvm_device_intx_deassign(KVMState *s, uint32_t dev_id, bool use_host_msi)
2429 b139bd30 Jan Kiszka
{
2430 b139bd30 Jan Kiszka
    return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_INTX |
2431 b139bd30 Jan Kiszka
        (use_host_msi ? KVM_DEV_IRQ_HOST_MSI : KVM_DEV_IRQ_HOST_INTX));
2432 b139bd30 Jan Kiszka
}
2433 b139bd30 Jan Kiszka
2434 b139bd30 Jan Kiszka
int kvm_device_msi_assign(KVMState *s, uint32_t dev_id, int virq)
2435 b139bd30 Jan Kiszka
{
2436 b139bd30 Jan Kiszka
    return kvm_assign_irq_internal(s, dev_id, KVM_DEV_IRQ_HOST_MSI |
2437 b139bd30 Jan Kiszka
                                              KVM_DEV_IRQ_GUEST_MSI, virq);
2438 b139bd30 Jan Kiszka
}
2439 b139bd30 Jan Kiszka
2440 b139bd30 Jan Kiszka
int kvm_device_msi_deassign(KVMState *s, uint32_t dev_id)
2441 b139bd30 Jan Kiszka
{
2442 b139bd30 Jan Kiszka
    return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_MSI |
2443 b139bd30 Jan Kiszka
                                                KVM_DEV_IRQ_HOST_MSI);
2444 b139bd30 Jan Kiszka
}
2445 b139bd30 Jan Kiszka
2446 b139bd30 Jan Kiszka
bool kvm_device_msix_supported(KVMState *s)
2447 b139bd30 Jan Kiszka
{
2448 b139bd30 Jan Kiszka
    /* The kernel lacks a corresponding KVM_CAP, so we probe by calling
2449 b139bd30 Jan Kiszka
     * KVM_ASSIGN_SET_MSIX_NR with an invalid parameter. */
2450 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, NULL) == -EFAULT;
2451 b139bd30 Jan Kiszka
}
2452 b139bd30 Jan Kiszka
2453 b139bd30 Jan Kiszka
int kvm_device_msix_init_vectors(KVMState *s, uint32_t dev_id,
2454 b139bd30 Jan Kiszka
                                 uint32_t nr_vectors)
2455 b139bd30 Jan Kiszka
{
2456 b139bd30 Jan Kiszka
    struct kvm_assigned_msix_nr msix_nr = {
2457 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2458 b139bd30 Jan Kiszka
        .entry_nr = nr_vectors,
2459 b139bd30 Jan Kiszka
    };
2460 b139bd30 Jan Kiszka
2461 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_NR, &msix_nr);
2462 b139bd30 Jan Kiszka
}
2463 b139bd30 Jan Kiszka
2464 b139bd30 Jan Kiszka
int kvm_device_msix_set_vector(KVMState *s, uint32_t dev_id, uint32_t vector,
2465 b139bd30 Jan Kiszka
                               int virq)
2466 b139bd30 Jan Kiszka
{
2467 b139bd30 Jan Kiszka
    struct kvm_assigned_msix_entry msix_entry = {
2468 b139bd30 Jan Kiszka
        .assigned_dev_id = dev_id,
2469 b139bd30 Jan Kiszka
        .gsi = virq,
2470 b139bd30 Jan Kiszka
        .entry = vector,
2471 b139bd30 Jan Kiszka
    };
2472 b139bd30 Jan Kiszka
2473 b139bd30 Jan Kiszka
    return kvm_vm_ioctl(s, KVM_ASSIGN_SET_MSIX_ENTRY, &msix_entry);
2474 b139bd30 Jan Kiszka
}
2475 b139bd30 Jan Kiszka
2476 b139bd30 Jan Kiszka
int kvm_device_msix_assign(KVMState *s, uint32_t dev_id)
2477 b139bd30 Jan Kiszka
{
2478 b139bd30 Jan Kiszka
    return kvm_assign_irq_internal(s, dev_id, KVM_DEV_IRQ_HOST_MSIX |
2479 b139bd30 Jan Kiszka
                                              KVM_DEV_IRQ_GUEST_MSIX, 0);
2480 b139bd30 Jan Kiszka
}
2481 b139bd30 Jan Kiszka
2482 b139bd30 Jan Kiszka
int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id)
2483 b139bd30 Jan Kiszka
{
2484 b139bd30 Jan Kiszka
    return kvm_deassign_irq_internal(s, dev_id, KVM_DEV_IRQ_GUEST_MSIX |
2485 b139bd30 Jan Kiszka
                                                KVM_DEV_IRQ_HOST_MSIX);
2486 b139bd30 Jan Kiszka
}