Change all references of num_cpus -> num_cores
[akaros.git] / kern / arch / x86 / coreid.h
1 #ifndef ROS_ARCH_COREID_H
2 #define ROS_ARCH_COREID_H
3
4 #include <ros/common.h>
5 #include <arch/apic.h>
6
7 static inline int get_hw_coreid(uint32_t coreid) __attribute__((always_inline));
8 static inline int hw_core_id(void) __attribute__((always_inline));
9 static inline int get_os_coreid(int hw_coreid) __attribute__((always_inline));
10 static inline int core_id(void) __attribute__((always_inline));
11 static inline int node_id(void) __attribute__((always_inline));
12 static inline int core_id_early(void) __attribute__((always_inline));
13
14 /* declared in smp.c */
15 extern int hw_coreid_lookup[MAX_NUM_CORES];
16 extern int os_coreid_lookup[MAX_NUM_CORES];
17
18 /* os_coreid -> hw_coreid */
19 static inline int get_hw_coreid(uint32_t coreid)
20 {
21         return hw_coreid_lookup[coreid];
22 }
23
24 static inline int hw_core_id(void)
25 {
26         return lapic_get_id();
27 }
28
29 /* hw_coreid -> os_coreid */
30 static inline int get_os_coreid(int hw_coreid)
31 {
32         return os_coreid_lookup[hw_coreid];
33 }
34
35 static inline int node_id(void)
36 {
37         return 0;
38 }
39
40 static inline int core_id(void)
41 {
42         int coreid;
43         /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
44          * don't have access to the pcpui struct or to the extern per_cpu_info here,
45          * due to include loops. */
46         asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
47         return coreid;
48 }
49
50 /* Tracks whether it is safe to execute core_id() or not. */
51 extern bool core_id_ready;
52 static inline int core_id_early(void)
53 {
54         if (!core_id_ready)
55                 return 0;
56         return core_id();
57 }
58
59 #endif /* ROS_ARCH_COREID_H */