Statistics
| Branch: | Revision:

root / target-i386 / kvm.c @ 444ba679

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