X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=include%2Fasm-x86%2Fsmp_64.h;h=c46585e09ea1cd596e4c10f4a4cc3ba535acff23;hb=2ba95bcbe68d692f549fb10809f15681a25ff6fb;hp=3f303d2365ed68d9b207b43976bd1c3aa2282e51;hpb=4fa435018d740cb83d74c92306aa1f796da91ddd;p=~andy%2Flinux diff --git a/include/asm-x86/smp_64.h b/include/asm-x86/smp_64.h index 3f303d2365e..c46585e09ea 100644 --- a/include/asm-x86/smp_64.h +++ b/include/asm-x86/smp_64.h @@ -1,117 +1,77 @@ #ifndef __ASM_SMP_H #define __ASM_SMP_H -/* - * We need the APIC definitions automatically as part of 'smp.h' - */ -#include #include -#include #include -extern int disable_apic; -#include +/* + * We need the APIC definitions automatically as part of 'smp.h' + */ #include #include -#include - -#ifdef CONFIG_SMP - +#include #include +#include -struct pt_regs; - -extern cpumask_t cpu_present_mask; -extern cpumask_t cpu_possible_map; -extern cpumask_t cpu_online_map; -extern cpumask_t cpu_callout_map; extern cpumask_t cpu_initialized; +extern cpumask_t cpu_callin_map; -/* - * Private routines/data - */ - -extern void smp_alloc_memory(void); -extern volatile unsigned long smp_invalidate_needed; -extern void lock_ipi_call_lock(void); -extern void unlock_ipi_call_lock(void); -extern int smp_num_siblings; -extern void smp_send_reschedule(int cpu); +extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *), + void *info, int wait); + +#ifdef CONFIG_SMP -extern cpumask_t cpu_sibling_map[NR_CPUS]; -extern cpumask_t cpu_core_map[NR_CPUS]; -extern u8 cpu_llc_id[NR_CPUS]; +#define raw_smp_processor_id() read_pda(cpunumber) -#define SMP_TRAMPOLINE_BASE 0x6000 +#define stack_smp_processor_id() \ +({ \ + struct thread_info *ti; \ + asm("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ + ti->cpu; \ +}) /* - * On x86 all CPUs are mapped 1:1 to the APIC space. - * This simplifies scheduling and IPI sending and - * compresses data structures. + * On x86 all CPUs are mapped 1:1 to the APIC space. This simplifies + * scheduling and IPI sending and compresses data structures. */ - static inline int num_booting_cpus(void) { return cpus_weight(cpu_callout_map); } -#define raw_smp_processor_id() read_pda(cpunumber) +#else /* CONFIG_SMP */ +#define stack_smp_processor_id() 0 -extern int __cpu_disable(void); -extern void __cpu_die(unsigned int cpu); -extern void prefill_possible_map(void); -extern unsigned num_processors; -extern unsigned __cpuinitdata disabled_cpus; +#endif /* !CONFIG_SMP */ -#define NO_PROC_ID 0xFF /* No processor magic marker */ +#define safe_smp_processor_id() smp_processor_id() -#endif /* CONFIG_SMP */ +#ifdef CONFIG_X86_LOCAL_APIC -static inline int hard_smp_processor_id(void) +static inline int logical_smp_processor_id(void) { /* we don't want to mark this access volatile - bad code generation */ - return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID)); + return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); } -/* - * Some lowlevel functions might want to know about - * the real APIC ID <-> CPU # mapping. - */ -extern u8 x86_cpu_to_apicid[NR_CPUS]; /* physical ID */ -extern u8 x86_cpu_to_log_apicid[NR_CPUS]; -extern u8 bios_cpu_apicid[]; - -static inline int cpu_present_to_apicid(int mps_cpu) +# ifdef APIC_DEFINITION +extern int hard_smp_processor_id(void); +# else +# include +static inline int hard_smp_processor_id(void) { - if (mps_cpu < NR_CPUS) - return (int)bios_cpu_apicid[mps_cpu]; - else - return BAD_APICID; + /* we don't want to mark this access volatile - bad code generation */ + return GET_APIC_ID(*(u32 *)(APIC_BASE + APIC_ID)); } +# endif /* APIC_DEFINITION */ -#ifndef CONFIG_SMP -#define stack_smp_processor_id() 0 -#define cpu_logical_map(x) (x) -#else -#include -#define stack_smp_processor_id() \ -({ \ - struct thread_info *ti; \ - __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ - ti->cpu; \ -}) -#endif +#else /* CONFIG_X86_LOCAL_APIC */ -static __inline int logical_smp_processor_id(void) -{ - /* we don't want to mark this access volatile - bad code generation */ - return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR)); -} +# ifndef CONFIG_SMP +# define hard_smp_processor_id() 0 +# endif + +#endif /* CONFIG_X86_LOCAL_APIC */ -#ifdef CONFIG_SMP -#define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] -#else -#define cpu_physical_id(cpu) boot_cpu_id -#endif /* !CONFIG_SMP */ #endif