@@ -1003,14 +1003,12 @@ bool_t vlapic_msr_set(struct vlapic *vlapic, uint64=
_t value)
}
else
{
- if ( unlikely(vlapic_x2apic_mode(vlapic)) )
- return 0;
vlapic->hw.disabled |=3D VLAPIC_HW_DISABLED;
pt_may_unmask_irq(vlapic_domain(vlapic), NULL);
}
}
- else if ( !(value & MSR_IA32_APICBASE_ENABLE) &&
- unlikely(value & MSR_IA32_APICBASE_EXTD) )
+ else if ( ((vlapic->hw.apic_base_msr ^ value) & MSR_IA32_APICBASE_EXTD=
) &&
+ unlikely(!vlapic_xapic_mode(vlapic)) )
return 0;
=20
vlapic->hw.apic_base_msr =3D value;
pic.h
@@ -51,8 +51,12 @@
=20
#define vlapic_base_address(vlapic) \
((vlapic)->hw.apic_base_msr & MSR_IA32_APICBASE_BASE)
+/* Only check EXTD bit as EXTD can't be set if it is disabled by hardware =
*/
#define vlapic_x2apic_mode(vlapic) \
((vlapic)->hw.apic_base_msr & MSR_IA32_APICBASE_EXTD)
+#define vlapic_xapic_mode(vlapic) \
+ (!vlapic_hw_disabled(vlapic) && \
+ !((vlapic)->hw.apic_base_msr & MSR_IA32_APICBASE_EXTD))
=20
/*