No longer builds, but this is a good intermediate save point.
[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_CPUS];
16 extern int os_coreid_lookup[MAX_NUM_CPUS];
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 #ifdef CONFIG_X86_64
41 static inline int core_id(void)
42 {
43         int coreid;
44         /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
45          * don't have access to the pcpui struct or to the extern per_cpu_info here,
46          * due to include loops. */
47         asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
48         return coreid;
49 }
50 #else
51 /* 32 bit code just uses the old crap.  could use rdtscp, but not worth the
52  * hassle. */
53 /* core_id() returns the OS core number, not to be confused with the
54  * hardware-specific core identifier (such as the lapic id) returned by
55  * hw_core_id() */
56 static inline int core_id(void)
57 {
58         return get_os_coreid(hw_core_id());
59 }
60 #endif /* CONFIG_X86_64 */
61
62 /* Tracks whether it is safe to execute core_id() or not. */
63 extern bool core_id_ready;
64 static inline int core_id_early(void)
65 {
66         if (!core_id_ready)
67                 return 0;
68         return core_id();
69 }
70
71 #endif /* ROS_ARCH_COREID_H */