From 3c6274b8be6b61cbd3e5eef2041db6bb89b27b92 Mon Sep 17 00:00:00 2001 From: Tomas Hruby Date: Tue, 26 Oct 2010 21:08:00 +0000 Subject: [PATCH] /proc/cpuinfo - when /proc/cpuinfo is read procfs retrievs information about cpus from the kernel, formats it and prints it --- servers/procfs/Makefile | 2 +- servers/procfs/cpuinfo.c | 133 +++++++++++++++++++++++++++++++++++++++ servers/procfs/cpuinfo.h | 6 ++ servers/procfs/main.c | 1 + servers/procfs/root.c | 2 + 5 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 servers/procfs/cpuinfo.c create mode 100644 servers/procfs/cpuinfo.h diff --git a/servers/procfs/Makefile b/servers/procfs/Makefile index 38ae2ab06..a479da817 100644 --- a/servers/procfs/Makefile +++ b/servers/procfs/Makefile @@ -1,6 +1,6 @@ # Makefile for ProcFS server PROG= procfs -SRCS= buf.c main.c pid.c root.c tree.c util.c +SRCS= buf.c main.c pid.c root.c tree.c util.c cpuinfo.c CPPFLAGS+= -I${MINIXSRCDIR} -I${MINIXSRCDIR}/servers diff --git a/servers/procfs/cpuinfo.c b/servers/procfs/cpuinfo.c new file mode 100644 index 000000000..cd2f8381b --- /dev/null +++ b/servers/procfs/cpuinfo.c @@ -0,0 +1,133 @@ +#include "inc.h" +#include "../../kernel/arch/i386/include/archconst.h" + +#ifndef CONFIG_MAX_CPUS +#define CONFIG_MAX_CPUS 1 +#endif + +PRIVATE 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", + "", + "", + "", + "", +}; + +PRIVATE 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"); +} + +PRIVATE void print_cpu(struct cpu_info * cpu_info, unsigned id) +{ + buf_printf("%-16s: %d\n", "processor", id); + + 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"); +} + +PUBLIC 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); +} diff --git a/servers/procfs/cpuinfo.h b/servers/procfs/cpuinfo.h new file mode 100644 index 000000000..7e381de0e --- /dev/null +++ b/servers/procfs/cpuinfo.h @@ -0,0 +1,6 @@ +#ifndef __PROCFS_CPUINFO_H__ +#define __PROCFS_CPUINFO_H__ + +void root_cpuinfo(void); + +#endif /* __PROCFS_CPUINFO_H__ */ diff --git a/servers/procfs/main.c b/servers/procfs/main.c index 152acb212..fac11eafa 100644 --- a/servers/procfs/main.c +++ b/servers/procfs/main.c @@ -1,6 +1,7 @@ /* ProcFS - main.c - by Alen Stojanov and David van Moolenbroek */ #include "inc.h" +#include "cpuinfo.h" FORWARD _PROTOTYPE( void init_hook, (void) ); diff --git a/servers/procfs/root.c b/servers/procfs/root.c index d57bc0a55..2b70b993e 100644 --- a/servers/procfs/root.c +++ b/servers/procfs/root.c @@ -2,6 +2,7 @@ #include "inc.h" #include +#include "cpuinfo.h" FORWARD _PROTOTYPE( void root_hz, (void) ); FORWARD _PROTOTYPE( void root_uptime, (void) ); @@ -17,6 +18,7 @@ struct file root_files[] = { { "kinfo", REG_ALL_MODE, (data_t) root_kinfo }, { "meminfo", REG_ALL_MODE, (data_t) root_meminfo }, { "pci", REG_ALL_MODE, (data_t) root_pci }, + { "cpuinfo", REG_ALL_MODE, (data_t) root_cpuinfo }, { NULL, 0, NULL } };