xref: /minix3/minix/fs/procfs/cpuinfo.c (revision f1abbce7257a5fbf50b3422d6dd5631fd0bf26a5)
1*f1abbce7SDavid van Moolenbroek /* ProcFS - cpuinfo.c - generator for the cpuinfo file */
2*f1abbce7SDavid van Moolenbroek 
3433d6423SLionel Sambuc #include "inc.h"
4*f1abbce7SDavid van Moolenbroek 
57ee000e5SDavid van Moolenbroek #if defined(__i386__)
6433d6423SLionel Sambuc #include "../../kernel/arch/i386/include/archconst.h"
77ee000e5SDavid van Moolenbroek #endif
8433d6423SLionel Sambuc 
9433d6423SLionel Sambuc #ifndef CONFIG_MAX_CPUS
10433d6423SLionel Sambuc #define CONFIG_MAX_CPUS	1
11433d6423SLionel Sambuc #endif
12433d6423SLionel Sambuc 
137ee000e5SDavid van Moolenbroek #if defined(__i386__)
14433d6423SLionel Sambuc static const char * x86_flag[] = {
15433d6423SLionel Sambuc 	"fpu",
16433d6423SLionel Sambuc 	"vme",
17433d6423SLionel Sambuc 	"de",
18433d6423SLionel Sambuc 	"pse",
19433d6423SLionel Sambuc 	"tsc",
20433d6423SLionel Sambuc 	"msr",
21433d6423SLionel Sambuc 	"pae",
22433d6423SLionel Sambuc 	"mce",
23433d6423SLionel Sambuc 	"cx8",
24433d6423SLionel Sambuc 	"apic",
25433d6423SLionel Sambuc 	"",
26433d6423SLionel Sambuc 	"sep",
27433d6423SLionel Sambuc 	"mtrr",
28433d6423SLionel Sambuc 	"pge",
29433d6423SLionel Sambuc 	"mca",
30433d6423SLionel Sambuc 	"cmov",
31433d6423SLionel Sambuc 	"pat",
32433d6423SLionel Sambuc 	"pse36",
33433d6423SLionel Sambuc 	"psn",
34433d6423SLionel Sambuc 	"clfsh",
35433d6423SLionel Sambuc 	"",
36433d6423SLionel Sambuc 	"dts",
37433d6423SLionel Sambuc 	"acpi",
38433d6423SLionel Sambuc 	"mmx",
39433d6423SLionel Sambuc 	"fxsr",
40433d6423SLionel Sambuc 	"sse",
41433d6423SLionel Sambuc 	"sse2",
42433d6423SLionel Sambuc 	"ss",
43433d6423SLionel Sambuc 	"ht",
44433d6423SLionel Sambuc 	"tm",
45433d6423SLionel Sambuc 	"",
46433d6423SLionel Sambuc 	"pbe",
47433d6423SLionel Sambuc 	"pni",
48433d6423SLionel Sambuc 	"",
49433d6423SLionel Sambuc 	"",
50433d6423SLionel Sambuc 	"monitor",
51433d6423SLionel Sambuc 	"ds_cpl",
52433d6423SLionel Sambuc 	"vmx",
53433d6423SLionel Sambuc 	"smx",
54433d6423SLionel Sambuc 	"est",
55433d6423SLionel Sambuc 	"tm2",
56433d6423SLionel Sambuc 	"ssse3",
57433d6423SLionel Sambuc 	"cid",
58433d6423SLionel Sambuc 	"",
59433d6423SLionel Sambuc 	"",
60433d6423SLionel Sambuc 	"cx16",
61433d6423SLionel Sambuc 	"xtpr",
62433d6423SLionel Sambuc 	"pdcm",
63433d6423SLionel Sambuc 	"",
64433d6423SLionel Sambuc 	"",
65433d6423SLionel Sambuc 	"dca",
66433d6423SLionel Sambuc 	"sse4_1",
67433d6423SLionel Sambuc 	"sse4_2",
68433d6423SLionel Sambuc 	"x2apic",
69433d6423SLionel Sambuc 	"movbe",
70433d6423SLionel Sambuc 	"popcnt",
71433d6423SLionel Sambuc 	"",
72433d6423SLionel Sambuc 	"",
73433d6423SLionel Sambuc 	"xsave",
74433d6423SLionel Sambuc 	"osxsave",
75433d6423SLionel Sambuc 	"",
76433d6423SLionel Sambuc 	"",
77433d6423SLionel Sambuc 	"",
78433d6423SLionel Sambuc 	"",
79433d6423SLionel Sambuc };
80433d6423SLionel Sambuc 
81*f1abbce7SDavid van Moolenbroek /*
82*f1abbce7SDavid van Moolenbroek  * Output a space-separated list of supported CPU flags.  x86 only.
83*f1abbce7SDavid van Moolenbroek  */
84*f1abbce7SDavid van Moolenbroek static void
print_x86_cpu_flags(u32_t * flags)85*f1abbce7SDavid van Moolenbroek print_x86_cpu_flags(u32_t * flags)
86433d6423SLionel Sambuc {
87433d6423SLionel Sambuc 	int i, j;
88433d6423SLionel Sambuc 
89433d6423SLionel Sambuc 	for (i = 0; i < 2; i++) {
90433d6423SLionel Sambuc 		for (j = 0; j < 32; j++) {
91*f1abbce7SDavid van Moolenbroek 			if (flags[i] & (1 << j) && x86_flag[i * 32 + j][0])
92433d6423SLionel Sambuc 				buf_printf("%s ", x86_flag[i * 32 + j]);
93433d6423SLionel Sambuc 		}
94433d6423SLionel Sambuc 	}
95433d6423SLionel Sambuc 	buf_printf("\n");
96433d6423SLionel Sambuc }
977ee000e5SDavid van Moolenbroek #endif
98433d6423SLionel Sambuc 
99*f1abbce7SDavid van Moolenbroek /*
100*f1abbce7SDavid van Moolenbroek  * Print information for a single CPU.
101*f1abbce7SDavid van Moolenbroek  */
102*f1abbce7SDavid van Moolenbroek static void
print_cpu(struct cpu_info * cpu_info,unsigned id)103*f1abbce7SDavid van Moolenbroek print_cpu(struct cpu_info * cpu_info, unsigned id)
104433d6423SLionel Sambuc {
105*f1abbce7SDavid van Moolenbroek 
106433d6423SLionel Sambuc 	buf_printf("%-16s: %d\n", "processor", id);
107433d6423SLionel Sambuc 
108433d6423SLionel Sambuc #if defined(__i386__)
109433d6423SLionel Sambuc 	switch (cpu_info->vendor) {
110433d6423SLionel Sambuc 	case CPU_VENDOR_INTEL:
111433d6423SLionel Sambuc 		buf_printf("%-16s: %s\n", "vendor_id", "GenuineIntel");
112433d6423SLionel Sambuc 		buf_printf("%-16s: %s\n", "model name", "Intel");
113433d6423SLionel Sambuc 		break;
114433d6423SLionel Sambuc 	case CPU_VENDOR_AMD:
115433d6423SLionel Sambuc 		buf_printf("%-16s: %s\n", "vendor_id", "AuthenticAMD");
116433d6423SLionel Sambuc 		buf_printf("%-16s: %s\n", "model name", "AMD");
117433d6423SLionel Sambuc 		break;
118433d6423SLionel Sambuc 	default:
119*f1abbce7SDavid van Moolenbroek 		buf_printf("%-16s: %s\n", "vendor_id", "unknown");
120433d6423SLionel Sambuc 	}
121433d6423SLionel Sambuc 
122433d6423SLionel Sambuc 	buf_printf("%-16s: %d\n", "cpu family", cpu_info->family);
123433d6423SLionel Sambuc 	buf_printf("%-16s: %d\n", "model", cpu_info->model);
124433d6423SLionel Sambuc 	buf_printf("%-16s: %d\n", "stepping", cpu_info->stepping);
125433d6423SLionel Sambuc 	buf_printf("%-16s: %d\n", "cpu MHz", cpu_info->freq);
126433d6423SLionel Sambuc 	buf_printf("%-16s: ", "flags");
1277ee000e5SDavid van Moolenbroek 	print_x86_cpu_flags(cpu_info->flags);
128433d6423SLionel Sambuc 	buf_printf("\n");
129433d6423SLionel Sambuc #endif
130433d6423SLionel Sambuc }
131433d6423SLionel Sambuc 
132*f1abbce7SDavid van Moolenbroek /*
133*f1abbce7SDavid van Moolenbroek  * Generate the contents of /proc/cpuinfo.
134*f1abbce7SDavid van Moolenbroek  */
135*f1abbce7SDavid van Moolenbroek void
root_cpuinfo(void)136*f1abbce7SDavid van Moolenbroek root_cpuinfo(void)
137433d6423SLionel Sambuc {
138433d6423SLionel Sambuc 	struct cpu_info cpu_info[CONFIG_MAX_CPUS];
139433d6423SLionel Sambuc 	struct machine machine;
140*f1abbce7SDavid van Moolenbroek 	unsigned int c;
141433d6423SLionel Sambuc 
142433d6423SLionel Sambuc 	if (sys_getmachine(&machine)) {
143433d6423SLionel Sambuc 		printf("PROCFS: cannot get machine\n");
144433d6423SLionel Sambuc 		return;
145433d6423SLionel Sambuc 	}
146433d6423SLionel Sambuc 	if (sys_getcpuinfo(&cpu_info)) {
147*f1abbce7SDavid van Moolenbroek 		printf("PROCFS: cannot get CPU info\n");
148433d6423SLionel Sambuc 		return;
149433d6423SLionel Sambuc 	}
150433d6423SLionel Sambuc 
151433d6423SLionel Sambuc 	for (c = 0; c < machine.processors_count; c++)
152433d6423SLionel Sambuc 		print_cpu(&cpu_info[c], c);
153433d6423SLionel Sambuc }
154