From: Ingo Molnar Date: Fri, 13 Feb 2009 08:49:38 +0000 (+0100) Subject: Merge branch 'x86/core' into perfcounters/core X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=b1864e9a1afef41709886072c6e6248def0386f4;p=linux-beck.git Merge branch 'x86/core' into perfcounters/core Conflicts: arch/x86/Kconfig arch/x86/kernel/apic.c arch/x86/kernel/setup_percpu.c --- b1864e9a1afef41709886072c6e6248def0386f4 diff --cc arch/x86/Kconfig index 97d3bd17b7df,1042d69b267d..f2d0d24c0b68 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@@ -691,8 -684,7 +684,8 @@@ config X86_UP_IOAPI config X86_LOCAL_APIC def_bool y - depends on X86_64 || (X86_32 && (X86_UP_APIC || (SMP && !X86_VOYAGER) || X86_GENERICARCH)) + depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC + select HAVE_PERF_COUNTERS if (!M386 && !M486) config X86_IO_APIC def_bool y diff --cc arch/x86/include/asm/irq_vectors.h index 0e2220bb3142,b07278c55e9e..b66b518ff000 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h @@@ -86,13 -104,13 +104,18 @@@ * to work around the 'lost local interrupt if more than 2 IRQ * sources per level' errata. */ - #define LOCAL_TIMER_VECTOR 0xef + #define LOCAL_TIMER_VECTOR 0xef + + /* + * Performance monitoring interrupt vector: + */ + #define LOCAL_PERF_VECTOR 0xee +/* + * Performance monitoring interrupt vector: + */ +#define LOCAL_PERF_VECTOR 0xee + /* * First APIC vector available to drivers: (vectors 0x30-0xee) we * start at 0x31(0x41) to spread out vectors evenly between priority diff --cc arch/x86/kernel/apic.c index abfa0b641aea,cf2ca19e62da..c9aed4510585 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic.c @@@ -14,52 -14,71 +14,72 @@@ * Mikael Pettersson : PM converted to driver model. */ - #include - - #include - #include - #include - #include - #include #include - #include - #include - #include - #include + #include #include + #include + #include + #include + #include + #include #include - #include + #include + #include + #include #include - #include - #include + #include + #include + #include #include - #include + #include + #include +#include - #include - #include - #include - #include #include - #include #include + #include + #include + #include #include - #include + #include #include #include - #include + #include + #include + #include + #include #include - #include - #include - #include + unsigned int num_processors; + + unsigned disabled_cpus __cpuinitdata; + + /* Processor that is doing the boot up */ + unsigned int boot_cpu_physical_apicid = -1U; /* - * Sanity check + * The highest APIC ID seen during enumeration. + * + * This determines the messaging protocol we can use: if all APIC IDs + * are in the 0 ... 7 range, then we can use logical addressing which + * has some performance advantages (better broadcasting). + * + * If there's an APIC ID above 8, we use physical addressing. */ - #if ((SPURIOUS_APIC_VECTOR & 0x0F) != 0x0F) - # error SPURIOUS_APIC_VECTOR definition error - #endif + unsigned int max_physical_apicid; + + /* + * Bitmask of physically existing CPUs: + */ + physid_mask_t phys_cpu_present_map; + + /* + * Map cpu index to physical APIC ID + */ + DEFINE_EARLY_PER_CPU(u16, x86_cpu_to_apicid, BAD_APICID); + DEFINE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid, BAD_APICID); + EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid); + EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid); #ifdef CONFIG_X86_32 /* diff --cc arch/x86/kernel/irqinit_32.c index f6ff71cdaba8,bf629cadec1a..520e6c1c5d22 --- a/arch/x86/kernel/irqinit_32.c +++ b/arch/x86/kernel/irqinit_32.c @@@ -154,41 -178,16 +163,44 @@@ static void __init apic_intr_init(void /* IPI vectors for APIC spurious and error interrupts */ alloc_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt); alloc_intr_gate(ERROR_APIC_VECTOR, error_interrupt); -#endif +# ifdef CONFIG_PERF_COUNTERS + alloc_intr_gate(LOCAL_PERF_VECTOR, perf_counter_interrupt); +# endif -#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_MCE_P4THERMAL) +# ifdef CONFIG_X86_MCE_P4THERMAL /* thermal monitor LVT interrupt */ alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); +# endif #endif +} + +/* Overridden in paravirt.c */ +void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); + +void __init native_init_IRQ(void) +{ + int i; + + /* all the set up before the call gates are initialised */ + pre_intr_init_hook(); + + apic_intr_init(); + + /* + * Cover the whole vector space, no vector can escape + * us. (some of these will be overridden and become + * 'special' SMP interrupts) + */ + for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { + int vector = FIRST_EXTERNAL_VECTOR + i; + /* SYSCALL_VECTOR was reserved in trap_init. */ + if (!test_bit(vector, used_vectors)) + set_intr_gate(vector, interrupt[i]); + } + if (!acpi_ioapic) + setup_irq(2, &irq2); + /* setup after call gates are initialised (usually add in * the architecture specific gates) */