Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.24 130 lines 3.2 kB view raw
1#ifndef __ASM_SMP_H 2#define __ASM_SMP_H 3 4/* 5 * We need the APIC definitions automatically as part of 'smp.h' 6 */ 7#include <linux/threads.h> 8#include <linux/cpumask.h> 9#include <linux/bitops.h> 10#include <linux/init.h> 11extern int disable_apic; 12 13#include <asm/mpspec.h> 14#include <asm/apic.h> 15#include <asm/io_apic.h> 16#include <asm/thread_info.h> 17 18#ifdef CONFIG_SMP 19 20#include <asm/pda.h> 21 22struct pt_regs; 23 24extern cpumask_t cpu_present_mask; 25extern cpumask_t cpu_possible_map; 26extern cpumask_t cpu_online_map; 27extern cpumask_t cpu_callout_map; 28extern cpumask_t cpu_initialized; 29 30/* 31 * Private routines/data 32 */ 33 34extern void smp_alloc_memory(void); 35extern volatile unsigned long smp_invalidate_needed; 36extern void lock_ipi_call_lock(void); 37extern void unlock_ipi_call_lock(void); 38extern int smp_num_siblings; 39extern void smp_send_reschedule(int cpu); 40extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *), 41 void *info, int wait); 42 43/* 44 * cpu_sibling_map and cpu_core_map now live 45 * in the per cpu area 46 * 47 * extern cpumask_t cpu_sibling_map[NR_CPUS]; 48 * extern cpumask_t cpu_core_map[NR_CPUS]; 49 */ 50DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); 51DECLARE_PER_CPU(cpumask_t, cpu_core_map); 52DECLARE_PER_CPU(u8, cpu_llc_id); 53 54#define SMP_TRAMPOLINE_BASE 0x6000 55 56/* 57 * On x86 all CPUs are mapped 1:1 to the APIC space. 58 * This simplifies scheduling and IPI sending and 59 * compresses data structures. 60 */ 61 62static inline int num_booting_cpus(void) 63{ 64 return cpus_weight(cpu_callout_map); 65} 66 67#define raw_smp_processor_id() read_pda(cpunumber) 68 69extern int __cpu_disable(void); 70extern void __cpu_die(unsigned int cpu); 71extern void prefill_possible_map(void); 72extern unsigned num_processors; 73extern unsigned __cpuinitdata disabled_cpus; 74 75#define NO_PROC_ID 0xFF /* No processor magic marker */ 76 77#endif /* CONFIG_SMP */ 78 79#define safe_smp_processor_id() smp_processor_id() 80 81static inline int hard_smp_processor_id(void) 82{ 83 /* we don't want to mark this access volatile - bad code generation */ 84 return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID)); 85} 86 87/* 88 * Some lowlevel functions might want to know about 89 * the real APIC ID <-> CPU # mapping. 90 */ 91extern u8 __initdata x86_cpu_to_apicid_init[]; 92extern void *x86_cpu_to_apicid_ptr; 93DECLARE_PER_CPU(u8, x86_cpu_to_apicid); /* physical ID */ 94extern u8 bios_cpu_apicid[]; 95 96static inline int cpu_present_to_apicid(int mps_cpu) 97{ 98 if (mps_cpu < NR_CPUS) 99 return (int)bios_cpu_apicid[mps_cpu]; 100 else 101 return BAD_APICID; 102} 103 104#ifndef CONFIG_SMP 105#define stack_smp_processor_id() 0 106#define cpu_logical_map(x) (x) 107#else 108#include <asm/thread_info.h> 109#define stack_smp_processor_id() \ 110({ \ 111 struct thread_info *ti; \ 112 __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ 113 ti->cpu; \ 114}) 115#endif 116 117static __inline int logical_smp_processor_id(void) 118{ 119 /* we don't want to mark this access volatile - bad code generation */ 120 return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR)); 121} 122 123#ifdef CONFIG_SMP 124#define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) 125#else 126extern unsigned int boot_cpu_id; 127#define cpu_physical_id(cpu) boot_cpu_id 128#endif /* !CONFIG_SMP */ 129#endif 130