diff options
| author | Burt P <pburt0@gmail.com> | 2017-04-08 00:21:18 -0500 | 
|---|---|---|
| committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2017-04-07 22:41:16 -0700 | 
| commit | 36aac085acebbce134bd10c5edb17856ca6c1df2 (patch) | |
| tree | 486d0d16c3a7ced41c825d2fd84dceaae3a8f6a9 | |
| parent | ac0e279c27bfb10f61d97f6ceb68a4be612fe569 (diff) | |
Add /proc/cpuinfo bugs list handling
In June 2014, /proc/cpuinfo added a bugs (fixes/workarounds) list that
works like the flags list.
Show this list in the CPU information with the extra description from
the source comments in arch/x86/include/asm/cpufeatures.h.
Signed-off-by: Burt P <pburt0@gmail.com>
| -rw-r--r-- | includes/x86/processor-platform.h | 1 | ||||
| -rw-r--r-- | modules/devices/x86/processor.c | 37 | 
2 files changed, 34 insertions, 4 deletions
| diff --git a/includes/x86/processor-platform.h b/includes/x86/processor-platform.h index feffa0dc..1dbb48e2 100644 --- a/includes/x86/processor-platform.h +++ b/includes/x86/processor-platform.h @@ -34,6 +34,7 @@ struct _Processor {      gchar *model_name;      gchar *vendor_id;      gchar *flags; +    gchar *bugs;      gint cache_size;      gfloat bogomips, cpu_mhz; diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c index d2be03e6..83fca7c9 100644 --- a/modules/devices/x86/processor.c +++ b/modules/devices/x86/processor.c @@ -246,6 +246,7 @@ GSList *processor_scan(void)  	    get_str("model name", processor->model_name);  	    get_str("vendor_id", processor->vendor_id);  	    get_str("flags", processor->flags); +	    get_str("bugs", processor->bugs);  	    get_int("cache size", processor->cache_size);  	    get_float("cpu MHz", processor->cpu_mhz);  	    get_float("bogomips", processor->bogomips); @@ -413,6 +414,26 @@ static struct {  	{ NULL,		NULL						},  }; +static struct { +    char *name, *meaning; +} bug_meaning[] = { +	{ "f00f",        "Intel F00F bug"    }, +	{ "fdiv",        "FPU FDIV"          }, +	{ "coma",        "Cyrix 6x86 coma"   }, +	{ "tlb_mmatch",  "AMD Erratum 383"   }, +	{ "apic_c1e",    "AMD Erratum 400"   }, +	{ "11ap",        "Bad local APIC aka 11AP"  }, +	{ "fxsave_leak", "FXSAVE leaks FOP/FIP/FOP" }, +	{ "clflush_monitor",  "AAI65, CLFLUSH required before MONITOR" }, +	{ "sysret_ss_attrs",  "SYSRET doesn't fix up SS attrs" }, +	{ "espfix",      "IRET to 16-bit SS corrupts ESP/RSP high bits" }, +	{ "null_seg",    "Nulling a selector preserves the base" }, +	{ "swapgs_fence","SWAPGS without input dep on GS" }, +	{ "monitor",     "IPI required to wake up remote CPU" }, +	{ "amd_e400",    "AMD Erratum 400" }, +	{ NULL,		NULL						}, +}; +  GHashTable *cpu_flags = NULL;  static void @@ -426,6 +447,10 @@ populate_cpu_flags_list_internal(GHashTable *hash_table)          g_hash_table_insert(cpu_flags, flag_meaning[i].name,                              flag_meaning[i].meaning);      } +    for (i = 0; bug_meaning[i].name != NULL; i++) { +        g_hash_table_insert(cpu_flags, bug_meaning[i].name, +                            bug_meaning[i].meaning); +    }  }  void cpu_flags_init(void) @@ -508,9 +533,10 @@ gchar *processor_get_capabilities_from_flags(gchar * strflags)  gchar *processor_get_detailed_info(Processor * processor)  { -    gchar *tmp, *ret, *cache_info; +    gchar *tmp_flags, *tmp_bugs, *ret, *cache_info; -    tmp = processor_get_capabilities_from_flags(processor->flags); +    tmp_flags = processor_get_capabilities_from_flags(processor->flags); +    tmp_bugs = processor_get_capabilities_from_flags(processor->bugs);      cache_info = __cache_get_info_as_string(processor);      ret = g_strdup_printf(_("[Processor]\n" @@ -531,6 +557,8 @@ gchar *processor_get_detailed_info(Processor * processor)  			  "[Cache]\n"  			  "%s\n"  			  "[Capabilities]\n" +			  "%s" +			  "[Bugs]\n"  			  "%s"),  			  processor->model_name,  			  processor->family, @@ -551,8 +579,9 @@ gchar *processor_get_detailed_info(Processor * processor)  			  processor->bug_coma ? processor->bug_coma : "no",  			  processor->has_fpu  ? processor->has_fpu  : "no",  			  cache_info, -			  tmp); -    g_free(tmp); +			  tmp_flags, tmp_bugs); +    g_free(tmp_flags); +    g_free(tmp_bugs);      g_free(cache_info);      return ret; | 
