|
@@ -2560,6 +2560,7 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
|
|
|
!kvm_exception_is_soft(vcpu->arch.exception.nr);
|
|
|
events->exception.nr = vcpu->arch.exception.nr;
|
|
|
events->exception.has_error_code = vcpu->arch.exception.has_error_code;
|
|
|
+ events->exception.pad = 0;
|
|
|
events->exception.error_code = vcpu->arch.exception.error_code;
|
|
|
|
|
|
events->interrupt.injected =
|
|
@@ -2573,12 +2574,14 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
|
|
|
events->nmi.injected = vcpu->arch.nmi_injected;
|
|
|
events->nmi.pending = vcpu->arch.nmi_pending;
|
|
|
events->nmi.masked = kvm_x86_ops->get_nmi_mask(vcpu);
|
|
|
+ events->nmi.pad = 0;
|
|
|
|
|
|
events->sipi_vector = vcpu->arch.sipi_vector;
|
|
|
|
|
|
events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING
|
|
|
| KVM_VCPUEVENT_VALID_SIPI_VECTOR
|
|
|
| KVM_VCPUEVENT_VALID_SHADOW);
|
|
|
+ memset(&events->reserved, 0, sizeof(events->reserved));
|
|
|
}
|
|
|
|
|
|
static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
|
|
@@ -2623,6 +2626,7 @@ static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu,
|
|
|
dbgregs->dr6 = vcpu->arch.dr6;
|
|
|
dbgregs->dr7 = vcpu->arch.dr7;
|
|
|
dbgregs->flags = 0;
|
|
|
+ memset(&dbgregs->reserved, 0, sizeof(dbgregs->reserved));
|
|
|
}
|
|
|
|
|
|
static int kvm_vcpu_ioctl_x86_set_debugregs(struct kvm_vcpu *vcpu,
|
|
@@ -3106,6 +3110,7 @@ static int kvm_vm_ioctl_get_pit2(struct kvm *kvm, struct kvm_pit_state2 *ps)
|
|
|
sizeof(ps->channels));
|
|
|
ps->flags = kvm->arch.vpit->pit_state.flags;
|
|
|
mutex_unlock(&kvm->arch.vpit->pit_state.lock);
|
|
|
+ memset(&ps->reserved, 0, sizeof(ps->reserved));
|
|
|
return r;
|
|
|
}
|
|
|
|
|
@@ -3169,10 +3174,6 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
|
|
struct kvm_memslots *slots, *old_slots;
|
|
|
unsigned long *dirty_bitmap;
|
|
|
|
|
|
- spin_lock(&kvm->mmu_lock);
|
|
|
- kvm_mmu_slot_remove_write_access(kvm, log->slot);
|
|
|
- spin_unlock(&kvm->mmu_lock);
|
|
|
-
|
|
|
r = -ENOMEM;
|
|
|
dirty_bitmap = vmalloc(n);
|
|
|
if (!dirty_bitmap)
|
|
@@ -3194,6 +3195,10 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
|
|
|
dirty_bitmap = old_slots->memslots[log->slot].dirty_bitmap;
|
|
|
kfree(old_slots);
|
|
|
|
|
|
+ spin_lock(&kvm->mmu_lock);
|
|
|
+ kvm_mmu_slot_remove_write_access(kvm, log->slot);
|
|
|
+ spin_unlock(&kvm->mmu_lock);
|
|
|
+
|
|
|
r = -EFAULT;
|
|
|
if (copy_to_user(log->dirty_bitmap, dirty_bitmap, n)) {
|
|
|
vfree(dirty_bitmap);
|
|
@@ -3486,6 +3491,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
|
user_ns.clock = kvm->arch.kvmclock_offset + now_ns;
|
|
|
local_irq_enable();
|
|
|
user_ns.flags = 0;
|
|
|
+ memset(&user_ns.pad, 0, sizeof(user_ns.pad));
|
|
|
|
|
|
r = -EFAULT;
|
|
|
if (copy_to_user(argp, &user_ns, sizeof(user_ns)))
|
|
@@ -3972,8 +3978,10 @@ int kvm_emulate_wbinvd(struct kvm_vcpu *vcpu)
|
|
|
return X86EMUL_CONTINUE;
|
|
|
|
|
|
if (kvm_x86_ops->has_wbinvd_exit()) {
|
|
|
+ preempt_disable();
|
|
|
smp_call_function_many(vcpu->arch.wbinvd_dirty_mask,
|
|
|
wbinvd_ipi, NULL, 1);
|
|
|
+ preempt_enable();
|
|
|
cpumask_clear(vcpu->arch.wbinvd_dirty_mask);
|
|
|
}
|
|
|
wbinvd();
|