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 c9a28fa7b9ac19b676deefa0a171ce7df8755c08 101 lines 2.5 kB view raw
1#ifndef __ASM_SMP_H 2#define __ASM_SMP_H 3 4#include <linux/cpumask.h> 5#include <linux/init.h> 6 7/* 8 * We need the APIC definitions automatically as part of 'smp.h' 9 */ 10#include <asm/apic.h> 11#include <asm/io_apic.h> 12#include <asm/mpspec.h> 13#include <asm/pda.h> 14#include <asm/thread_info.h> 15 16extern cpumask_t cpu_callout_map; 17extern cpumask_t cpu_initialized; 18 19extern int smp_num_siblings; 20extern unsigned int num_processors; 21 22extern void smp_alloc_memory(void); 23extern void lock_ipi_call_lock(void); 24extern void unlock_ipi_call_lock(void); 25 26extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *), 27 void *info, int wait); 28 29extern u16 __initdata x86_cpu_to_apicid_init[]; 30extern u16 __initdata x86_bios_cpu_apicid_init[]; 31extern void *x86_cpu_to_apicid_early_ptr; 32extern void *x86_bios_cpu_apicid_early_ptr; 33 34DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); 35DECLARE_PER_CPU(cpumask_t, cpu_core_map); 36DECLARE_PER_CPU(u16, cpu_llc_id); 37DECLARE_PER_CPU(u16, x86_cpu_to_apicid); 38DECLARE_PER_CPU(u16, x86_bios_cpu_apicid); 39 40static inline int cpu_present_to_apicid(int mps_cpu) 41{ 42 if (cpu_present(mps_cpu)) 43 return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu); 44 else 45 return BAD_APICID; 46} 47 48#ifdef CONFIG_SMP 49 50#define SMP_TRAMPOLINE_BASE 0x6000 51 52extern int __cpu_disable(void); 53extern void __cpu_die(unsigned int cpu); 54extern void prefill_possible_map(void); 55extern unsigned __cpuinitdata disabled_cpus; 56 57#define raw_smp_processor_id() read_pda(cpunumber) 58#define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) 59 60#define stack_smp_processor_id() \ 61 ({ \ 62 struct thread_info *ti; \ 63 __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ 64 ti->cpu; \ 65}) 66 67/* 68 * On x86 all CPUs are mapped 1:1 to the APIC space. This simplifies 69 * scheduling and IPI sending and compresses data structures. 70 */ 71static inline int num_booting_cpus(void) 72{ 73 return cpus_weight(cpu_callout_map); 74} 75 76extern void smp_send_reschedule(int cpu); 77 78#else /* CONFIG_SMP */ 79 80extern unsigned int boot_cpu_id; 81#define cpu_physical_id(cpu) boot_cpu_id 82#define stack_smp_processor_id() 0 83 84#endif /* !CONFIG_SMP */ 85 86#define safe_smp_processor_id() smp_processor_id() 87 88static __inline int logical_smp_processor_id(void) 89{ 90 /* we don't want to mark this access volatile - bad code generation */ 91 return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); 92} 93 94static inline int hard_smp_processor_id(void) 95{ 96 /* we don't want to mark this access volatile - bad code generation */ 97 return GET_APIC_ID(*(u32 *)(APIC_BASE + APIC_ID)); 98} 99 100#endif 101