diff options
author | Burt P <pburt0@gmail.com> | 2017-04-09 22:08:37 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2017-04-10 06:54:33 -0700 |
commit | 91f07a0c09a349fd55659a18a5a6906c9ef969bb (patch) | |
tree | 0d152580f1f3a9446f297c9f5a62fad54ead1c4f /modules/devices/x86 | |
parent | 46299298286684ed0d64c84f782a53f11c6cacd8 (diff) |
More "feature" flags to bug workarounds
Add some more bug "feature" flags from old kernels to the bug
workaround list generated if no such list was available in
/proc/cpuinfo.
Also, fixes a crash if the first bug is not fdiv.
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules/devices/x86')
-rw-r--r-- | modules/devices/x86/processor.c | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c index 9acd9e19..56968f41 100644 --- a/modules/devices/x86/processor.c +++ b/modules/devices/x86/processor.c @@ -213,6 +213,20 @@ fail: g_free(endpoint); } +int processor_has_flag(gchar * strflags, gchar * strflag) +{ + gchar **flags; + gint ret = 0; + + if (strflags == NULL || strflag == NULL) + return 0; + + flags = g_strsplit(strflags, " ", 0); + ret = g_strv_contains((const gchar * const *)flags, strflag); + g_strfreev(flags); + return ret; +} + GSList *processor_scan(void) { GSList *procs = NULL; @@ -263,11 +277,20 @@ GSList *processor_scan(void) if (processor->bugs == NULL || g_strcmp0(processor->bugs, "") == 0) { g_free(processor->bugs); /* make bugs list on old kernels that don't offer one */ - processor->bugs = g_strdup_printf("%s%s%s%s", - processor->bug_fdiv ? "fdiv" : "", + processor->bugs = g_strdup_printf("%s%s%s%s%s%s%s%s%s%s", + /* the oldest bug workarounds indicated in /proc/cpuinfo */ + processor->bug_fdiv ? " fdiv" : "", processor->bug_hlt ? " _hlt" : "", processor->bug_f00f ? " f00f" : "", - processor->bug_coma ? " coma" : ""); + processor->bug_coma ? " coma" : "", + /* these bug workarounds were reported as "features" in older kernels */ + processor_has_flag(processor->flags, "fxsave_leak") ? " fxsave_leak" : "", + processor_has_flag(processor->flags, "clflush_monitor") ? " clflush_monitor" : "", + processor_has_flag(processor->flags, "11ap") ? " 11ap" : "", + processor_has_flag(processor->flags, "tlb_mmatch") ? " tlb_mmatch" : "", + processor_has_flag(processor->flags, "apic_c1e") ? " apic_c1e" : "", + ""); /* just to make adding lines easier */ + g_strchug(processor->bugs); } get_int("model", processor->model); |