diff options
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 25 |
1 files changed, 14 insertions, 11 deletions
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; |