2008-03-03 10:12:53 -07:00
|
|
|
#include <linux/cpumask.h>
|
|
|
|
#include <linux/interrupt.h>
|
|
|
|
#include <linux/init.h>
|
|
|
|
|
|
|
|
#include <linux/mm.h>
|
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <linux/spinlock.h>
|
|
|
|
#include <linux/kernel_stat.h>
|
|
|
|
#include <linux/mc146818rtc.h>
|
|
|
|
#include <linux/cache.h>
|
|
|
|
#include <linux/cpu.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
|
|
|
|
#include <asm/smp.h>
|
|
|
|
#include <asm/mtrr.h>
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
#include <asm/mmu_context.h>
|
|
|
|
#include <asm/apic.h>
|
|
|
|
#include <asm/proto.h>
|
2009-01-29 20:31:49 -07:00
|
|
|
#include <asm/ipi.h>
|
2008-03-03 10:12:53 -07:00
|
|
|
|
|
|
|
#ifdef CONFIG_X86_32
|
|
|
|
|
2009-01-28 07:42:24 -07:00
|
|
|
void default_send_IPI_self(int vector)
|
2008-03-03 10:12:53 -07:00
|
|
|
{
|
2009-01-29 20:31:49 -07:00
|
|
|
__default_send_IPI_shortcut(APIC_DEST_SELF, vector, apic->dest_logical);
|
2008-03-03 10:12:53 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/* must come after the send_IPI functions above for inlining */
|
|
|
|
static int convert_apicid_to_cpu(int apic_id)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for_each_possible_cpu(i) {
|
|
|
|
if (per_cpu(x86_cpu_to_apicid, i) == apic_id)
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int safe_smp_processor_id(void)
|
|
|
|
{
|
|
|
|
int apicid, cpuid;
|
|
|
|
|
|
|
|
if (!boot_cpu_has(X86_FEATURE_APIC))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
apicid = hard_smp_processor_id();
|
|
|
|
if (apicid == BAD_APICID)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
cpuid = convert_apicid_to_cpu(apicid);
|
|
|
|
|
|
|
|
return cpuid >= 0 ? cpuid : 0;
|
|
|
|
}
|
|
|
|
#endif
|