aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/kernel/smp.c27
-rw-r--r--include/asm-i386/smp.h2
2 files changed, 29 insertions, 0 deletions
diff --git a/arch/i386/kernel/smp.c b/arch/i386/kernel/smp.c
index 465188e2d701..1b080ab8a49f 100644
--- a/arch/i386/kernel/smp.c
+++ b/arch/i386/kernel/smp.c
@@ -700,3 +700,30 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
700 return 0; 700 return 0;
701} 701}
702EXPORT_SYMBOL(smp_call_function_single); 702EXPORT_SYMBOL(smp_call_function_single);
703
704static int convert_apicid_to_cpu(int apic_id)
705{
706 int i;
707
708 for (i = 0; i < NR_CPUS; i++) {
709 if (x86_cpu_to_apicid[i] == apic_id)
710 return i;
711 }
712 return -1;
713}
714
715int safe_smp_processor_id(void)
716{
717 int apicid, cpuid;
718
719 if (!boot_cpu_has(X86_FEATURE_APIC))
720 return 0;
721
722 apicid = hard_smp_processor_id();
723 if (apicid == BAD_APICID)
724 return 0;
725
726 cpuid = convert_apicid_to_cpu(apicid);
727
728 return cpuid >= 0 ? cpuid : 0;
729}
diff --git a/include/asm-i386/smp.h b/include/asm-i386/smp.h
index 915c26a31b79..6aa1206f6e2a 100644
--- a/include/asm-i386/smp.h
+++ b/include/asm-i386/smp.h
@@ -84,6 +84,7 @@ static inline int hard_smp_processor_id(void)
84#endif 84#endif
85#endif 85#endif
86 86
87extern int safe_smp_processor_id(void);
87extern int __cpu_disable(void); 88extern int __cpu_disable(void);
88extern void __cpu_die(unsigned int cpu); 89extern void __cpu_die(unsigned int cpu);
89extern unsigned int num_processors; 90extern unsigned int num_processors;
@@ -92,6 +93,7 @@ extern unsigned int num_processors;
92 93
93#else /* CONFIG_SMP */ 94#else /* CONFIG_SMP */
94 95
96#define safe_smp_processor_id() 0
95#define cpu_physical_id(cpu) boot_cpu_physical_apicid 97#define cpu_physical_id(cpu) boot_cpu_physical_apicid
96 98
97#define NO_PROC_ID 0xFF /* No processor magic marker */ 99#define NO_PROC_ID 0xFF /* No processor magic marker */