Remove the BUILD_INFO_FILE variable
[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 #pragma once
6
7 #include <ros/common.h>
8 #include <arch/apic.h>
9 #include <arch/x86.h>
10
11 struct core_info {
12         int numa_id;
13         int socket_id;
14         int cpu_id;
15         int core_id;
16         int raw_socket_id;
17         int apic_id;
18 };
19
20 struct topology_info {
21         int num_cores;
22         int num_cpus;
23         int num_sockets;
24         int num_numa;
25         int cores_per_cpu;
26         int cores_per_socket;
27         int cores_per_numa;
28         int cpus_per_socket;
29         int cpus_per_numa;
30         int sockets_per_numa;
31         int max_apic_id;
32         struct core_info *core_list;
33 };
34
35 extern struct topology_info cpu_topology_info;
36 extern int *os_coreid_lookup;
37 #define num_cores (cpu_topology_info.num_cores)
38
39 void topology_init();
40 void print_cpu_topology();
41
42 static inline int get_hw_coreid(uint32_t coreid)
43 {
44         return cpu_topology_info.core_list[coreid].apic_id;
45 }
46
47 static inline int hw_core_id(void)
48 {
49         return lapic_get_id();
50 }
51
52 static inline int get_os_coreid(int hw_coreid)
53 {
54         return os_coreid_lookup[hw_coreid];
55 }
56
57 static inline int numa_id(void)
58 {
59         int os_coreid = os_coreid_lookup[lapic_get_id()];
60         return cpu_topology_info.core_list[os_coreid].numa_id;
61 }
62
63 static inline int core_id(void)
64 {
65         int coreid;
66         /* assuming we're right after stacktop.  gs base is the pcpui struct, but we
67          * don't have access to the pcpui struct or to the extern per_cpu_info here,
68          * due to include loops. */
69         asm volatile ("movl %%gs:8, %0" : "=r"(coreid));
70         return coreid;
71 }
72
73 /* Tracks whether it is safe to execute core_id() or not. */
74 static inline int core_id_early(void)
75 {
76         extern bool core_id_ready;
77         if (!core_id_ready)
78                 return 0;
79         return core_id();
80 }