diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-x86/smp.h | 33 | ||||
-rw-r--r-- | include/asm-x86/smp_32.h | 21 | ||||
-rw-r--r-- | include/asm-x86/smp_64.h | 27 |
3 files changed, 32 insertions, 49 deletions
diff --git a/include/asm-x86/smp.h b/include/asm-x86/smp.h index 21472cea3d6c..57b3d86dd9ed 100644 --- a/include/asm-x86/smp.h +++ b/include/asm-x86/smp.h | |||
@@ -126,8 +126,39 @@ extern unsigned long setup_trampoline(void); | |||
126 | 126 | ||
127 | void smp_store_cpu_info(int id); | 127 | void smp_store_cpu_info(int id); |
128 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) | 128 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) |
129 | #else | 129 | |
130 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ | ||
131 | static inline int num_booting_cpus(void) | ||
132 | { | ||
133 | return cpus_weight(cpu_callout_map); | ||
134 | } | ||
135 | #endif /* CONFIG_SMP */ | ||
136 | |||
137 | #ifdef CONFIG_X86_32_SMP | ||
138 | /* | ||
139 | * This function is needed by all SMP systems. It must _always_ be valid | ||
140 | * from the initial startup. We map APIC_BASE very early in page_setup(), | ||
141 | * so this is correct in the x86 case. | ||
142 | */ | ||
143 | DECLARE_PER_CPU(int, cpu_number); | ||
144 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | ||
145 | extern int safe_smp_processor_id(void); | ||
146 | |||
147 | #elif defined(CONFIG_X86_64_SMP) | ||
148 | #define raw_smp_processor_id() read_pda(cpunumber) | ||
149 | |||
150 | #define stack_smp_processor_id() \ | ||
151 | ({ \ | ||
152 | struct thread_info *ti; \ | ||
153 | __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ | ||
154 | ti->cpu; \ | ||
155 | }) | ||
156 | #define safe_smp_processor_id() smp_processor_id() | ||
157 | |||
158 | #else /* !CONFIG_X86_32_SMP && !CONFIG_X86_64_SMP */ | ||
130 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | 159 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid |
160 | #define safe_smp_processor_id() 0 | ||
161 | #define stack_smp_processor_id() 0 | ||
131 | #endif | 162 | #endif |
132 | 163 | ||
133 | #ifdef CONFIG_X86_32 | 164 | #ifdef CONFIG_X86_32 |
diff --git a/include/asm-x86/smp_32.h b/include/asm-x86/smp_32.h index 694d3245a88f..d9ae5ac93dfc 100644 --- a/include/asm-x86/smp_32.h +++ b/include/asm-x86/smp_32.h | |||
@@ -8,26 +8,5 @@ extern cpumask_t cpu_callin_map; | |||
8 | extern void (*mtrr_hook)(void); | 8 | extern void (*mtrr_hook)(void); |
9 | extern void zap_low_mappings(void); | 9 | extern void zap_low_mappings(void); |
10 | 10 | ||
11 | #ifdef CONFIG_SMP | ||
12 | /* | ||
13 | * This function is needed by all SMP systems. It must _always_ be valid | ||
14 | * from the initial startup. We map APIC_BASE very early in page_setup(), | ||
15 | * so this is correct in the x86 case. | ||
16 | */ | ||
17 | DECLARE_PER_CPU(int, cpu_number); | ||
18 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | ||
19 | |||
20 | extern int safe_smp_processor_id(void); | ||
21 | |||
22 | /* We don't mark CPUs online until __cpu_up(), so we need another measure */ | ||
23 | static inline int num_booting_cpus(void) | ||
24 | { | ||
25 | return cpus_weight(cpu_callout_map); | ||
26 | } | ||
27 | |||
28 | #else /* CONFIG_SMP */ | ||
29 | #define safe_smp_processor_id() 0 | ||
30 | #endif /* !CONFIG_SMP */ | ||
31 | |||
32 | #endif /* !ASSEMBLY */ | 11 | #endif /* !ASSEMBLY */ |
33 | #endif | 12 | #endif |
diff --git a/include/asm-x86/smp_64.h b/include/asm-x86/smp_64.h index 8ea49529f324..058f41399798 100644 --- a/include/asm-x86/smp_64.h +++ b/include/asm-x86/smp_64.h | |||
@@ -7,32 +7,5 @@ extern cpumask_t cpu_callin_map; | |||
7 | extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *), | 7 | extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *), |
8 | void *info, int wait); | 8 | void *info, int wait); |
9 | 9 | ||
10 | #ifdef CONFIG_SMP | ||
11 | |||
12 | #define raw_smp_processor_id() read_pda(cpunumber) | ||
13 | |||
14 | #define stack_smp_processor_id() \ | ||
15 | ({ \ | ||
16 | struct thread_info *ti; \ | ||
17 | asm("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ | ||
18 | ti->cpu; \ | ||
19 | }) | ||
20 | |||
21 | /* | ||
22 | * On x86 all CPUs are mapped 1:1 to the APIC space. This simplifies | ||
23 | * scheduling and IPI sending and compresses data structures. | ||
24 | */ | ||
25 | static inline int num_booting_cpus(void) | ||
26 | { | ||
27 | return cpus_weight(cpu_callout_map); | ||
28 | } | ||
29 | |||
30 | #define safe_smp_processor_id() smp_processor_id() | ||
31 | #else /* CONFIG_SMP */ | ||
32 | #define stack_smp_processor_id() 0 | ||
33 | #define safe_smp_processor_id() 0 | ||
34 | #endif /* !CONFIG_SMP */ | ||
35 | |||
36 | |||
37 | #endif | 10 | #endif |
38 | 11 | ||