Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[linux-2.6-microblaze.git] / arch / x86 / kvm / lapic.c
index 4ce2ddd..5ccbee7 100644 (file)
@@ -354,7 +354,6 @@ static inline int apic_lvt_nmi_mode(u32 lvt_val)
 void kvm_apic_set_version(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
-       struct kvm_cpuid_entry2 *feat;
        u32 v = APIC_VERSION;
 
        if (!lapic_in_kernel(vcpu))
@@ -367,8 +366,7 @@ void kvm_apic_set_version(struct kvm_vcpu *vcpu)
         * version first and level-triggered interrupts never get EOIed in
         * IOAPIC.
         */
-       feat = kvm_find_cpuid_entry(apic->vcpu, 0x1, 0);
-       if (feat && (feat->ecx & (1 << (X86_FEATURE_X2APIC & 31))) &&
+       if (guest_cpuid_has(vcpu, X86_FEATURE_X2APIC) &&
            !ioapic_in_kernel(vcpu->kvm))
                v |= APIC_LVR_DIRECTED_EOI;
        kvm_lapic_set_reg(apic, APIC_LVR, v);
@@ -2068,7 +2066,7 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
        case APIC_TDCR: {
                uint32_t old_divisor = apic->divide_count;
 
-               kvm_lapic_set_reg(apic, APIC_TDCR, val);
+               kvm_lapic_set_reg(apic, APIC_TDCR, val & 0xb);
                update_divide_count(apic);
                if (apic->divide_count != old_divisor &&
                                apic->lapic_timer.period) {
@@ -2085,7 +2083,8 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
 
        case APIC_SELF_IPI:
                if (apic_x2apic_mode(apic)) {
-                       kvm_lapic_reg_write(apic, APIC_ICR, 0x40000 | (val & 0xff));
+                       kvm_lapic_reg_write(apic, APIC_ICR,
+                                           APIC_DEST_SELF | (val & APIC_VECTOR_MASK));
                } else
                        ret = 1;
                break;
@@ -2232,7 +2231,7 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
        vcpu->arch.apic_base = value;
 
        if ((old_value ^ value) & MSR_IA32_APICBASE_ENABLE)
-               kvm_update_cpuid(vcpu);
+               kvm_update_cpuid_runtime(vcpu);
 
        if (!apic)
                return;