minix3/fs/procfs/cpuinfo.c

135 lines
2.1 KiB
C

#include "inc.h"
#include "../../kernel/arch/i386/include/archconst.h"
#ifndef CONFIG_MAX_CPUS
#define CONFIG_MAX_CPUS 1
#endif
static const char * x86_flag[] = {
"fpu",
"vme",
"de",
"pse",
"tsc",
"msr",
"pae",
"mce",
"cx8",
"apic",
"",
"sep",
"mtrr",
"pge",
"mca",
"cmov",
"pat",
"pse36",
"psn",
"clfsh",
"",
"dts",
"acpi",
"mmx",
"fxsr",
"sse",
"sse2",
"ss",
"ht",
"tm",
"",
"pbe",
"pni",
"",
"",
"monitor",
"ds_cpl",
"vmx",
"smx",
"est",
"tm2",
"ssse3",
"cid",
"",
"",
"cx16",
"xtpr",
"pdcm",
"",
"",
"dca",
"sse4_1",
"sse4_2",
"x2apic",
"movbe",
"popcnt",
"",
"",
"xsave",
"osxsave",
"",
"",
"",
"",
};
static void print_cpu_flags(u32_t * flags)
{
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 32; j++) {
if (flags[i] & (1 << j) &&
x86_flag[i * 32 + j][0])
buf_printf("%s ", x86_flag[i * 32 + j]);
}
}
buf_printf("\n");
}
static void print_cpu(struct cpu_info * cpu_info, unsigned id)
{
buf_printf("%-16s: %d\n", "processor", id);
#if defined(__i386__)
switch (cpu_info->vendor) {
case CPU_VENDOR_INTEL:
buf_printf("%-16s: %s\n", "vendor_id", "GenuineIntel");
buf_printf("%-16s: %s\n", "model name", "Intel");
break;
case CPU_VENDOR_AMD:
buf_printf("%-16s: %s\n", "vendor_id", "AuthenticAMD");
buf_printf("%-16s: %s\n", "model name", "AMD");
break;
default:
buf_printf("%-16: %s\n", "vendor_id", "unknown");
}
buf_printf("%-16s: %d\n", "cpu family", cpu_info->family);
buf_printf("%-16s: %d\n", "model", cpu_info->model);
buf_printf("%-16s: %d\n", "stepping", cpu_info->stepping);
buf_printf("%-16s: %d\n", "cpu MHz", cpu_info->freq);
buf_printf("%-16s: ", "flags");
print_cpu_flags(cpu_info->flags);
buf_printf("\n");
#endif
}
void root_cpuinfo(void)
{
struct cpu_info cpu_info[CONFIG_MAX_CPUS];
struct machine machine;
unsigned c;
if (sys_getmachine(&machine)) {
printf("PROCFS: cannot get machine\n");
return;
}
if (sys_getcpuinfo(&cpu_info)) {
printf("PROCFS: cannot get cpu info\n");
return;
}
for (c = 0; c < machine.processors_count; c++)
print_cpu(&cpu_info[c], c);
}