From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] ix86: re-do permanent disabling of x2apic Date: Thu, 10 Feb 2011 13:50:15 +0000 Message-ID: <4D53FB2702000078000313E3@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=__Part9CB08F07.1__=" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "xen-devel@lists.xensource.com" Cc: Gang Wei List-Id: xen-devel@lists.xenproject.org This is a MIME message. If you are reading this text, you may want to consider changing to a mail reader or gateway that understands how to properly handle MIME multipart messages. --=__Part9CB08F07.1__= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Move logic into check_x2apic_preenabled() (to make sure generic_apic_probe() doesn't see genapic already set) and disable dead code on ix86. Signed-off-by: Jan Beulich --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -71,10 +71,12 @@ static int enable_local_apic __initdata=20 */ int apic_verbosity; =20 +#ifndef __i386__ static bool_t __initdata opt_x2apic =3D 1; boolean_param("x2apic", opt_x2apic); =20 bool_t __read_mostly x2apic_enabled =3D 0; +#endif bool_t __read_mostly directed_eoi_enabled =3D 0; =20 /* @@ -962,20 +964,8 @@ void __init x2apic_bsp_setup(void) return; =20 #ifdef __i386__ - clear_bit(X86_FEATURE_X2APIC, boot_cpu_data.x86_capability); - if ( x2apic_enabled ) - { - uint64_t msr_content; - rdmsrl(MSR_IA32_APICBASE, msr_content); - msr_content &=3D ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EX= TD); - wrmsrl(MSR_IA32_APICBASE, msr_content); - msr_content |=3D MSR_IA32_APICBASE_ENABLE; - wrmsrl(MSR_IA32_APICBASE, msr_content); - x2apic_enabled =3D 0; - } - printk("x2APIC disabled permanently on x86_32.\n"); - return; -#endif + BUG(); +#else =20 if ( !opt_x2apic ) { @@ -1038,6 +1028,7 @@ restore_out: unmask_8259A(); =20 out: +#endif /* !__i386__ */ if ( ioapic_entries ) free_ioapic_entries(ioapic_entries); } --- a/xen/arch/x86/genapic/x2apic.c +++ b/xen/arch/x86/genapic/x2apic.c @@ -29,6 +29,8 @@ #include #include =20 +#ifndef __i386__ + static bool_t __initdata x2apic_phys; /* By default we use logical = cluster mode. */ boolean_param("x2apic_phys", x2apic_phys); =20 @@ -126,6 +128,8 @@ const struct genapic *__init apic_x2apic return x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster; } =20 +#endif /* !__i386__ */ + void __init check_x2apic_preenabled(void) { u32 lo, hi; @@ -138,7 +142,19 @@ void __init check_x2apic_preenabled(void if ( lo & MSR_IA32_APICBASE_EXTD ) { printk("x2APIC mode is already enabled by BIOS.\n"); +#ifndef __i386__ x2apic_enabled =3D 1; genapic =3D apic_x2apic_probe(); +#else + lo &=3D ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD); + wrmsr(MSR_IA32_APICBASE, lo, hi); + lo |=3D MSR_IA32_APICBASE_ENABLE; + wrmsr(MSR_IA32_APICBASE, lo, hi); + printk("x2APIC disabled permanently on x86_32.\n"); +#endif } + +#ifdef __i386__ + clear_bit(X86_FEATURE_X2APIC, boot_cpu_data.x86_capability); +#endif } --- a/xen/include/asm-x86/apic.h +++ b/xen/include/asm-x86/apic.h @@ -22,7 +22,11 @@ #define IO_APIC_REDIR_DEST_PHYSICAL 0x00000 =20 extern int apic_verbosity; +#ifdef __i386__ +#define x2apic_enabled 0 +#else extern bool_t x2apic_enabled; +#endif extern bool_t directed_eoi_enabled; =20 void check_x2apic_preenabled(void); --=__Part9CB08F07.1__= Content-Type: text/plain; name="i386-no-x2apic.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="i386-no-x2apic.patch" Move logic into check_x2apic_preenabled() (to make sure=0Ageneric_apic_prob= e() doesn't see genapic already set) and disable dead=0Acode on ix86.=0A=0A= Signed-off-by: Jan Beulich =0A=0A--- a/xen/arch/x86/ap= ic.c=0A+++ b/xen/arch/x86/apic.c=0A@@ -71,10 +71,12 @@ static int = enable_local_apic __initdata =0A */=0A int apic_verbosity;=0A =0A+#ifndef = __i386__=0A static bool_t __initdata opt_x2apic =3D 1;=0A boolean_param("x2= apic", opt_x2apic);=0A =0A bool_t __read_mostly x2apic_enabled =3D = 0;=0A+#endif=0A bool_t __read_mostly directed_eoi_enabled =3D 0;=0A =0A = /*=0A@@ -962,20 +964,8 @@ void __init x2apic_bsp_setup(void)=0A = return;=0A =0A #ifdef __i386__=0A- clear_bit(X86_FEATURE_X2APIC, = boot_cpu_data.x86_capability);=0A- if ( x2apic_enabled )=0A- {=0A- = uint64_t msr_content;=0A- rdmsrl(MSR_IA32_APICBASE, msr_content= );=0A- msr_content &=3D ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBA= SE_EXTD);=0A- wrmsrl(MSR_IA32_APICBASE, msr_content);=0A- = msr_content |=3D MSR_IA32_APICBASE_ENABLE;=0A- wrmsrl(MSR_IA32_APICB= ASE, msr_content);=0A- x2apic_enabled =3D 0;=0A- }=0A- = printk("x2APIC disabled permanently on x86_32.\n");=0A- return;=0A-#endi= f=0A+ BUG();=0A+#else=0A =0A if ( !opt_x2apic )=0A {=0A@@ = -1038,6 +1028,7 @@ restore_out:=0A unmask_8259A();=0A =0A out:=0A+#endi= f /* !__i386__ */=0A if ( ioapic_entries )=0A free_ioapic_entri= es(ioapic_entries);=0A }=0A--- a/xen/arch/x86/genapic/x2apic.c=0A+++ = b/xen/arch/x86/genapic/x2apic.c=0A@@ -29,6 +29,8 @@=0A #include = =0A #include =0A =0A+#ifndef __i386__=0A+= =0A static bool_t __initdata x2apic_phys; /* By default we use logical = cluster mode. */=0A boolean_param("x2apic_phys", x2apic_phys);=0A =0A@@ = -126,6 +128,8 @@ const struct genapic *__init apic_x2apic=0A return = x2apic_phys ? &apic_x2apic_phys : &apic_x2apic_cluster;=0A }=0A =0A+#endif = /* !__i386__ */=0A+=0A void __init check_x2apic_preenabled(void)=0A {=0A = u32 lo, hi;=0A@@ -138,7 +142,19 @@ void __init check_x2apic_preenabled(vo= id=0A if ( lo & MSR_IA32_APICBASE_EXTD )=0A {=0A printk("x2= APIC mode is already enabled by BIOS.\n");=0A+#ifndef __i386__=0A = x2apic_enabled =3D 1;=0A genapic =3D apic_x2apic_probe();=0A+#else= =0A+ lo &=3D ~(MSR_IA32_APICBASE_ENABLE | MSR_IA32_APICBASE_EXTD);= =0A+ wrmsr(MSR_IA32_APICBASE, lo, hi);=0A+ lo |=3D MSR_IA32_A= PICBASE_ENABLE;=0A+ wrmsr(MSR_IA32_APICBASE, lo, hi);=0A+ = printk("x2APIC disabled permanently on x86_32.\n");=0A+#endif=0A = }=0A+=0A+#ifdef __i386__=0A+ clear_bit(X86_FEATURE_X2APIC, boot_cpu_data= .x86_capability);=0A+#endif=0A }=0A--- a/xen/include/asm-x86/apic.h=0A+++ = b/xen/include/asm-x86/apic.h=0A@@ -22,7 +22,11 @@=0A #define IO_APIC_REDIR_= DEST_PHYSICAL 0x00000=0A =0A extern int apic_verbosity;=0A+#ifdef = __i386__=0A+#define x2apic_enabled 0=0A+#else=0A extern bool_t x2apic_enabl= ed;=0A+#endif=0A extern bool_t directed_eoi_enabled;=0A =0A void check_x2ap= ic_preenabled(void);=0A --=__Part9CB08F07.1__= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --=__Part9CB08F07.1__=--