New procfs feature : cpuflags
PATCH 1/1 New procfs feature : cpuflags
Hi,
This patch displays x86 flags in /proc/cpuflags :
e.g.
flag1 :yes flag2 :no flagx :yes
...
PS:It works on x86 evaluating first processor flags (generic?). PS2:Why ? current cpuinfo displays all _available_ flags only and in queue mode.
Regards,
FabF
Signature · 2 lines
"Sie haben neue Mails!" - Die GMX Toolbar informiert Sie beim Surfen! Jetzt aktivieren unter http://www.gmx.net/info
arch/i386/kernel/cpu/proc.c +58 -46
@@ -4,57 +4,57 @@#include <asm/semaphore.h> #include <linux/seq_file.h> +/* +* These flag bits must match the definitions in <asm/cpufeature.h>. +* NULL means this bit is undefined or reserved; either way it doesn't +* have meaning as far as Linux is concerned. Note that it's important +* to realize there is a difference between this table and CPUID -- if +* applications want to get the raw CPUID data, they should access +* /dev/cpu/<cpu_nr>/cpuid instead. +*/ +static char *x86_cap_flags[] = { +/* Intel-defined */ +"fpu" ,"vme" ,"de" ,"pse" ,"tsc" ,"msr" ,"pae" ,"mce" , +"cx8" ,"apic" ,NULL ,"sep" ,"mtrr" ,"pge" ,"mca" ,"cmov" , +"pat" ,"pse36" ,"pn" ,"clflush" ,NULL ,"dts" ,"acpi" ,"mmx" , +"fxsr" ,"sse" ,"sse2" ,"ss" ,"ht" ,"tm" ,"ia64" ,"pbe" , + +/* AMD-defined */ +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,"syscall" ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,"mp" ,"nx" ,NULL ,"mmxext" ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,"lm" ,"3dnowext" ,"3dnow" , + +/* Transmeta-defined */ +"recovery" ,"longrun" ,NULL ,"lrti" ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , + +/* Other (Linux-defined) */ +"cxmmx" ,"k6_mtrr" ,"cyrix_arr" ,"centaur_mcr" , +NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , + +/* Intel-defined (#2) */ +"pni" ,NULL ,NULL ,"monitor" ,"ds_cpl" ,NULL ,NULL ,"tm2" , +"est" ,NULL ,"cid" ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , + +/* VIA/Cyrix/Centaur-defined */ +NULL ,NULL ,"rng" ,"rng_en" ,NULL ,NULL ,"ace" ,"ace_en" , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , +};/* * Get CPU information for use by the procfs. */ static int show_cpuinfo (struct seq_file *m,void *v) { -/* -* These flag bits must match the definitions in <asm/cpufeature.h>. -* NULL means this bit is undefined or reserved; either way it doesn't -* have meaning as far as Linux is concerned. Note that it's important -* to realize there is a difference between this table and CPUID -- if -* applications want to get the raw CPUID data, they should access -* /dev/cpu/<cpu_nr>/cpuid instead. -*/ -static char *x86_cap_flags[] = { -/* Intel-defined */ -"fpu" ,"vme" ,"de" ,"pse" ,"tsc" ,"msr" ,"pae" ,"mce" , -"cx8" ,"apic" ,NULL ,"sep" ,"mtrr" ,"pge" ,"mca" ,"cmov" , -"pat" ,"pse36" ,"pn" ,"clflush" ,NULL ,"dts" ,"acpi" ,"mmx" , -"fxsr" ,"sse" ,"sse2" ,"ss" ,"ht" ,"tm" ,"ia64" ,"pbe" , - -/* AMD-defined */ -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,"syscall" ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,"mp" ,"nx" ,NULL ,"mmxext" ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,"lm" ,"3dnowext" ,"3dnow" , - -/* Transmeta-defined */ -"recovery" ,"longrun" ,NULL ,"lrti" ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , - -/* Other (Linux-defined) */ -"cxmmx" ,"k6_mtrr" ,"cyrix_arr" ,"centaur_mcr" , -NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , - -/* Intel-defined (#2) */ -"pni" ,NULL ,NULL ,"monitor" ,"ds_cpl" ,NULL ,NULL ,"tm2" , -"est" ,NULL ,"cid" ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , - -/* VIA/Cyrix/Centaur-defined */ -NULL ,NULL ,"rng" ,"rng_en" ,NULL ,NULL ,"ace" ,"ace_en" , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , -NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL ,NULL , - };struct cpuinfo_x86 *c = v;int i, n = c - cpu_data;int fpu_exception;
@@ -144,3 +144,15 @@ .stop = c_stop, .show = show_cpuinfo, }; +int show_cpuflags (char *page) +{ +int i,len=0 ; +for ( i =0 ; i <32 *NCAPINTS ; i++ ) +if ( x86_cap_flags[i] !=NULL ){ + len+=sprintf (page+len," %s\t: " , x86_cap_flags[i]); +if (test_bit (i, cpu_data[0 ].x86_capability) ) + len+=sprintf (page+len,"yes\n" ); +else len+=sprintf (page+len,"no\n" ); + } +return len; +}
fs/proc/proc_misc.c +14 -0
@@ -66,6 +66,7 @@extern int get_exec_domain_list (char *);extern int get_dma_list (char *);extern int get_locks_status (char *,char **,off_t ,int ); +extern int show_cpuflags (char *);static int proc_calc_metrics (char *page,char **start,off_t off,int count,int *eof,int len)
@@ -149,6 +150,18 @@return proc_calc_metrics (page, start, off, count, eof, len); } +static int cpuflags_read_proc (char *page,char **start,off_t off, +int count,int *eof,void *data) +{ +int len; +#ifdef CONFIG_X86 + len=show_cpuflags (page); +return proc_calc_metrics (page, start, off, count, eof, len); +#endif +return 0 ; + +} +static int meminfo_read_proc (char *page,char **start,off_t off,int count,int *eof,void *data) {
@@ -677,6 +690,7 @@ {"loadavg", loadavg_read_proc}, {"uptime", uptime_read_proc}, {"meminfo", meminfo_read_proc}, + {"cpuflags", cpuflags_read_proc}, {"version", version_read_proc}, #ifdef CONFIG_PROC_HARDWARE {"hardware", hardware_read_proc},