Changed magic number from 0xE5 to I_VMMPC_POSTED
[akaros.git] / kern / arch / x86 / topology.h
1 /* Copyright (c) 2015 The Regents of the University of California
2  * Kevin Klues <klueska@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #ifndef AKAROS_ARCH_TOPOLOGY_H
6 #define AKAROS_ARCH_TOPOLOGY_H
7
8 #include <ros/common.h>
9 #include <arch/apic.h>
10 #include <arch/x86.h>
11
12 struct core_info {
13         int numa_id;
14         int socket_id;
15         int cpu_id;
16         int core_id;
17         int raw_socket_id;
18         int apic_id;
19 };
20
21 struct topology_info {
22         int num_cores;
23         int num_cpus;
24         int num_sockets;
25         int num_numa;
26         int cores_per_cpu;
27         int cores_per_socket;
28         int cores_per_numa;
29         int cpus_per_socket;
30         int cpus_per_numa;
31         int sockets_per_numa;
32         int max_apic_id;
33         struct core_info *core_list;
34 };
35
36 extern struct topology_info cpu_topology_info;
37 extern int *os_coreid_lookup;
38 #define num_cores (cpu_topology_info.num_cores)
39
40 void topology_init();
41 void print_cpu_topology();
42
43 static inline int get_hw_coreid(uint32_t coreid)
44 {
45         return cpu_topology_info.core_list[coreid].apic_id;
46 }
47
48 static inline int hw_core_id(void)
49 {
50         return lapic_get_id();
51 }
52
53 static inline int get_os_coreid(int hw_coreid)
54 {
55         return os_coreid_lookup[hw_coreid];
56 }
57
58 static inline int numa_id(void)
59 {
60         int os_coreid = os_coreid_lookup[lapic_get_id()];
61         return cpu_topology_info.core_list[os_coreid].numa_id;
62 }
63
64 static inline int core_id(void)
65 {
66         int coreid;
67         /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
68          * don't have access to the pcpui struct or to the extern per_cpu_info here,
69          * due to include loops. */
70         asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
71         return coreid;
72 }
73
74 /* Tracks whether it is safe to execute core_id() or not. */
75 static inline int core_id_early(void)
76 {
77         extern bool core_id_ready;
78         if (!core_id_ready)
79                 return 0;
80         return core_id();
81 }
82
83 #endif /* AKAROS_ARCH_TOPOLOGY_H */