diff options
Diffstat (limited to 'arch/x86/kvm')
| -rw-r--r-- | arch/x86/kvm/i8259.c | 2 | ||||
| -rw-r--r-- | arch/x86/kvm/mmu.c | 10 | ||||
| -rw-r--r-- | arch/x86/kvm/svm.c | 43 | ||||
| -rw-r--r-- | arch/x86/kvm/vmx.c | 24 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.c | 25 | ||||
| -rw-r--r-- | arch/x86/kvm/x86.h | 5 |
6 files changed, 77 insertions, 32 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 4b7b73ce2098..9f163e61283c 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
| @@ -570,6 +570,8 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm) | |||
| 570 | s->pics[1].elcr_mask = 0xde; | 570 | s->pics[1].elcr_mask = 0xde; |
| 571 | s->pics[0].pics_state = s; | 571 | s->pics[0].pics_state = s; |
| 572 | s->pics[1].pics_state = s; | 572 | s->pics[1].pics_state = s; |
| 573 | s->pics[0].isr_ack = 0xff; | ||
| 574 | s->pics[1].isr_ack = 0xff; | ||
| 573 | 575 | ||
| 574 | /* | 576 | /* |
| 575 | * Initialize PIO device | 577 | * Initialize PIO device |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 311f6dad8951..7fed5b793faf 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -2254,6 +2254,10 @@ static int mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
| 2254 | return 0; | 2254 | return 0; |
| 2255 | } | 2255 | } |
| 2256 | direct = !is_paging(vcpu); | 2256 | direct = !is_paging(vcpu); |
| 2257 | |||
| 2258 | if (mmu_check_root(vcpu, root_gfn)) | ||
| 2259 | return 1; | ||
| 2260 | |||
| 2257 | for (i = 0; i < 4; ++i) { | 2261 | for (i = 0; i < 4; ++i) { |
| 2258 | hpa_t root = vcpu->arch.mmu.pae_root[i]; | 2262 | hpa_t root = vcpu->arch.mmu.pae_root[i]; |
| 2259 | 2263 | ||
| @@ -2265,13 +2269,13 @@ static int mmu_alloc_roots(struct kvm_vcpu *vcpu) | |||
| 2265 | continue; | 2269 | continue; |
| 2266 | } | 2270 | } |
| 2267 | root_gfn = pdptr >> PAGE_SHIFT; | 2271 | root_gfn = pdptr >> PAGE_SHIFT; |
| 2272 | if (mmu_check_root(vcpu, root_gfn)) | ||
| 2273 | return 1; | ||
| 2268 | } else if (vcpu->arch.mmu.root_level == 0) | 2274 | } else if (vcpu->arch.mmu.root_level == 0) |
| 2269 | root_gfn = 0; | 2275 | root_gfn = 0; |
| 2270 | if (mmu_check_root(vcpu, root_gfn)) | ||
| 2271 | return 1; | ||
| 2272 | if (tdp_enabled) { | 2276 | if (tdp_enabled) { |
| 2273 | direct = 1; | 2277 | direct = 1; |
| 2274 | root_gfn = i << 30; | 2278 | root_gfn = i << (30 - PAGE_SHIFT); |
| 2275 | } | 2279 | } |
| 2276 | spin_lock(&vcpu->kvm->mmu_lock); | 2280 | spin_lock(&vcpu->kvm->mmu_lock); |
| 2277 | kvm_mmu_free_some_pages(vcpu); | 2281 | kvm_mmu_free_some_pages(vcpu); |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 8a3f9f64f86f..e7c3f3bd08fc 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c | |||
| @@ -88,6 +88,14 @@ struct nested_state { | |||
| 88 | /* A VMEXIT is required but not yet emulated */ | 88 | /* A VMEXIT is required but not yet emulated */ |
| 89 | bool exit_required; | 89 | bool exit_required; |
| 90 | 90 | ||
| 91 | /* | ||
| 92 | * If we vmexit during an instruction emulation we need this to restore | ||
| 93 | * the l1 guest rip after the emulation | ||
| 94 | */ | ||
| 95 | unsigned long vmexit_rip; | ||
| 96 | unsigned long vmexit_rsp; | ||
| 97 | unsigned long vmexit_rax; | ||
| 98 | |||
| 91 | /* cache for intercepts of the guest */ | 99 | /* cache for intercepts of the guest */ |
| 92 | u16 intercept_cr_read; | 100 | u16 intercept_cr_read; |
| 93 | u16 intercept_cr_write; | 101 | u16 intercept_cr_write; |
| @@ -1206,8 +1214,12 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0) | |||
| 1206 | if (old == new) { | 1214 | if (old == new) { |
| 1207 | /* cr0 write with ts and mp unchanged */ | 1215 | /* cr0 write with ts and mp unchanged */ |
| 1208 | svm->vmcb->control.exit_code = SVM_EXIT_CR0_SEL_WRITE; | 1216 | svm->vmcb->control.exit_code = SVM_EXIT_CR0_SEL_WRITE; |
| 1209 | if (nested_svm_exit_handled(svm) == NESTED_EXIT_DONE) | 1217 | if (nested_svm_exit_handled(svm) == NESTED_EXIT_DONE) { |
| 1218 | svm->nested.vmexit_rip = kvm_rip_read(vcpu); | ||
| 1219 | svm->nested.vmexit_rsp = kvm_register_read(vcpu, VCPU_REGS_RSP); | ||
| 1220 | svm->nested.vmexit_rax = kvm_register_read(vcpu, VCPU_REGS_RAX); | ||
| 1210 | return; | 1221 | return; |
| 1222 | } | ||
| 1211 | } | 1223 | } |
| 1212 | } | 1224 | } |
| 1213 | 1225 | ||
| @@ -2399,6 +2411,23 @@ static int emulate_on_interception(struct vcpu_svm *svm) | |||
| 2399 | return emulate_instruction(&svm->vcpu, 0, 0, 0) == EMULATE_DONE; | 2411 | return emulate_instruction(&svm->vcpu, 0, 0, 0) == EMULATE_DONE; |
| 2400 | } | 2412 | } |
| 2401 | 2413 | ||
| 2414 | static int cr0_write_interception(struct vcpu_svm *svm) | ||
| 2415 | { | ||
| 2416 | struct kvm_vcpu *vcpu = &svm->vcpu; | ||
| 2417 | int r; | ||
| 2418 | |||
| 2419 | r = emulate_instruction(&svm->vcpu, 0, 0, 0); | ||
| 2420 | |||
| 2421 | if (svm->nested.vmexit_rip) { | ||
| 2422 | kvm_register_write(vcpu, VCPU_REGS_RIP, svm->nested.vmexit_rip); | ||
| 2423 | kvm_register_write(vcpu, VCPU_REGS_RSP, svm->nested.vmexit_rsp); | ||
| 2424 | kvm_register_write(vcpu, VCPU_REGS_RAX, svm->nested.vmexit_rax); | ||
| 2425 | svm->nested.vmexit_rip = 0; | ||
| 2426 | } | ||
| 2427 | |||
| 2428 | return r == EMULATE_DONE; | ||
| 2429 | } | ||
| 2430 | |||
| 2402 | static int cr8_write_interception(struct vcpu_svm *svm) | 2431 | static int cr8_write_interception(struct vcpu_svm *svm) |
| 2403 | { | 2432 | { |
| 2404 | struct kvm_run *kvm_run = svm->vcpu.run; | 2433 | struct kvm_run *kvm_run = svm->vcpu.run; |
| @@ -2672,7 +2701,7 @@ static int (*svm_exit_handlers[])(struct vcpu_svm *svm) = { | |||
| 2672 | [SVM_EXIT_READ_CR4] = emulate_on_interception, | 2701 | [SVM_EXIT_READ_CR4] = emulate_on_interception, |
| 2673 | [SVM_EXIT_READ_CR8] = emulate_on_interception, | 2702 | [SVM_EXIT_READ_CR8] = emulate_on_interception, |
| 2674 | [SVM_EXIT_CR0_SEL_WRITE] = emulate_on_interception, | 2703 | [SVM_EXIT_CR0_SEL_WRITE] = emulate_on_interception, |
| 2675 | [SVM_EXIT_WRITE_CR0] = emulate_on_interception, | 2704 | [SVM_EXIT_WRITE_CR0] = cr0_write_interception, |
| 2676 | [SVM_EXIT_WRITE_CR3] = emulate_on_interception, | 2705 | [SVM_EXIT_WRITE_CR3] = emulate_on_interception, |
| 2677 | [SVM_EXIT_WRITE_CR4] = emulate_on_interception, | 2706 | [SVM_EXIT_WRITE_CR4] = emulate_on_interception, |
| 2678 | [SVM_EXIT_WRITE_CR8] = cr8_write_interception, | 2707 | [SVM_EXIT_WRITE_CR8] = cr8_write_interception, |
| @@ -3252,6 +3281,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) | |||
| 3252 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; | 3281 | vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; |
| 3253 | 3282 | ||
| 3254 | load_host_msrs(vcpu); | 3283 | load_host_msrs(vcpu); |
| 3284 | kvm_load_ldt(ldt_selector); | ||
| 3255 | loadsegment(fs, fs_selector); | 3285 | loadsegment(fs, fs_selector); |
| 3256 | #ifdef CONFIG_X86_64 | 3286 | #ifdef CONFIG_X86_64 |
| 3257 | load_gs_index(gs_selector); | 3287 | load_gs_index(gs_selector); |
| @@ -3259,7 +3289,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) | |||
| 3259 | #else | 3289 | #else |
| 3260 | loadsegment(gs, gs_selector); | 3290 | loadsegment(gs, gs_selector); |
| 3261 | #endif | 3291 | #endif |
| 3262 | kvm_load_ldt(ldt_selector); | ||
| 3263 | 3292 | ||
| 3264 | reload_tss(vcpu); | 3293 | reload_tss(vcpu); |
| 3265 | 3294 | ||
| @@ -3354,6 +3383,14 @@ static void svm_cpuid_update(struct kvm_vcpu *vcpu) | |||
| 3354 | static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry) | 3383 | static void svm_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry) |
| 3355 | { | 3384 | { |
| 3356 | switch (func) { | 3385 | switch (func) { |
| 3386 | case 0x00000001: | ||
| 3387 | /* Mask out xsave bit as long as it is not supported by SVM */ | ||
| 3388 | entry->ecx &= ~(bit(X86_FEATURE_XSAVE)); | ||
| 3389 | break; | ||
| 3390 | case 0x80000001: | ||
| 3391 | if (nested) | ||
| 3392 | entry->ecx |= (1 << 2); /* Set SVM bit */ | ||
| 3393 | break; | ||
| 3357 | case 0x8000000A: | 3394 | case 0x8000000A: |
| 3358 | entry->eax = 1; /* SVM revision 1 */ | 3395 | entry->eax = 1; /* SVM revision 1 */ |
| 3359 | entry->ebx = 8; /* Lets support 8 ASIDs in case we add proper | 3396 | entry->ebx = 8; /* Lets support 8 ASIDs in case we add proper |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 7bddfab12013..b3986fec7e68 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -828,10 +828,9 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) | |||
| 828 | #endif | 828 | #endif |
| 829 | 829 | ||
| 830 | #ifdef CONFIG_X86_64 | 830 | #ifdef CONFIG_X86_64 |
| 831 | if (is_long_mode(&vmx->vcpu)) { | 831 | rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); |
| 832 | rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); | 832 | if (is_long_mode(&vmx->vcpu)) |
| 833 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); | 833 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); |
| 834 | } | ||
| 835 | #endif | 834 | #endif |
| 836 | for (i = 0; i < vmx->save_nmsrs; ++i) | 835 | for (i = 0; i < vmx->save_nmsrs; ++i) |
| 837 | kvm_set_shared_msr(vmx->guest_msrs[i].index, | 836 | kvm_set_shared_msr(vmx->guest_msrs[i].index, |
| @@ -846,23 +845,23 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx) | |||
| 846 | 845 | ||
| 847 | ++vmx->vcpu.stat.host_state_reload; | 846 | ++vmx->vcpu.stat.host_state_reload; |
| 848 | vmx->host_state.loaded = 0; | 847 | vmx->host_state.loaded = 0; |
| 849 | if (vmx->host_state.fs_reload_needed) | 848 | #ifdef CONFIG_X86_64 |
| 850 | loadsegment(fs, vmx->host_state.fs_sel); | 849 | if (is_long_mode(&vmx->vcpu)) |
| 850 | rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); | ||
| 851 | #endif | ||
| 851 | if (vmx->host_state.gs_ldt_reload_needed) { | 852 | if (vmx->host_state.gs_ldt_reload_needed) { |
| 852 | kvm_load_ldt(vmx->host_state.ldt_sel); | 853 | kvm_load_ldt(vmx->host_state.ldt_sel); |
| 853 | #ifdef CONFIG_X86_64 | 854 | #ifdef CONFIG_X86_64 |
| 854 | load_gs_index(vmx->host_state.gs_sel); | 855 | load_gs_index(vmx->host_state.gs_sel); |
| 855 | wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs); | ||
| 856 | #else | 856 | #else |
| 857 | loadsegment(gs, vmx->host_state.gs_sel); | 857 | loadsegment(gs, vmx->host_state.gs_sel); |
| 858 | #endif | 858 | #endif |
| 859 | } | 859 | } |
| 860 | if (vmx->host_state.fs_reload_needed) | ||
| 861 | loadsegment(fs, vmx->host_state.fs_sel); | ||
| 860 | reload_tss(); | 862 | reload_tss(); |
| 861 | #ifdef CONFIG_X86_64 | 863 | #ifdef CONFIG_X86_64 |
| 862 | if (is_long_mode(&vmx->vcpu)) { | 864 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); |
| 863 | rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); | ||
| 864 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); | ||
| 865 | } | ||
| 866 | #endif | 865 | #endif |
| 867 | if (current_thread_info()->status & TS_USEDFPU) | 866 | if (current_thread_info()->status & TS_USEDFPU) |
| 868 | clts(); | 867 | clts(); |
| @@ -4249,11 +4248,6 @@ static int vmx_get_lpage_level(void) | |||
| 4249 | return PT_PDPE_LEVEL; | 4248 | return PT_PDPE_LEVEL; |
| 4250 | } | 4249 | } |
| 4251 | 4250 | ||
| 4252 | static inline u32 bit(int bitno) | ||
| 4253 | { | ||
| 4254 | return 1 << (bitno & 31); | ||
| 4255 | } | ||
| 4256 | |||
| 4257 | static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | 4251 | static void vmx_cpuid_update(struct kvm_vcpu *vcpu) |
| 4258 | { | 4252 | { |
| 4259 | struct kvm_cpuid_entry2 *best; | 4253 | struct kvm_cpuid_entry2 *best; |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3a09c625d526..a5746de6f402 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -153,11 +153,6 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { | |||
| 153 | 153 | ||
| 154 | u64 __read_mostly host_xcr0; | 154 | u64 __read_mostly host_xcr0; |
| 155 | 155 | ||
| 156 | static inline u32 bit(int bitno) | ||
| 157 | { | ||
| 158 | return 1 << (bitno & 31); | ||
| 159 | } | ||
| 160 | |||
| 161 | static void kvm_on_user_return(struct user_return_notifier *urn) | 156 | static void kvm_on_user_return(struct user_return_notifier *urn) |
| 162 | { | 157 | { |
| 163 | unsigned slot; | 158 | unsigned slot; |
| @@ -1994,9 +1989,9 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function, | |||
| 1994 | 0 /* Reserved, AES */ | F(XSAVE) | 0 /* OSXSAVE */ | F(AVX); | 1989 | 0 /* Reserved, AES */ | F(XSAVE) | 0 /* OSXSAVE */ | F(AVX); |
| 1995 | /* cpuid 0x80000001.ecx */ | 1990 | /* cpuid 0x80000001.ecx */ |
| 1996 | const u32 kvm_supported_word6_x86_features = | 1991 | const u32 kvm_supported_word6_x86_features = |
| 1997 | F(LAHF_LM) | F(CMP_LEGACY) | F(SVM) | 0 /* ExtApicSpace */ | | 1992 | F(LAHF_LM) | F(CMP_LEGACY) | 0 /*SVM*/ | 0 /* ExtApicSpace */ | |
| 1998 | F(CR8_LEGACY) | F(ABM) | F(SSE4A) | F(MISALIGNSSE) | | 1993 | F(CR8_LEGACY) | F(ABM) | F(SSE4A) | F(MISALIGNSSE) | |
| 1999 | F(3DNOWPREFETCH) | 0 /* OSVW */ | 0 /* IBS */ | F(SSE5) | | 1994 | F(3DNOWPREFETCH) | 0 /* OSVW */ | 0 /* IBS */ | F(XOP) | |
| 2000 | 0 /* SKINIT */ | 0 /* WDT */; | 1995 | 0 /* SKINIT */ | 0 /* WDT */; |
| 2001 | 1996 | ||
| 2002 | /* all calls to cpuid_count() should be made on the same cpu */ | 1997 | /* all calls to cpuid_count() should be made on the same cpu */ |
| @@ -2305,6 +2300,7 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu, | |||
| 2305 | !kvm_exception_is_soft(vcpu->arch.exception.nr); | 2300 | !kvm_exception_is_soft(vcpu->arch.exception.nr); |
| 2306 | events->exception.nr = vcpu->arch.exception.nr; | 2301 | events->exception.nr = vcpu->arch.exception.nr; |
| 2307 | events->exception.has_error_code = vcpu->arch.exception.has_error_code; | 2302 | events->exception.has_error_code = vcpu->arch.exception.has_error_code; |
| 2303 | events->exception.pad = 0; | ||
| 2308 | events->exception.error_code = vcpu->arch.exception.error_code; | 2304 | events->exception.error_code = vcpu->arch.exception.error_code; |
| 2309 | 2305 | ||
| 2310 | events->interrupt.injected = | 2306 | events->interrupt.injected = |
| @@ -2318,12 +2314,14 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu, | |||
| 2318 | events->nmi.injected = vcpu->arch.nmi_injected; | 2314 | events->nmi.injected = vcpu->arch.nmi_injected; |
| 2319 | events->nmi.pending = vcpu->arch.nmi_pending; | 2315 | events->nmi.pending = vcpu->arch.nmi_pending; |
| 2320 | events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu); | 2316 | events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu); |
| 2317 | events->nmi.pad = 0; | ||
| 2321 | 2318 | ||
| 2322 | events->sipi_vector = vcpu->arch.sipi_vector; | 2319 | events->sipi_vector = vcpu->arch.sipi_vector; |
| 2323 | 2320 | ||
| 2324 | events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING | 2321 | events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING |
| 2325 | | KVM_VCPUEVENT_VALID_SIPI_VECTOR | 2322 | | KVM_VCPUEVENT_VALID_SIPI_VECTOR |
| 2326 | | KVM_VCPUEVENT_VALID_SHADOW); | 2323 | | KVM_VCPUEVENT_VALID_SHADOW); |
| 2324 | memset(&events->reserved, 0, sizeof(events->reserved)); | ||
| 2327 | } | 2325 | } |
| 2328 | 2326 | ||
| 2329 | static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, | 2327 | static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, |
| @@ -2366,6 +2364,7 @@ static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu, | |||
| 2366 | dbgregs->dr6 = vcpu->arch.dr6; | 2364 | dbgregs->dr6 = vcpu->arch.dr6; |
| 2367 | dbgregs->dr7 = vcpu->arch.dr7; | 2365 | dbgregs->dr7 = vcpu->arch.dr7; |
| 2368 | dbgregs->flags = 0; | 2366 | dbgregs->flags = 0; |
| 2367 | memset(&dbgregs->reserved, 0, sizeof(dbgregs->reserved)); | ||
| 2369 | } | 2368 | } |
| 2370 | 2369 | ||
| 2371 | static int kvm_vcpu_ioctl_x86_set_debugregs(struct kvm_vcpu *vcpu, | 2370 | static int kvm_vcpu_ioctl_x86_set_debugregs(struct kvm_vcpu *vcpu, |
| @@ -2849,6 +2848,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps) | |||
| 2849 | sizeof(ps->channels)); | 2848 | sizeof(ps->channels)); |
| 2850 | ps->flags = kvm->arch.vpit->pit_state.flags; | 2849 | ps->flags = kvm->arch.vpit->pit_state.flags; |
| 2851 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); | 2850 | mutex_unlock(&kvm->arch.vpit->pit_state.lock); |
| 2851 | memset(&ps->reserved, 0, sizeof(ps->reserved)); | ||
| 2852 | return r; | 2852 | return r; |
| 2853 | } | 2853 | } |
| 2854 | 2854 | ||
| @@ -2912,10 +2912,6 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 2912 | struct kvm_memslots *slots, *old_slots; | 2912 | struct kvm_memslots *slots, *old_slots; |
| 2913 | unsigned long *dirty_bitmap; | 2913 | unsigned long *dirty_bitmap; |
| 2914 | 2914 | ||
| 2915 | spin_lock(&kvm->mmu_lock); | ||
| 2916 | kvm_mmu_slot_remove_write_access(kvm, log->slot); | ||
| 2917 | spin_unlock(&kvm->mmu_lock); | ||
| 2918 | |||
| 2919 | r = -ENOMEM; | 2915 | r = -ENOMEM; |
| 2920 | dirty_bitmap = vmalloc(n); | 2916 | dirty_bitmap = vmalloc(n); |
| 2921 | if (!dirty_bitmap) | 2917 | if (!dirty_bitmap) |
| @@ -2937,6 +2933,10 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm, | |||
| 2937 | dirty_bitmap = old_slots->memslots[log->slot].dirty_bitmap; | 2933 | dirty_bitmap = old_slots->memslots[log->slot].dirty_bitmap; |
| 2938 | kfree(old_slots); | 2934 | kfree(old_slots); |
| 2939 | 2935 | ||
| 2936 | spin_lock(&kvm->mmu_lock); | ||
| 2937 | kvm_mmu_slot_remove_write_access(kvm, log->slot); | ||
| 2938 | spin_unlock(&kvm->mmu_lock); | ||
| 2939 | |||
| 2940 | r = -EFAULT; | 2940 | r = -EFAULT; |
| 2941 | if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) { | 2941 | if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) { |
| 2942 | vfree(dirty_bitmap); | 2942 | vfree(dirty_bitmap); |
| @@ -3229,6 +3229,7 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
| 3229 | now_ns = timespec_to_ns(&now); | 3229 | now_ns = timespec_to_ns(&now); |
| 3230 | user_ns.clock = kvm->arch.kvmclock_offset + now_ns; | 3230 | user_ns.clock = kvm->arch.kvmclock_offset + now_ns; |
| 3231 | user_ns.flags = 0; | 3231 | user_ns.flags = 0; |
| 3232 | memset(&user_ns.pad, 0, sizeof(user_ns.pad)); | ||
| 3232 | 3233 | ||
| 3233 | r = -EFAULT; | 3234 | r = -EFAULT; |
| 3234 | if (copy_to_user(argp, &user_ns, sizeof(user_ns))) | 3235 | if (copy_to_user(argp, &user_ns, sizeof(user_ns))) |
| @@ -5111,6 +5112,8 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
| 5111 | 5112 | ||
| 5112 | mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4; | 5113 | mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4; |
| 5113 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); | 5114 | kvm_x86_ops->set_cr4(vcpu, sregs->cr4); |
| 5115 | if (sregs->cr4 & X86_CR4_OSXSAVE) | ||
| 5116 | update_cpuid(vcpu); | ||
| 5114 | if (!is_long_mode(vcpu) && is_pae(vcpu)) { | 5117 | if (!is_long_mode(vcpu) && is_pae(vcpu)) { |
| 5115 | load_pdptrs(vcpu, vcpu->arch.cr3); | 5118 | load_pdptrs(vcpu, vcpu->arch.cr3); |
| 5116 | mmu_reset_needed = 1; | 5119 | mmu_reset_needed = 1; |
diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h index b7a404722d2b..0bf327453499 100644 --- a/arch/x86/kvm/x86.h +++ b/arch/x86/kvm/x86.h | |||
| @@ -65,6 +65,11 @@ static inline int is_paging(struct kvm_vcpu *vcpu) | |||
| 65 | return kvm_read_cr0_bits(vcpu, X86_CR0_PG); | 65 | return kvm_read_cr0_bits(vcpu, X86_CR0_PG); |
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | static inline u32 bit(int bitno) | ||
| 69 | { | ||
| 70 | return 1 << (bitno & 31); | ||
| 71 | } | ||
| 72 | |||
| 68 | void kvm_before_handle_nmi(struct kvm_vcpu *vcpu); | 73 | void kvm_before_handle_nmi(struct kvm_vcpu *vcpu); |
| 69 | void kvm_after_handle_nmi(struct kvm_vcpu *vcpu); | 74 | void kvm_after_handle_nmi(struct kvm_vcpu *vcpu); |
| 70 | 75 | ||
