Splits x86 arch for circular deps
[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_FAST_COREID
41 static inline int core_id(void)
42 {
43         int ret;
44         asm volatile ("rdtscp" : "=c"(ret) : : "eax", "edx");
45         return ret;
46 }
47 #else
48 /* core_id() returns the OS core number, not to be confused with the
49  * hardware-specific core identifier (such as the lapic id) returned by
50  * hw_core_id() */
51 static inline int core_id(void)
52 {
53         return get_os_coreid(hw_core_id());
54 }
55 #endif /* CONFIG_FAST_COREID */
56
57 static inline int core_id_early(void)
58 {
59         if (!core_id_ready)
60                 return 0;
61         return core_id();
62 }
63
64 #endif /* ROS_ARCH_COREID_H */