current_cpu_data becomes valid only relatively late in the boot process, so looking there for a particular feature early in the game would generally give the appearance of the feature being unavailable. Getting this wrong means that at kexec time the system would get returned to xAPIC mode, causing disconnect_bsp_APIC() to try to access the APIC page, which on systems with x2APIC pre-enabled will never get set up. Signed-off-by: Jan Beulich <jbeulich@suse.com> --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -1474,7 +1474,7 @@ enum apic_mode current_local_apic_mode(v /* Reading EXTD bit from the MSR is only valid if CPUID * says so, else reserved */ - if ( cpu_has(¤t_cpu_data, X86_FEATURE_X2APIC) + if ( boot_cpu_has(X86_FEATURE_X2APIC) && (msr_contents & MSR_IA32_APICBASE_EXTD) ) return APIC_MODE_X2APIC; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
On 23/05/2013 08:07, "Jan Beulich" <JBeulich@suse.com> wrote:> current_cpu_data becomes valid only relatively late in the boot > process, so looking there for a particular feature early in the game > would generally give the appearance of the feature being unavailable. > > Getting this wrong means that at kexec time the system would get > returned to xAPIC mode, causing disconnect_bsp_APIC() to try to access > the APIC page, which on systems with x2APIC pre-enabled will never get > set up. > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Acked-by: Keir Fraser <keir@xen.org>> --- a/xen/arch/x86/apic.c > +++ b/xen/arch/x86/apic.c > @@ -1474,7 +1474,7 @@ enum apic_mode current_local_apic_mode(v > > /* Reading EXTD bit from the MSR is only valid if CPUID > * says so, else reserved */ > - if ( cpu_has(¤t_cpu_data, X86_FEATURE_X2APIC) > + if ( boot_cpu_has(X86_FEATURE_X2APIC) > && (msr_contents & MSR_IA32_APICBASE_EXTD) ) > return APIC_MODE_X2APIC; > > > >
On 23/05/13 08:07, Jan Beulich wrote:> current_cpu_data becomes valid only relatively late in the boot > process, so looking there for a particular feature early in the game > would generally give the appearance of the feature being unavailable. > > Getting this wrong means that at kexec time the system would get > returned to xAPIC mode, causing disconnect_bsp_APIC() to try to access > the APIC page, which on systems with x2APIC pre-enabled will never get > set up. > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>> > --- a/xen/arch/x86/apic.c > +++ b/xen/arch/x86/apic.c > @@ -1474,7 +1474,7 @@ enum apic_mode current_local_apic_mode(v > > /* Reading EXTD bit from the MSR is only valid if CPUID > * says so, else reserved */ > - if ( cpu_has(¤t_cpu_data, X86_FEATURE_X2APIC) > + if ( boot_cpu_has(X86_FEATURE_X2APIC) > && (msr_contents & MSR_IA32_APICBASE_EXTD) ) > return APIC_MODE_X2APIC; > > > >