[patch 08/13] x86: fix clear_local_APIC() in the presence of x2apic

Suresh Siddha
2009-03-17T00:32:40Z

[-- Attachment #1: fix_clear_local_apic_with_x2apic.patch --]
[-- Type: text/plain, Size: 1819 bytes --]

We were not clearing the local APIC in clear_local_APIC() in the
presence of x2apic. Fix it.

Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
---

Index: tip/arch/x86/kernel/apic/apic.c
===================================================================
--- tip.orig/arch/x86/kernel/apic/apic.c
+++ tip/arch/x86/kernel/apic/apic.c
@@ -812,7 +812,7 @@ void clear_local_APIC(void)
u32 v;

/* APIC hasn't been mapped yet */
- if (!apic_phys)
+ if (!x2apic && !apic_phys)
return;

maxlvt = lapic_get_maxlvt();
@@ -1527,12 +1527,10 @@ void __init early_init_lapic_mapping(voi
*/
void __init init_apic_mappings(void)
{
-#ifdef CONFIG_X86_X2APIC
if (x2apic) {
boot_cpu_physical_apicid = read_apic_id();
return;
}
-#endif

/*
* If no local APIC can be found then set up a fake all
@@ -1976,12 +1974,9 @@ static int lapic_resume(struct sys_devic

local_irq_save(flags);

-#ifdef CONFIG_X86_X2APIC
if (x2apic)
enable_x2apic();
- else
-#endif
- {
+ else {
/*
* Make sure the APICBASE points to the right address
*
Index: tip/arch/x86/include/asm/apic.h
===================================================================
--- tip.orig/arch/x86/include/asm/apic.h
+++ tip/arch/x86/include/asm/apic.h
@@ -184,6 +184,9 @@ static inline int x2apic_enabled(void)
{
return 0;
}
+
+#define x2apic 0
+
#endif

extern int get_physical_broadcast(void);
Index: tip/arch/x86/include/asm/irq_remapping.h
===================================================================
--- tip.orig/arch/x86/include/asm/irq_remapping.h
+++ tip/arch/x86/include/asm/irq_remapping.h
@@ -1,8 +1,6 @@
#ifndef _ASM_X86_IRQ_REMAPPING_H
#define _ASM_X86_IRQ_REMAPPING_H

-extern int x2apic;
-
#define IRTE_DEST(dest) ((x2apic) ? dest : dest << 8)

#endif /* _ASM_X86_IRQ_REMAPPING_H */

--