diff options
-rw-r--r-- | arch/i386/kernel/smp.c | 27 | ||||
-rw-r--r-- | include/asm-i386/smp.h | 2 |
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 | } |
702 | EXPORT_SYMBOL(smp_call_function_single); | 702 | EXPORT_SYMBOL(smp_call_function_single); |
703 | |||
704 | static 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 | |||
715 | int 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 | ||
87 | extern int safe_smp_processor_id(void); | ||
87 | extern int __cpu_disable(void); | 88 | extern int __cpu_disable(void); |
88 | extern void __cpu_die(unsigned int cpu); | 89 | extern void __cpu_die(unsigned int cpu); |
89 | extern unsigned int num_processors; | 90 | extern 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 */ |