diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 415 |
1 files changed, 270 insertions, 145 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 49079a46687b..249540f98513 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -91,7 +91,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
91 | { "halt_wakeup", VCPU_STAT(halt_wakeup) }, | 91 | { "halt_wakeup", VCPU_STAT(halt_wakeup) }, |
92 | { "hypercalls", VCPU_STAT(hypercalls) }, | 92 | { "hypercalls", VCPU_STAT(hypercalls) }, |
93 | { "request_irq", VCPU_STAT(request_irq_exits) }, | 93 | { "request_irq", VCPU_STAT(request_irq_exits) }, |
94 | { "request_nmi", VCPU_STAT(request_nmi_exits) }, | ||
95 | { "irq_exits", VCPU_STAT(irq_exits) }, | 94 | { "irq_exits", VCPU_STAT(irq_exits) }, |
96 | { "host_state_reload", VCPU_STAT(host_state_reload) }, | 95 | { "host_state_reload", VCPU_STAT(host_state_reload) }, |
97 | { "efer_reload", VCPU_STAT(efer_reload) }, | 96 | { "efer_reload", VCPU_STAT(efer_reload) }, |
@@ -108,7 +107,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
108 | { "mmu_recycled", VM_STAT(mmu_recycled) }, | 107 | { "mmu_recycled", VM_STAT(mmu_recycled) }, |
109 | { "mmu_cache_miss", VM_STAT(mmu_cache_miss) }, | 108 | { "mmu_cache_miss", VM_STAT(mmu_cache_miss) }, |
110 | { "mmu_unsync", VM_STAT(mmu_unsync) }, | 109 | { "mmu_unsync", VM_STAT(mmu_unsync) }, |
111 | { "mmu_unsync_global", VM_STAT(mmu_unsync_global) }, | ||
112 | { "remote_tlb_flush", VM_STAT(remote_tlb_flush) }, | 110 | { "remote_tlb_flush", VM_STAT(remote_tlb_flush) }, |
113 | { "largepages", VM_STAT(lpages) }, | 111 | { "largepages", VM_STAT(lpages) }, |
114 | { NULL } | 112 | { NULL } |
@@ -234,7 +232,8 @@ int load_pdptrs(struct kvm_vcpu *vcpu, unsigned long cr3) | |||
234 | goto out; | 232 | goto out; |
235 | } | 233 | } |
236 | for (i = 0; i < ARRAY_SIZE(pdpte); ++i) { | 234 | for (i = 0; i < ARRAY_SIZE(pdpte); ++i) { |
237 | if ((pdpte[i] & 1) && (pdpte[i] & 0xfffffff0000001e6ull)) { | 235 | if (is_present_pte(pdpte[i]) && |
236 | (pdpte[i] & vcpu->arch.mmu.rsvd_bits_mask[0][2])) { | ||
238 | ret = 0; | 237 | ret = 0; |
239 | goto out; | 238 | goto out; |
240 | } | 239 | } |
@@ -321,7 +320,6 @@ void kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
321 | kvm_x86_ops->set_cr0(vcpu, cr0); | 320 | kvm_x86_ops->set_cr0(vcpu, cr0); |
322 | vcpu->arch.cr0 = cr0; | 321 | vcpu->arch.cr0 = cr0; |
323 | 322 | ||
324 | kvm_mmu_sync_global(vcpu); | ||
325 | kvm_mmu_reset_context(vcpu); | 323 | kvm_mmu_reset_context(vcpu); |
326 | return; | 324 | return; |
327 | } | 325 | } |
@@ -338,6 +336,9 @@ EXPORT_SYMBOL_GPL(kvm_lmsw); | |||
338 | 336 | ||
339 | void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | 337 | void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) |
340 | { | 338 | { |
339 | unsigned long old_cr4 = vcpu->arch.cr4; | ||
340 | unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE; | ||
341 | |||
341 | if (cr4 & CR4_RESERVED_BITS) { | 342 | if (cr4 & CR4_RESERVED_BITS) { |
342 | printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n"); | 343 | printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n"); |
343 | kvm_inject_gp(vcpu, 0); | 344 | kvm_inject_gp(vcpu, 0); |
@@ -351,7 +352,8 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
351 | kvm_inject_gp(vcpu, 0); | 352 | kvm_inject_gp(vcpu, 0); |
352 | return; | 353 | return; |
353 | } | 354 | } |
354 | } else if (is_paging(vcpu) && !is_pae(vcpu) && (cr4 & X86_CR4_PAE) | 355 | } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE) |
356 | && ((cr4 ^ old_cr4) & pdptr_bits) | ||
355 | && !load_pdptrs(vcpu, vcpu->arch.cr3)) { | 357 | && !load_pdptrs(vcpu, vcpu->arch.cr3)) { |
356 | printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n"); | 358 | printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n"); |
357 | kvm_inject_gp(vcpu, 0); | 359 | kvm_inject_gp(vcpu, 0); |
@@ -366,7 +368,6 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4) | |||
366 | kvm_x86_ops->set_cr4(vcpu, cr4); | 368 | kvm_x86_ops->set_cr4(vcpu, cr4); |
367 | vcpu->arch.cr4 = cr4; | 369 | vcpu->arch.cr4 = cr4; |
368 | vcpu->arch.mmu.base_role.cr4_pge = (cr4 & X86_CR4_PGE) && !tdp_enabled; | 370 | vcpu->arch.mmu.base_role.cr4_pge = (cr4 & X86_CR4_PGE) && !tdp_enabled; |
369 | kvm_mmu_sync_global(vcpu); | ||
370 | kvm_mmu_reset_context(vcpu); | 371 | kvm_mmu_reset_context(vcpu); |
371 | } | 372 | } |
372 | EXPORT_SYMBOL_GPL(kvm_set_cr4); | 373 | EXPORT_SYMBOL_GPL(kvm_set_cr4); |
@@ -519,6 +520,9 @@ static void set_efer(struct kvm_vcpu *vcpu, u64 efer) | |||
519 | efer |= vcpu->arch.shadow_efer & EFER_LMA; | 520 | efer |= vcpu->arch.shadow_efer & EFER_LMA; |
520 | 521 | ||
521 | vcpu->arch.shadow_efer = efer; | 522 | vcpu->arch.shadow_efer = efer; |
523 | |||
524 | vcpu->arch.mmu.base_role.nxe = (efer & EFER_NX) && !tdp_enabled; | ||
525 | kvm_mmu_reset_context(vcpu); | ||
522 | } | 526 | } |
523 | 527 | ||
524 | void kvm_enable_efer_bits(u64 mask) | 528 | void kvm_enable_efer_bits(u64 mask) |
@@ -626,14 +630,17 @@ static void kvm_write_guest_time(struct kvm_vcpu *v) | |||
626 | unsigned long flags; | 630 | unsigned long flags; |
627 | struct kvm_vcpu_arch *vcpu = &v->arch; | 631 | struct kvm_vcpu_arch *vcpu = &v->arch; |
628 | void *shared_kaddr; | 632 | void *shared_kaddr; |
633 | unsigned long this_tsc_khz; | ||
629 | 634 | ||
630 | if ((!vcpu->time_page)) | 635 | if ((!vcpu->time_page)) |
631 | return; | 636 | return; |
632 | 637 | ||
633 | if (unlikely(vcpu->hv_clock_tsc_khz != __get_cpu_var(cpu_tsc_khz))) { | 638 | this_tsc_khz = get_cpu_var(cpu_tsc_khz); |
634 | kvm_set_time_scale(__get_cpu_var(cpu_tsc_khz), &vcpu->hv_clock); | 639 | if (unlikely(vcpu->hv_clock_tsc_khz != this_tsc_khz)) { |
635 | vcpu->hv_clock_tsc_khz = __get_cpu_var(cpu_tsc_khz); | 640 | kvm_set_time_scale(this_tsc_khz, &vcpu->hv_clock); |
641 | vcpu->hv_clock_tsc_khz = this_tsc_khz; | ||
636 | } | 642 | } |
643 | put_cpu_var(cpu_tsc_khz); | ||
637 | 644 | ||
638 | /* Keep irq disabled to prevent changes to the clock */ | 645 | /* Keep irq disabled to prevent changes to the clock */ |
639 | local_irq_save(flags); | 646 | local_irq_save(flags); |
@@ -889,6 +896,8 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
889 | case MSR_IA32_LASTINTFROMIP: | 896 | case MSR_IA32_LASTINTFROMIP: |
890 | case MSR_IA32_LASTINTTOIP: | 897 | case MSR_IA32_LASTINTTOIP: |
891 | case MSR_VM_HSAVE_PA: | 898 | case MSR_VM_HSAVE_PA: |
899 | case MSR_P6_EVNTSEL0: | ||
900 | case MSR_P6_EVNTSEL1: | ||
892 | data = 0; | 901 | data = 0; |
893 | break; | 902 | break; |
894 | case MSR_MTRRcap: | 903 | case MSR_MTRRcap: |
@@ -1020,6 +1029,7 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
1020 | case KVM_CAP_SYNC_MMU: | 1029 | case KVM_CAP_SYNC_MMU: |
1021 | case KVM_CAP_REINJECT_CONTROL: | 1030 | case KVM_CAP_REINJECT_CONTROL: |
1022 | case KVM_CAP_IRQ_INJECT_STATUS: | 1031 | case KVM_CAP_IRQ_INJECT_STATUS: |
1032 | case KVM_CAP_ASSIGN_DEV_IRQ: | ||
1023 | r = 1; | 1033 | r = 1; |
1024 | break; | 1034 | break; |
1025 | case KVM_CAP_COALESCED_MMIO: | 1035 | case KVM_CAP_COALESCED_MMIO: |
@@ -1237,41 +1247,53 @@ static void do_cpuid_1_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
1237 | entry->flags = 0; | 1247 | entry->flags = 0; |
1238 | } | 1248 | } |
1239 | 1249 | ||
1250 | #define F(x) bit(X86_FEATURE_##x) | ||
1251 | |||
1240 | static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | 1252 | static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, |
1241 | u32 index, int *nent, int maxnent) | 1253 | u32 index, int *nent, int maxnent) |
1242 | { | 1254 | { |
1243 | const u32 kvm_supported_word0_x86_features = bit(X86_FEATURE_FPU) | | 1255 | unsigned f_nx = is_efer_nx() ? F(NX) : 0; |
1244 | bit(X86_FEATURE_VME) | bit(X86_FEATURE_DE) | | ||
1245 | bit(X86_FEATURE_PSE) | bit(X86_FEATURE_TSC) | | ||
1246 | bit(X86_FEATURE_MSR) | bit(X86_FEATURE_PAE) | | ||
1247 | bit(X86_FEATURE_CX8) | bit(X86_FEATURE_APIC) | | ||
1248 | bit(X86_FEATURE_SEP) | bit(X86_FEATURE_PGE) | | ||
1249 | bit(X86_FEATURE_CMOV) | bit(X86_FEATURE_PSE36) | | ||
1250 | bit(X86_FEATURE_CLFLSH) | bit(X86_FEATURE_MMX) | | ||
1251 | bit(X86_FEATURE_FXSR) | bit(X86_FEATURE_XMM) | | ||
1252 | bit(X86_FEATURE_XMM2) | bit(X86_FEATURE_SELFSNOOP); | ||
1253 | const u32 kvm_supported_word1_x86_features = bit(X86_FEATURE_FPU) | | ||
1254 | bit(X86_FEATURE_VME) | bit(X86_FEATURE_DE) | | ||
1255 | bit(X86_FEATURE_PSE) | bit(X86_FEATURE_TSC) | | ||
1256 | bit(X86_FEATURE_MSR) | bit(X86_FEATURE_PAE) | | ||
1257 | bit(X86_FEATURE_CX8) | bit(X86_FEATURE_APIC) | | ||
1258 | bit(X86_FEATURE_PGE) | | ||
1259 | bit(X86_FEATURE_CMOV) | bit(X86_FEATURE_PSE36) | | ||
1260 | bit(X86_FEATURE_MMX) | bit(X86_FEATURE_FXSR) | | ||
1261 | bit(X86_FEATURE_SYSCALL) | | ||
1262 | (is_efer_nx() ? bit(X86_FEATURE_NX) : 0) | | ||
1263 | #ifdef CONFIG_X86_64 | 1256 | #ifdef CONFIG_X86_64 |
1264 | bit(X86_FEATURE_LM) | | 1257 | unsigned f_lm = F(LM); |
1258 | #else | ||
1259 | unsigned f_lm = 0; | ||
1265 | #endif | 1260 | #endif |
1266 | bit(X86_FEATURE_FXSR_OPT) | | 1261 | |
1267 | bit(X86_FEATURE_MMXEXT) | | 1262 | /* cpuid 1.edx */ |
1268 | bit(X86_FEATURE_3DNOWEXT) | | 1263 | const u32 kvm_supported_word0_x86_features = |
1269 | bit(X86_FEATURE_3DNOW); | 1264 | F(FPU) | F(VME) | F(DE) | F(PSE) | |
1270 | const u32 kvm_supported_word3_x86_features = | 1265 | F(TSC) | F(MSR) | F(PAE) | F(MCE) | |
1271 | bit(X86_FEATURE_XMM3) | bit(X86_FEATURE_CX16); | 1266 | F(CX8) | F(APIC) | 0 /* Reserved */ | F(SEP) | |
1267 | F(MTRR) | F(PGE) | F(MCA) | F(CMOV) | | ||
1268 | F(PAT) | F(PSE36) | 0 /* PSN */ | F(CLFLSH) | | ||
1269 | 0 /* Reserved, DS, ACPI */ | F(MMX) | | ||
1270 | F(FXSR) | F(XMM) | F(XMM2) | F(SELFSNOOP) | | ||
1271 | 0 /* HTT, TM, Reserved, PBE */; | ||
1272 | /* cpuid 0x80000001.edx */ | ||
1273 | const u32 kvm_supported_word1_x86_features = | ||
1274 | F(FPU) | F(VME) | F(DE) | F(PSE) | | ||
1275 | F(TSC) | F(MSR) | F(PAE) | F(MCE) | | ||
1276 | F(CX8) | F(APIC) | 0 /* Reserved */ | F(SYSCALL) | | ||
1277 | F(MTRR) | F(PGE) | F(MCA) | F(CMOV) | | ||
1278 | F(PAT) | F(PSE36) | 0 /* Reserved */ | | ||
1279 | f_nx | 0 /* Reserved */ | F(MMXEXT) | F(MMX) | | ||
1280 | F(FXSR) | F(FXSR_OPT) | 0 /* GBPAGES */ | 0 /* RDTSCP */ | | ||
1281 | 0 /* Reserved */ | f_lm | F(3DNOWEXT) | F(3DNOW); | ||
1282 | /* cpuid 1.ecx */ | ||
1283 | const u32 kvm_supported_word4_x86_features = | ||
1284 | F(XMM3) | 0 /* Reserved, DTES64, MONITOR */ | | ||
1285 | 0 /* DS-CPL, VMX, SMX, EST */ | | ||
1286 | 0 /* TM2 */ | F(SSSE3) | 0 /* CNXT-ID */ | 0 /* Reserved */ | | ||
1287 | 0 /* Reserved */ | F(CX16) | 0 /* xTPR Update, PDCM */ | | ||
1288 | 0 /* Reserved, DCA */ | F(XMM4_1) | | ||
1289 | F(XMM4_2) | 0 /* x2APIC */ | F(MOVBE) | F(POPCNT) | | ||
1290 | 0 /* Reserved, XSAVE, OSXSAVE */; | ||
1291 | /* cpuid 0x80000001.ecx */ | ||
1272 | const u32 kvm_supported_word6_x86_features = | 1292 | const u32 kvm_supported_word6_x86_features = |
1273 | bit(X86_FEATURE_LAHF_LM) | bit(X86_FEATURE_CMP_LEGACY) | | 1293 | F(LAHF_LM) | F(CMP_LEGACY) | F(SVM) | 0 /* ExtApicSpace */ | |
1274 | bit(X86_FEATURE_SVM); | 1294 | F(CR8_LEGACY) | F(ABM) | F(SSE4A) | F(MISALIGNSSE) | |
1295 | F(3DNOWPREFETCH) | 0 /* OSVW */ | 0 /* IBS */ | F(SSE5) | | ||
1296 | 0 /* SKINIT */ | 0 /* WDT */; | ||
1275 | 1297 | ||
1276 | /* all calls to cpuid_count() should be made on the same cpu */ | 1298 | /* all calls to cpuid_count() should be made on the same cpu */ |
1277 | get_cpu(); | 1299 | get_cpu(); |
@@ -1284,7 +1306,7 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
1284 | break; | 1306 | break; |
1285 | case 1: | 1307 | case 1: |
1286 | entry->edx &= kvm_supported_word0_x86_features; | 1308 | entry->edx &= kvm_supported_word0_x86_features; |
1287 | entry->ecx &= kvm_supported_word3_x86_features; | 1309 | entry->ecx &= kvm_supported_word4_x86_features; |
1288 | break; | 1310 | break; |
1289 | /* function 2 entries are STATEFUL. That is, repeated cpuid commands | 1311 | /* function 2 entries are STATEFUL. That is, repeated cpuid commands |
1290 | * may return different values. This forces us to get_cpu() before | 1312 | * may return different values. This forces us to get_cpu() before |
@@ -1346,6 +1368,8 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
1346 | put_cpu(); | 1368 | put_cpu(); |
1347 | } | 1369 | } |
1348 | 1370 | ||
1371 | #undef F | ||
1372 | |||
1349 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, | 1373 | static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid, |
1350 | struct kvm_cpuid_entry2 __user *entries) | 1374 | struct kvm_cpuid_entry2 __user *entries) |
1351 | { | 1375 | { |
@@ -1417,8 +1441,7 @@ static int kvm_vcpu_ioctl_interrupt(struct kvm_vcpu *vcpu, | |||
1417 | return -ENXIO; | 1441 | return -ENXIO; |
1418 | vcpu_load(vcpu); | 1442 | vcpu_load(vcpu); |
1419 | 1443 | ||
1420 | set_bit(irq->irq, vcpu->arch.irq_pending); | 1444 | kvm_queue_interrupt(vcpu, irq->irq, false); |
1421 | set_bit(irq->irq / BITS_PER_LONG, &vcpu->arch.irq_summary); | ||
1422 | 1445 | ||
1423 | vcpu_put(vcpu); | 1446 | vcpu_put(vcpu); |
1424 | 1447 | ||
@@ -1580,8 +1603,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
1580 | r = -EINVAL; | 1603 | r = -EINVAL; |
1581 | } | 1604 | } |
1582 | out: | 1605 | out: |
1583 | if (lapic) | 1606 | kfree(lapic); |
1584 | kfree(lapic); | ||
1585 | return r; | 1607 | return r; |
1586 | } | 1608 | } |
1587 | 1609 | ||
@@ -1602,10 +1624,12 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm, | |||
1602 | return -EINVAL; | 1624 | return -EINVAL; |
1603 | 1625 | ||
1604 | down_write(&kvm->slots_lock); | 1626 | down_write(&kvm->slots_lock); |
1627 | spin_lock(&kvm->mmu_lock); | ||
1605 | 1628 | ||
1606 | kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages); | 1629 | kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages); |
1607 | kvm->arch.n_requested_mmu_pages = kvm_nr_mmu_pages; | 1630 | kvm->arch.n_requested_mmu_pages = kvm_nr_mmu_pages; |
1608 | 1631 | ||
1632 | spin_unlock(&kvm->mmu_lock); | ||
1609 | up_write(&kvm->slots_lock); | 1633 | up_write(&kvm->slots_lock); |
1610 | return 0; | 1634 | return 0; |
1611 | } | 1635 | } |
@@ -1781,7 +1805,9 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
1781 | 1805 | ||
1782 | /* If nothing is dirty, don't bother messing with page tables. */ | 1806 | /* If nothing is dirty, don't bother messing with page tables. */ |
1783 | if (is_dirty) { | 1807 | if (is_dirty) { |
1808 | spin_lock(&kvm->mmu_lock); | ||
1784 | kvm_mmu_slot_remove_write_access(kvm, log->slot); | 1809 | kvm_mmu_slot_remove_write_access(kvm, log->slot); |
1810 | spin_unlock(&kvm->mmu_lock); | ||
1785 | kvm_flush_remote_tlbs(kvm); | 1811 | kvm_flush_remote_tlbs(kvm); |
1786 | memslot = &kvm->memslots[log->slot]; | 1812 | memslot = &kvm->memslots[log->slot]; |
1787 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; | 1813 | n = ALIGN(memslot->npages, BITS_PER_LONG) / 8; |
@@ -2356,7 +2382,7 @@ int emulate_instruction(struct kvm_vcpu *vcpu, | |||
2356 | u16 error_code, | 2382 | u16 error_code, |
2357 | int emulation_type) | 2383 | int emulation_type) |
2358 | { | 2384 | { |
2359 | int r; | 2385 | int r, shadow_mask; |
2360 | struct decode_cache *c; | 2386 | struct decode_cache *c; |
2361 | 2387 | ||
2362 | kvm_clear_exception_queue(vcpu); | 2388 | kvm_clear_exception_queue(vcpu); |
@@ -2404,7 +2430,16 @@ int emulate_instruction(struct kvm_vcpu *vcpu, | |||
2404 | } | 2430 | } |
2405 | } | 2431 | } |
2406 | 2432 | ||
2433 | if (emulation_type & EMULTYPE_SKIP) { | ||
2434 | kvm_rip_write(vcpu, vcpu->arch.emulate_ctxt.decode.eip); | ||
2435 | return EMULATE_DONE; | ||
2436 | } | ||
2437 | |||
2407 | r = x86_emulate_insn(&vcpu->arch.emulate_ctxt, &emulate_ops); | 2438 | r = x86_emulate_insn(&vcpu->arch.emulate_ctxt, &emulate_ops); |
2439 | shadow_mask = vcpu->arch.emulate_ctxt.interruptibility; | ||
2440 | |||
2441 | if (r == 0) | ||
2442 | kvm_x86_ops->set_interrupt_shadow(vcpu, shadow_mask); | ||
2408 | 2443 | ||
2409 | if (vcpu->arch.pio.string) | 2444 | if (vcpu->arch.pio.string) |
2410 | return EMULATE_DO_MMIO; | 2445 | return EMULATE_DO_MMIO; |
@@ -2757,7 +2792,7 @@ int kvm_arch_init(void *opaque) | |||
2757 | kvm_mmu_set_nonpresent_ptes(0ull, 0ull); | 2792 | kvm_mmu_set_nonpresent_ptes(0ull, 0ull); |
2758 | kvm_mmu_set_base_ptes(PT_PRESENT_MASK); | 2793 | kvm_mmu_set_base_ptes(PT_PRESENT_MASK); |
2759 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, | 2794 | kvm_mmu_set_mask_ptes(PT_USER_MASK, PT_ACCESSED_MASK, |
2760 | PT_DIRTY_MASK, PT64_NX_MASK, 0, 0); | 2795 | PT_DIRTY_MASK, PT64_NX_MASK, 0); |
2761 | 2796 | ||
2762 | for_each_possible_cpu(cpu) | 2797 | for_each_possible_cpu(cpu) |
2763 | per_cpu(cpu_tsc_khz, cpu) = tsc_khz; | 2798 | per_cpu(cpu_tsc_khz, cpu) = tsc_khz; |
@@ -3008,6 +3043,16 @@ struct kvm_cpuid_entry2 *kvm_find_cpuid_entry(struct kvm_vcpu *vcpu, | |||
3008 | return best; | 3043 | return best; |
3009 | } | 3044 | } |
3010 | 3045 | ||
3046 | int cpuid_maxphyaddr(struct kvm_vcpu *vcpu) | ||
3047 | { | ||
3048 | struct kvm_cpuid_entry2 *best; | ||
3049 | |||
3050 | best = kvm_find_cpuid_entry(vcpu, 0x80000008, 0); | ||
3051 | if (best) | ||
3052 | return best->eax & 0xff; | ||
3053 | return 36; | ||
3054 | } | ||
3055 | |||
3011 | void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) | 3056 | void kvm_emulate_cpuid(struct kvm_vcpu *vcpu) |
3012 | { | 3057 | { |
3013 | u32 function, index; | 3058 | u32 function, index; |
@@ -3044,10 +3089,9 @@ EXPORT_SYMBOL_GPL(kvm_emulate_cpuid); | |||
3044 | static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu, | 3089 | static int dm_request_for_irq_injection(struct kvm_vcpu *vcpu, |
3045 | struct kvm_run *kvm_run) | 3090 | struct kvm_run *kvm_run) |
3046 | { | 3091 | { |
3047 | return (!vcpu->arch.irq_summary && | 3092 | return (!irqchip_in_kernel(vcpu->kvm) && !kvm_cpu_has_interrupt(vcpu) && |
3048 | kvm_run->request_interrupt_window && | 3093 | kvm_run->request_interrupt_window && |
3049 | vcpu->arch.interrupt_window_open && | 3094 | kvm_arch_interrupt_allowed(vcpu)); |
3050 | (kvm_x86_ops->get_rflags(vcpu) & X86_EFLAGS_IF)); | ||
3051 | } | 3095 | } |
3052 | 3096 | ||
3053 | static void post_kvm_run_save(struct kvm_vcpu *vcpu, | 3097 | static void post_kvm_run_save(struct kvm_vcpu *vcpu, |
@@ -3060,8 +3104,9 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu, | |||
3060 | kvm_run->ready_for_interrupt_injection = 1; | 3104 | kvm_run->ready_for_interrupt_injection = 1; |
3061 | else | 3105 | else |
3062 | kvm_run->ready_for_interrupt_injection = | 3106 | kvm_run->ready_for_interrupt_injection = |
3063 | (vcpu->arch.interrupt_window_open && | 3107 | kvm_arch_interrupt_allowed(vcpu) && |
3064 | vcpu->arch.irq_summary == 0); | 3108 | !kvm_cpu_has_interrupt(vcpu) && |
3109 | !kvm_event_needs_reinjection(vcpu); | ||
3065 | } | 3110 | } |
3066 | 3111 | ||
3067 | static void vapic_enter(struct kvm_vcpu *vcpu) | 3112 | static void vapic_enter(struct kvm_vcpu *vcpu) |
@@ -3090,9 +3135,63 @@ static void vapic_exit(struct kvm_vcpu *vcpu) | |||
3090 | up_read(&vcpu->kvm->slots_lock); | 3135 | up_read(&vcpu->kvm->slots_lock); |
3091 | } | 3136 | } |
3092 | 3137 | ||
3138 | static void update_cr8_intercept(struct kvm_vcpu *vcpu) | ||
3139 | { | ||
3140 | int max_irr, tpr; | ||
3141 | |||
3142 | if (!kvm_x86_ops->update_cr8_intercept) | ||
3143 | return; | ||
3144 | |||
3145 | if (!vcpu->arch.apic->vapic_addr) | ||
3146 | max_irr = kvm_lapic_find_highest_irr(vcpu); | ||
3147 | else | ||
3148 | max_irr = -1; | ||
3149 | |||
3150 | if (max_irr != -1) | ||
3151 | max_irr >>= 4; | ||
3152 | |||
3153 | tpr = kvm_lapic_get_cr8(vcpu); | ||
3154 | |||
3155 | kvm_x86_ops->update_cr8_intercept(vcpu, tpr, max_irr); | ||
3156 | } | ||
3157 | |||
3158 | static void inject_pending_irq(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | ||
3159 | { | ||
3160 | if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) | ||
3161 | kvm_x86_ops->set_interrupt_shadow(vcpu, 0); | ||
3162 | |||
3163 | /* try to reinject previous events if any */ | ||
3164 | if (vcpu->arch.nmi_injected) { | ||
3165 | kvm_x86_ops->set_nmi(vcpu); | ||
3166 | return; | ||
3167 | } | ||
3168 | |||
3169 | if (vcpu->arch.interrupt.pending) { | ||
3170 | kvm_x86_ops->set_irq(vcpu); | ||
3171 | return; | ||
3172 | } | ||
3173 | |||
3174 | /* try to inject new event if pending */ | ||
3175 | if (vcpu->arch.nmi_pending) { | ||
3176 | if (kvm_x86_ops->nmi_allowed(vcpu)) { | ||
3177 | vcpu->arch.nmi_pending = false; | ||
3178 | vcpu->arch.nmi_injected = true; | ||
3179 | kvm_x86_ops->set_nmi(vcpu); | ||
3180 | } | ||
3181 | } else if (kvm_cpu_has_interrupt(vcpu)) { | ||
3182 | if (kvm_x86_ops->interrupt_allowed(vcpu)) { | ||
3183 | kvm_queue_interrupt(vcpu, kvm_cpu_get_interrupt(vcpu), | ||
3184 | false); | ||
3185 | kvm_x86_ops->set_irq(vcpu); | ||
3186 | } | ||
3187 | } | ||
3188 | } | ||
3189 | |||
3093 | static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3190 | static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
3094 | { | 3191 | { |
3095 | int r; | 3192 | int r; |
3193 | bool req_int_win = !irqchip_in_kernel(vcpu->kvm) && | ||
3194 | kvm_run->request_interrupt_window; | ||
3096 | 3195 | ||
3097 | if (vcpu->requests) | 3196 | if (vcpu->requests) |
3098 | if (test_and_clear_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests)) | 3197 | if (test_and_clear_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests)) |
@@ -3124,9 +3223,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3124 | } | 3223 | } |
3125 | } | 3224 | } |
3126 | 3225 | ||
3127 | clear_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests); | ||
3128 | kvm_inject_pending_timer_irqs(vcpu); | ||
3129 | |||
3130 | preempt_disable(); | 3226 | preempt_disable(); |
3131 | 3227 | ||
3132 | kvm_x86_ops->prepare_guest_switch(vcpu); | 3228 | kvm_x86_ops->prepare_guest_switch(vcpu); |
@@ -3134,6 +3230,9 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3134 | 3230 | ||
3135 | local_irq_disable(); | 3231 | local_irq_disable(); |
3136 | 3232 | ||
3233 | clear_bit(KVM_REQ_KICK, &vcpu->requests); | ||
3234 | smp_mb__after_clear_bit(); | ||
3235 | |||
3137 | if (vcpu->requests || need_resched() || signal_pending(current)) { | 3236 | if (vcpu->requests || need_resched() || signal_pending(current)) { |
3138 | local_irq_enable(); | 3237 | local_irq_enable(); |
3139 | preempt_enable(); | 3238 | preempt_enable(); |
@@ -3141,21 +3240,21 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3141 | goto out; | 3240 | goto out; |
3142 | } | 3241 | } |
3143 | 3242 | ||
3144 | vcpu->guest_mode = 1; | ||
3145 | /* | ||
3146 | * Make sure that guest_mode assignment won't happen after | ||
3147 | * testing the pending IRQ vector bitmap. | ||
3148 | */ | ||
3149 | smp_wmb(); | ||
3150 | |||
3151 | if (vcpu->arch.exception.pending) | 3243 | if (vcpu->arch.exception.pending) |
3152 | __queue_exception(vcpu); | 3244 | __queue_exception(vcpu); |
3153 | else if (irqchip_in_kernel(vcpu->kvm)) | ||
3154 | kvm_x86_ops->inject_pending_irq(vcpu); | ||
3155 | else | 3245 | else |
3156 | kvm_x86_ops->inject_pending_vectors(vcpu, kvm_run); | 3246 | inject_pending_irq(vcpu, kvm_run); |
3247 | |||
3248 | /* enable NMI/IRQ window open exits if needed */ | ||
3249 | if (vcpu->arch.nmi_pending) | ||
3250 | kvm_x86_ops->enable_nmi_window(vcpu); | ||
3251 | else if (kvm_cpu_has_interrupt(vcpu) || req_int_win) | ||
3252 | kvm_x86_ops->enable_irq_window(vcpu); | ||
3157 | 3253 | ||
3158 | kvm_lapic_sync_to_vapic(vcpu); | 3254 | if (kvm_lapic_enabled(vcpu)) { |
3255 | update_cr8_intercept(vcpu); | ||
3256 | kvm_lapic_sync_to_vapic(vcpu); | ||
3257 | } | ||
3159 | 3258 | ||
3160 | up_read(&vcpu->kvm->slots_lock); | 3259 | up_read(&vcpu->kvm->slots_lock); |
3161 | 3260 | ||
@@ -3189,7 +3288,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3189 | set_debugreg(vcpu->arch.host_dr6, 6); | 3288 | set_debugreg(vcpu->arch.host_dr6, 6); |
3190 | set_debugreg(vcpu->arch.host_dr7, 7); | 3289 | set_debugreg(vcpu->arch.host_dr7, 7); |
3191 | 3290 | ||
3192 | vcpu->guest_mode = 0; | 3291 | set_bit(KVM_REQ_KICK, &vcpu->requests); |
3193 | local_irq_enable(); | 3292 | local_irq_enable(); |
3194 | 3293 | ||
3195 | ++vcpu->stat.exits; | 3294 | ++vcpu->stat.exits; |
@@ -3216,8 +3315,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3216 | profile_hit(KVM_PROFILING, (void *)rip); | 3315 | profile_hit(KVM_PROFILING, (void *)rip); |
3217 | } | 3316 | } |
3218 | 3317 | ||
3219 | if (vcpu->arch.exception.pending && kvm_x86_ops->exception_injected(vcpu)) | ||
3220 | vcpu->arch.exception.pending = false; | ||
3221 | 3318 | ||
3222 | kvm_lapic_sync_from_vapic(vcpu); | 3319 | kvm_lapic_sync_from_vapic(vcpu); |
3223 | 3320 | ||
@@ -3226,6 +3323,7 @@ out: | |||
3226 | return r; | 3323 | return r; |
3227 | } | 3324 | } |
3228 | 3325 | ||
3326 | |||
3229 | static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | 3327 | static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) |
3230 | { | 3328 | { |
3231 | int r; | 3329 | int r; |
@@ -3252,29 +3350,42 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
3252 | kvm_vcpu_block(vcpu); | 3350 | kvm_vcpu_block(vcpu); |
3253 | down_read(&vcpu->kvm->slots_lock); | 3351 | down_read(&vcpu->kvm->slots_lock); |
3254 | if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests)) | 3352 | if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests)) |
3255 | if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) | 3353 | { |
3354 | switch(vcpu->arch.mp_state) { | ||
3355 | case KVM_MP_STATE_HALTED: | ||
3256 | vcpu->arch.mp_state = | 3356 | vcpu->arch.mp_state = |
3257 | KVM_MP_STATE_RUNNABLE; | 3357 | KVM_MP_STATE_RUNNABLE; |
3258 | if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE) | 3358 | case KVM_MP_STATE_RUNNABLE: |
3259 | r = -EINTR; | 3359 | break; |
3360 | case KVM_MP_STATE_SIPI_RECEIVED: | ||
3361 | default: | ||
3362 | r = -EINTR; | ||
3363 | break; | ||
3364 | } | ||
3365 | } | ||
3260 | } | 3366 | } |
3261 | 3367 | ||
3262 | if (r > 0) { | 3368 | if (r <= 0) |
3263 | if (dm_request_for_irq_injection(vcpu, kvm_run)) { | 3369 | break; |
3264 | r = -EINTR; | 3370 | |
3265 | kvm_run->exit_reason = KVM_EXIT_INTR; | 3371 | clear_bit(KVM_REQ_PENDING_TIMER, &vcpu->requests); |
3266 | ++vcpu->stat.request_irq_exits; | 3372 | if (kvm_cpu_has_pending_timer(vcpu)) |
3267 | } | 3373 | kvm_inject_pending_timer_irqs(vcpu); |
3268 | if (signal_pending(current)) { | 3374 | |
3269 | r = -EINTR; | 3375 | if (dm_request_for_irq_injection(vcpu, kvm_run)) { |
3270 | kvm_run->exit_reason = KVM_EXIT_INTR; | 3376 | r = -EINTR; |
3271 | ++vcpu->stat.signal_exits; | 3377 | kvm_run->exit_reason = KVM_EXIT_INTR; |
3272 | } | 3378 | ++vcpu->stat.request_irq_exits; |
3273 | if (need_resched()) { | 3379 | } |
3274 | up_read(&vcpu->kvm->slots_lock); | 3380 | if (signal_pending(current)) { |
3275 | kvm_resched(vcpu); | 3381 | r = -EINTR; |
3276 | down_read(&vcpu->kvm->slots_lock); | 3382 | kvm_run->exit_reason = KVM_EXIT_INTR; |
3277 | } | 3383 | ++vcpu->stat.signal_exits; |
3384 | } | ||
3385 | if (need_resched()) { | ||
3386 | up_read(&vcpu->kvm->slots_lock); | ||
3387 | kvm_resched(vcpu); | ||
3388 | down_read(&vcpu->kvm->slots_lock); | ||
3278 | } | 3389 | } |
3279 | } | 3390 | } |
3280 | 3391 | ||
@@ -3438,7 +3549,6 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, | |||
3438 | struct kvm_sregs *sregs) | 3549 | struct kvm_sregs *sregs) |
3439 | { | 3550 | { |
3440 | struct descriptor_table dt; | 3551 | struct descriptor_table dt; |
3441 | int pending_vec; | ||
3442 | 3552 | ||
3443 | vcpu_load(vcpu); | 3553 | vcpu_load(vcpu); |
3444 | 3554 | ||
@@ -3468,16 +3578,11 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, | |||
3468 | sregs->efer = vcpu->arch.shadow_efer; | 3578 | sregs->efer = vcpu->arch.shadow_efer; |
3469 | sregs->apic_base = kvm_get_apic_base(vcpu); | 3579 | sregs->apic_base = kvm_get_apic_base(vcpu); |
3470 | 3580 | ||
3471 | if (irqchip_in_kernel(vcpu->kvm)) { | 3581 | memset(sregs->interrupt_bitmap, 0, sizeof sregs->interrupt_bitmap); |
3472 | memset(sregs->interrupt_bitmap, 0, | 3582 | |
3473 | sizeof sregs->interrupt_bitmap); | 3583 | if (vcpu->arch.interrupt.pending && !vcpu->arch.interrupt.soft) |
3474 | pending_vec = kvm_x86_ops->get_irq(vcpu); | 3584 | set_bit(vcpu->arch.interrupt.nr, |
3475 | if (pending_vec >= 0) | 3585 | (unsigned long *)sregs->interrupt_bitmap); |
3476 | set_bit(pending_vec, | ||
3477 | (unsigned long *)sregs->interrupt_bitmap); | ||
3478 | } else | ||
3479 | memcpy(sregs->interrupt_bitmap, vcpu->arch.irq_pending, | ||
3480 | sizeof sregs->interrupt_bitmap); | ||
3481 | 3586 | ||
3482 | vcpu_put(vcpu); | 3587 | vcpu_put(vcpu); |
3483 | 3588 | ||
@@ -3684,7 +3789,6 @@ static void save_state_to_tss32(struct kvm_vcpu *vcpu, | |||
3684 | tss->fs = get_segment_selector(vcpu, VCPU_SREG_FS); | 3789 | tss->fs = get_segment_selector(vcpu, VCPU_SREG_FS); |
3685 | tss->gs = get_segment_selector(vcpu, VCPU_SREG_GS); | 3790 | tss->gs = get_segment_selector(vcpu, VCPU_SREG_GS); |
3686 | tss->ldt_selector = get_segment_selector(vcpu, VCPU_SREG_LDTR); | 3791 | tss->ldt_selector = get_segment_selector(vcpu, VCPU_SREG_LDTR); |
3687 | tss->prev_task_link = get_segment_selector(vcpu, VCPU_SREG_TR); | ||
3688 | } | 3792 | } |
3689 | 3793 | ||
3690 | static int load_state_from_tss32(struct kvm_vcpu *vcpu, | 3794 | static int load_state_from_tss32(struct kvm_vcpu *vcpu, |
@@ -3781,8 +3885,8 @@ static int load_state_from_tss16(struct kvm_vcpu *vcpu, | |||
3781 | } | 3885 | } |
3782 | 3886 | ||
3783 | static int kvm_task_switch_16(struct kvm_vcpu *vcpu, u16 tss_selector, | 3887 | static int kvm_task_switch_16(struct kvm_vcpu *vcpu, u16 tss_selector, |
3784 | u32 old_tss_base, | 3888 | u16 old_tss_sel, u32 old_tss_base, |
3785 | struct desc_struct *nseg_desc) | 3889 | struct desc_struct *nseg_desc) |
3786 | { | 3890 | { |
3787 | struct tss_segment_16 tss_segment_16; | 3891 | struct tss_segment_16 tss_segment_16; |
3788 | int ret = 0; | 3892 | int ret = 0; |
@@ -3801,6 +3905,16 @@ static int kvm_task_switch_16(struct kvm_vcpu *vcpu, u16 tss_selector, | |||
3801 | &tss_segment_16, sizeof tss_segment_16)) | 3905 | &tss_segment_16, sizeof tss_segment_16)) |
3802 | goto out; | 3906 | goto out; |
3803 | 3907 | ||
3908 | if (old_tss_sel != 0xffff) { | ||
3909 | tss_segment_16.prev_task_link = old_tss_sel; | ||
3910 | |||
3911 | if (kvm_write_guest(vcpu->kvm, | ||
3912 | get_tss_base_addr(vcpu, nseg_desc), | ||
3913 | &tss_segment_16.prev_task_link, | ||
3914 | sizeof tss_segment_16.prev_task_link)) | ||
3915 | goto out; | ||
3916 | } | ||
3917 | |||
3804 | if (load_state_from_tss16(vcpu, &tss_segment_16)) | 3918 | if (load_state_from_tss16(vcpu, &tss_segment_16)) |
3805 | goto out; | 3919 | goto out; |
3806 | 3920 | ||
@@ -3810,7 +3924,7 @@ out: | |||
3810 | } | 3924 | } |
3811 | 3925 | ||
3812 | static int kvm_task_switch_32(struct kvm_vcpu *vcpu, u16 tss_selector, | 3926 | static int kvm_task_switch_32(struct kvm_vcpu *vcpu, u16 tss_selector, |
3813 | u32 old_tss_base, | 3927 | u16 old_tss_sel, u32 old_tss_base, |
3814 | struct desc_struct *nseg_desc) | 3928 | struct desc_struct *nseg_desc) |
3815 | { | 3929 | { |
3816 | struct tss_segment_32 tss_segment_32; | 3930 | struct tss_segment_32 tss_segment_32; |
@@ -3830,6 +3944,16 @@ static int kvm_task_switch_32(struct kvm_vcpu *vcpu, u16 tss_selector, | |||
3830 | &tss_segment_32, sizeof tss_segment_32)) | 3944 | &tss_segment_32, sizeof tss_segment_32)) |
3831 | goto out; | 3945 | goto out; |
3832 | 3946 | ||
3947 | if (old_tss_sel != 0xffff) { | ||
3948 | tss_segment_32.prev_task_link = old_tss_sel; | ||
3949 | |||
3950 | if (kvm_write_guest(vcpu->kvm, | ||
3951 | get_tss_base_addr(vcpu, nseg_desc), | ||
3952 | &tss_segment_32.prev_task_link, | ||
3953 | sizeof tss_segment_32.prev_task_link)) | ||
3954 | goto out; | ||
3955 | } | ||
3956 | |||
3833 | if (load_state_from_tss32(vcpu, &tss_segment_32)) | 3957 | if (load_state_from_tss32(vcpu, &tss_segment_32)) |
3834 | goto out; | 3958 | goto out; |
3835 | 3959 | ||
@@ -3883,14 +4007,22 @@ int kvm_task_switch(struct kvm_vcpu *vcpu, u16 tss_selector, int reason) | |||
3883 | kvm_x86_ops->set_rflags(vcpu, eflags & ~X86_EFLAGS_NT); | 4007 | kvm_x86_ops->set_rflags(vcpu, eflags & ~X86_EFLAGS_NT); |
3884 | } | 4008 | } |
3885 | 4009 | ||
3886 | kvm_x86_ops->skip_emulated_instruction(vcpu); | 4010 | /* set back link to prev task only if NT bit is set in eflags |
4011 | note that old_tss_sel is not used afetr this point */ | ||
4012 | if (reason != TASK_SWITCH_CALL && reason != TASK_SWITCH_GATE) | ||
4013 | old_tss_sel = 0xffff; | ||
4014 | |||
4015 | /* set back link to prev task only if NT bit is set in eflags | ||
4016 | note that old_tss_sel is not used afetr this point */ | ||
4017 | if (reason != TASK_SWITCH_CALL && reason != TASK_SWITCH_GATE) | ||
4018 | old_tss_sel = 0xffff; | ||
3887 | 4019 | ||
3888 | if (nseg_desc.type & 8) | 4020 | if (nseg_desc.type & 8) |
3889 | ret = kvm_task_switch_32(vcpu, tss_selector, old_tss_base, | 4021 | ret = kvm_task_switch_32(vcpu, tss_selector, old_tss_sel, |
3890 | &nseg_desc); | 4022 | old_tss_base, &nseg_desc); |
3891 | else | 4023 | else |
3892 | ret = kvm_task_switch_16(vcpu, tss_selector, old_tss_base, | 4024 | ret = kvm_task_switch_16(vcpu, tss_selector, old_tss_sel, |
3893 | &nseg_desc); | 4025 | old_tss_base, &nseg_desc); |
3894 | 4026 | ||
3895 | if (reason == TASK_SWITCH_CALL || reason == TASK_SWITCH_GATE) { | 4027 | if (reason == TASK_SWITCH_CALL || reason == TASK_SWITCH_GATE) { |
3896 | u32 eflags = kvm_x86_ops->get_rflags(vcpu); | 4028 | u32 eflags = kvm_x86_ops->get_rflags(vcpu); |
@@ -3916,7 +4048,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
3916 | struct kvm_sregs *sregs) | 4048 | struct kvm_sregs *sregs) |
3917 | { | 4049 | { |
3918 | int mmu_reset_needed = 0; | 4050 | int mmu_reset_needed = 0; |
3919 | int i, pending_vec, max_bits; | 4051 | int pending_vec, max_bits; |
3920 | struct descriptor_table dt; | 4052 | struct descriptor_table dt; |
3921 | 4053 | ||
3922 | vcpu_load(vcpu); | 4054 | vcpu_load(vcpu); |
@@ -3930,7 +4062,13 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
3930 | 4062 | ||
3931 | vcpu->arch.cr2 = sregs->cr2; | 4063 | vcpu->arch.cr2 = sregs->cr2; |
3932 | mmu_reset_needed |= vcpu->arch.cr3 != sregs->cr3; | 4064 | mmu_reset_needed |= vcpu->arch.cr3 != sregs->cr3; |
3933 | vcpu->arch.cr3 = sregs->cr3; | 4065 | |
4066 | down_read(&vcpu->kvm->slots_lock); | ||
4067 | if (gfn_to_memslot(vcpu->kvm, sregs->cr3 >> PAGE_SHIFT)) | ||
4068 | vcpu->arch.cr3 = sregs->cr3; | ||
4069 | else | ||
4070 | set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests); | ||
4071 | up_read(&vcpu->kvm->slots_lock); | ||
3934 | 4072 | ||
3935 | kvm_set_cr8(vcpu, sregs->cr8); | 4073 | kvm_set_cr8(vcpu, sregs->cr8); |
3936 | 4074 | ||
@@ -3952,25 +4090,14 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
3952 | if (mmu_reset_needed) | 4090 | if (mmu_reset_needed) |
3953 | kvm_mmu_reset_context(vcpu); | 4091 | kvm_mmu_reset_context(vcpu); |
3954 | 4092 | ||
3955 | if (!irqchip_in_kernel(vcpu->kvm)) { | 4093 | max_bits = (sizeof sregs->interrupt_bitmap) << 3; |
3956 | memcpy(vcpu->arch.irq_pending, sregs->interrupt_bitmap, | 4094 | pending_vec = find_first_bit( |
3957 | sizeof vcpu->arch.irq_pending); | 4095 | (const unsigned long *)sregs->interrupt_bitmap, max_bits); |
3958 | vcpu->arch.irq_summary = 0; | 4096 | if (pending_vec < max_bits) { |
3959 | for (i = 0; i < ARRAY_SIZE(vcpu->arch.irq_pending); ++i) | 4097 | kvm_queue_interrupt(vcpu, pending_vec, false); |
3960 | if (vcpu->arch.irq_pending[i]) | 4098 | pr_debug("Set back pending irq %d\n", pending_vec); |
3961 | __set_bit(i, &vcpu->arch.irq_summary); | 4099 | if (irqchip_in_kernel(vcpu->kvm)) |
3962 | } else { | 4100 | kvm_pic_clear_isr_ack(vcpu->kvm); |
3963 | max_bits = (sizeof sregs->interrupt_bitmap) << 3; | ||
3964 | pending_vec = find_first_bit( | ||
3965 | (const unsigned long *)sregs->interrupt_bitmap, | ||
3966 | max_bits); | ||
3967 | /* Only pending external irq is handled here */ | ||
3968 | if (pending_vec < max_bits) { | ||
3969 | kvm_x86_ops->set_irq(vcpu, pending_vec); | ||
3970 | pr_debug("Set back pending irq %d\n", | ||
3971 | pending_vec); | ||
3972 | } | ||
3973 | kvm_pic_clear_isr_ack(vcpu->kvm); | ||
3974 | } | 4101 | } |
3975 | 4102 | ||
3976 | kvm_set_segment(vcpu, &sregs->cs, VCPU_SREG_CS); | 4103 | kvm_set_segment(vcpu, &sregs->cs, VCPU_SREG_CS); |
@@ -4304,7 +4431,6 @@ struct kvm *kvm_arch_create_vm(void) | |||
4304 | return ERR_PTR(-ENOMEM); | 4431 | return ERR_PTR(-ENOMEM); |
4305 | 4432 | ||
4306 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); | 4433 | INIT_LIST_HEAD(&kvm->arch.active_mmu_pages); |
4307 | INIT_LIST_HEAD(&kvm->arch.oos_global_pages); | ||
4308 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); | 4434 | INIT_LIST_HEAD(&kvm->arch.assigned_dev_head); |
4309 | 4435 | ||
4310 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ | 4436 | /* Reserve bit 0 of irq_sources_bitmap for userspace irq source */ |
@@ -4407,12 +4533,14 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
4407 | } | 4533 | } |
4408 | } | 4534 | } |
4409 | 4535 | ||
4536 | spin_lock(&kvm->mmu_lock); | ||
4410 | if (!kvm->arch.n_requested_mmu_pages) { | 4537 | if (!kvm->arch.n_requested_mmu_pages) { |
4411 | unsigned int nr_mmu_pages = kvm_mmu_calculate_mmu_pages(kvm); | 4538 | unsigned int nr_mmu_pages = kvm_mmu_calculate_mmu_pages(kvm); |
4412 | kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages); | 4539 | kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages); |
4413 | } | 4540 | } |
4414 | 4541 | ||
4415 | kvm_mmu_slot_remove_write_access(kvm, mem->slot); | 4542 | kvm_mmu_slot_remove_write_access(kvm, mem->slot); |
4543 | spin_unlock(&kvm->mmu_lock); | ||
4416 | kvm_flush_remote_tlbs(kvm); | 4544 | kvm_flush_remote_tlbs(kvm); |
4417 | 4545 | ||
4418 | return 0; | 4546 | return 0; |
@@ -4421,6 +4549,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm, | |||
4421 | void kvm_arch_flush_shadow(struct kvm *kvm) | 4549 | void kvm_arch_flush_shadow(struct kvm *kvm) |
4422 | { | 4550 | { |
4423 | kvm_mmu_zap_all(kvm); | 4551 | kvm_mmu_zap_all(kvm); |
4552 | kvm_reload_remote_mmus(kvm); | ||
4424 | } | 4553 | } |
4425 | 4554 | ||
4426 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | 4555 | int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) |
@@ -4430,28 +4559,24 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) | |||
4430 | || vcpu->arch.nmi_pending; | 4559 | || vcpu->arch.nmi_pending; |
4431 | } | 4560 | } |
4432 | 4561 | ||
4433 | static void vcpu_kick_intr(void *info) | ||
4434 | { | ||
4435 | #ifdef DEBUG | ||
4436 | struct kvm_vcpu *vcpu = (struct kvm_vcpu *)info; | ||
4437 | printk(KERN_DEBUG "vcpu_kick_intr %p \n", vcpu); | ||
4438 | #endif | ||
4439 | } | ||
4440 | |||
4441 | void kvm_vcpu_kick(struct kvm_vcpu *vcpu) | 4562 | void kvm_vcpu_kick(struct kvm_vcpu *vcpu) |
4442 | { | 4563 | { |
4443 | int ipi_pcpu = vcpu->cpu; | 4564 | int me; |
4444 | int cpu = get_cpu(); | 4565 | int cpu = vcpu->cpu; |
4445 | 4566 | ||
4446 | if (waitqueue_active(&vcpu->wq)) { | 4567 | if (waitqueue_active(&vcpu->wq)) { |
4447 | wake_up_interruptible(&vcpu->wq); | 4568 | wake_up_interruptible(&vcpu->wq); |
4448 | ++vcpu->stat.halt_wakeup; | 4569 | ++vcpu->stat.halt_wakeup; |
4449 | } | 4570 | } |
4450 | /* | 4571 | |
4451 | * We may be called synchronously with irqs disabled in guest mode, | 4572 | me = get_cpu(); |
4452 | * So need not to call smp_call_function_single() in that case. | 4573 | if (cpu != me && (unsigned)cpu < nr_cpu_ids && cpu_online(cpu)) |
4453 | */ | 4574 | if (!test_and_set_bit(KVM_REQ_KICK, &vcpu->requests)) |
4454 | if (vcpu->guest_mode && vcpu->cpu != cpu) | 4575 | smp_send_reschedule(cpu); |
4455 | smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0); | ||
4456 | put_cpu(); | 4576 | put_cpu(); |
4457 | } | 4577 | } |
4578 | |||
4579 | int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu) | ||
4580 | { | ||
4581 | return kvm_x86_ops->interrupt_allowed(vcpu); | ||
4582 | } | ||