1 /* ProcFS - cpuinfo.c - generator for the cpuinfo file */
2
3 #include "inc.h"
4
5 #if defined(__i386__)
6 #include "../../kernel/arch/i386/include/archconst.h"
7 #endif
8
9 #ifndef CONFIG_MAX_CPUS
10 #define CONFIG_MAX_CPUS 1
11 #endif
12
13 #if defined(__i386__)
14 static const char * x86_flag[] = {
15 "fpu",
16 "vme",
17 "de",
18 "pse",
19 "tsc",
20 "msr",
21 "pae",
22 "mce",
23 "cx8",
24 "apic",
25 "",
26 "sep",
27 "mtrr",
28 "pge",
29 "mca",
30 "cmov",
31 "pat",
32 "pse36",
33 "psn",
34 "clfsh",
35 "",
36 "dts",
37 "acpi",
38 "mmx",
39 "fxsr",
40 "sse",
41 "sse2",
42 "ss",
43 "ht",
44 "tm",
45 "",
46 "pbe",
47 "pni",
48 "",
49 "",
50 "monitor",
51 "ds_cpl",
52 "vmx",
53 "smx",
54 "est",
55 "tm2",
56 "ssse3",
57 "cid",
58 "",
59 "",
60 "cx16",
61 "xtpr",
62 "pdcm",
63 "",
64 "",
65 "dca",
66 "sse4_1",
67 "sse4_2",
68 "x2apic",
69 "movbe",
70 "popcnt",
71 "",
72 "",
73 "xsave",
74 "osxsave",
75 "",
76 "",
77 "",
78 "",
79 };
80
81 /*
82 * Output a space-separated list of supported CPU flags. x86 only.
83 */
84 static void
print_x86_cpu_flags(u32_t * flags)85 print_x86_cpu_flags(u32_t * flags)
86 {
87 int i, j;
88
89 for (i = 0; i < 2; i++) {
90 for (j = 0; j < 32; j++) {
91 if (flags[i] & (1 << j) && x86_flag[i * 32 + j][0])
92 buf_printf("%s ", x86_flag[i * 32 + j]);
93 }
94 }
95 buf_printf("\n");
96 }
97 #endif
98
99 /*
100 * Print information for a single CPU.
101 */
102 static void
print_cpu(struct cpu_info * cpu_info,unsigned id)103 print_cpu(struct cpu_info * cpu_info, unsigned id)
104 {
105
106 buf_printf("%-16s: %d\n", "processor", id);
107
108 #if defined(__i386__)
109 switch (cpu_info->vendor) {
110 case CPU_VENDOR_INTEL:
111 buf_printf("%-16s: %s\n", "vendor_id", "GenuineIntel");
112 buf_printf("%-16s: %s\n", "model name", "Intel");
113 break;
114 case CPU_VENDOR_AMD:
115 buf_printf("%-16s: %s\n", "vendor_id", "AuthenticAMD");
116 buf_printf("%-16s: %s\n", "model name", "AMD");
117 break;
118 default:
119 buf_printf("%-16s: %s\n", "vendor_id", "unknown");
120 }
121
122 buf_printf("%-16s: %d\n", "cpu family", cpu_info->family);
123 buf_printf("%-16s: %d\n", "model", cpu_info->model);
124 buf_printf("%-16s: %d\n", "stepping", cpu_info->stepping);
125 buf_printf("%-16s: %d\n", "cpu MHz", cpu_info->freq);
126 buf_printf("%-16s: ", "flags");
127 print_x86_cpu_flags(cpu_info->flags);
128 buf_printf("\n");
129 #endif
130 }
131
132 /*
133 * Generate the contents of /proc/cpuinfo.
134 */
135 void
root_cpuinfo(void)136 root_cpuinfo(void)
137 {
138 struct cpu_info cpu_info[CONFIG_MAX_CPUS];
139 struct machine machine;
140 unsigned int c;
141
142 if (sys_getmachine(&machine)) {
143 printf("PROCFS: cannot get machine\n");
144 return;
145 }
146 if (sys_getcpuinfo(&cpu_info)) {
147 printf("PROCFS: cannot get CPU info\n");
148 return;
149 }
150
151 for (c = 0; c < machine.processors_count; c++)
152 print_cpu(&cpu_info[c], c);
153 }
154