aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 9d068966fb2a..1ddcad452add 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1913,7 +1913,8 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
1913 1913
1914 events->sipi_vector = vcpu->arch.sipi_vector; 1914 events->sipi_vector = vcpu->arch.sipi_vector;
1915 1915
1916 events->flags = 0; 1916 events->flags = (KVM_VCPUEVENT_VALID_NMI_PENDING
1917 | KVM_VCPUEVENT_VALID_SIPI_VECTOR);
1917 1918
1918 vcpu_put(vcpu); 1919 vcpu_put(vcpu);
1919} 1920}
@@ -1921,7 +1922,8 @@ static void kvm_vcpu_ioctl_x86_get_vcpu_events(struct kvm_vcpu *vcpu,
1921static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu, 1922static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
1922 struct kvm_vcpu_events *events) 1923 struct kvm_vcpu_events *events)
1923{ 1924{
1924 if (events->flags) 1925 if (events->flags & ~(KVM_VCPUEVENT_VALID_NMI_PENDING
1926 | KVM_VCPUEVENT_VALID_SIPI_VECTOR))
1925 return -EINVAL; 1927 return -EINVAL;
1926 1928
1927 vcpu_load(vcpu); 1929 vcpu_load(vcpu);
@@ -1938,10 +1940,12 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
1938 kvm_pic_clear_isr_ack(vcpu->kvm); 1940 kvm_pic_clear_isr_ack(vcpu->kvm);
1939 1941
1940 vcpu->arch.nmi_injected = events->nmi.injected; 1942 vcpu->arch.nmi_injected = events->nmi.injected;
1941 vcpu->arch.nmi_pending = events->nmi.pending; 1943 if (events->flags & KVM_VCPUEVENT_VALID_NMI_PENDING)
1944 vcpu->arch.nmi_pending = events->nmi.pending;
1942 kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked); 1945 kvm_x86_ops->set_nmi_mask(vcpu, events->nmi.masked);
1943 1946
1944 vcpu->arch.sipi_vector = events->sipi_vector; 1947 if (events->flags & KVM_VCPUEVENT_VALID_SIPI_VECTOR)
1948 vcpu->arch.sipi_vector = events->sipi_vector;
1945 1949
1946 vcpu_put(vcpu); 1950 vcpu_put(vcpu);
1947 1951
@@ -5068,12 +5072,13 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
5068 GFP_KERNEL); 5072 GFP_KERNEL);
5069 if (!vcpu->arch.mce_banks) { 5073 if (!vcpu->arch.mce_banks) {
5070 r = -ENOMEM; 5074 r = -ENOMEM;
5071 goto fail_mmu_destroy; 5075 goto fail_free_lapic;
5072 } 5076 }
5073 vcpu->arch.mcg_cap = KVM_MAX_MCE_BANKS; 5077 vcpu->arch.mcg_cap = KVM_MAX_MCE_BANKS;
5074 5078
5075 return 0; 5079 return 0;
5076 5080fail_free_lapic:
5081 kvm_free_lapic(vcpu);
5077fail_mmu_destroy: 5082fail_mmu_destroy:
5078 kvm_mmu_destroy(vcpu); 5083 kvm_mmu_destroy(vcpu);
5079fail_free_pio_data: 5084fail_free_pio_data:
@@ -5084,6 +5089,7 @@ fail:
5084 5089
5085void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) 5090void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu)
5086{ 5091{
5092 kfree(vcpu->arch.mce_banks);
5087 kvm_free_lapic(vcpu); 5093 kvm_free_lapic(vcpu);
5088 down_read(&vcpu->kvm->slots_lock); 5094 down_read(&vcpu->kvm->slots_lock);
5089 kvm_mmu_destroy(vcpu); 5095 kvm_mmu_destroy(vcpu);