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 /modules/devices/x86/processor.c | |
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>
Diffstat (limited to 'modules/devices/x86/processor.c')
-rw-r--r-- | modules/devices/x86/processor.c | 37 |
1 files changed, 33 insertions, 4 deletions
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; |