1 #ifndef __ASM_SMP_H
2 #define __ASM_SMP_H
3 
4 /*
5  * We need the APIC definitions automatically as part of 'smp.h'
6  */
7 #ifndef __ASSEMBLY__
8 #include <xen/kernel.h>
9 #include <xen/cpumask.h>
10 #include <asm/current.h>
11 #endif
12 
13 #ifndef __ASSEMBLY__
14 #include <xen/bitops.h>
15 #include <asm/mpspec.h>
16 #endif
17 
18 #define BAD_APICID   (-1U)
19 #define INVALID_CUID (~0U)   /* AMD Compute Unit ID */
20 #ifndef __ASSEMBLY__
21 
22 /*
23  * Private routines/data
24  */
25 DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
26 DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
27 DECLARE_PER_CPU(cpumask_var_t, scratch_cpumask);
28 
29 void smp_send_nmi_allbutself(void);
30 
31 void send_IPI_mask(const cpumask_t *, int vector);
32 void send_IPI_self(int vector);
33 
34 extern void (*mtrr_hook) (void);
35 
36 extern void zap_low_mappings(void);
37 
38 extern u32 x86_cpu_to_apicid[];
39 
40 #define cpu_physical_id(cpu)	x86_cpu_to_apicid[cpu]
41 
42 #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
43 extern void cpu_exit_clear(unsigned int cpu);
44 extern void cpu_uninit(unsigned int cpu);
45 int cpu_add(uint32_t apic_id, uint32_t acpi_id, uint32_t pxm);
46 
47 /*
48  * This function is needed by all SMP systems. It must _always_ be valid
49  * from the initial startup. We map APIC_BASE very early in page_setup(),
50  * so this is correct in the x86 case.
51  */
52 #define raw_smp_processor_id() (get_processor_id())
53 
54 void __stop_this_cpu(void);
55 
56 long cpu_up_helper(void *data);
57 long cpu_down_helper(void *data);
58 
59 long core_parking_helper(void *data);
60 uint32_t get_cur_idle_nums(void);
61 
62 /*
63  * The value may be greater than the actual socket number in the system and
64  * is required not to change from the initial startup.
65  */
66 extern unsigned int nr_sockets;
67 
68 void set_nr_sockets(void);
69 
70 /* Representing HT and core siblings in each socket. */
71 extern cpumask_t **socket_cpumask;
72 
73 #endif /* !__ASSEMBLY__ */
74 
75 #endif
76