diff options
author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-04-22 00:35:53 -0300 |
---|---|---|
committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-04-22 00:35:53 -0300 |
commit | 5f01c706267c595de92406a32e7f31ef5056c2d0 (patch) | |
tree | d1e74ef54efc41ada622900fe3e2a50dee44a237 /modules/devices/x86 | |
parent | 09fcc751ef158898c315ebc9299a0fa3a722d914 (diff) |
New upstream version 2.0.3preupstream/2.0.3pre
Diffstat (limited to 'modules/devices/x86')
-rw-r--r-- | modules/devices/x86/processor.c | 108 | ||||
-rw-r--r-- | modules/devices/x86/x86_data.c | 88 |
2 files changed, 162 insertions, 34 deletions
diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c index f1c2b6e9..4141f051 100644 --- a/modules/devices/x86/processor.c +++ b/modules/devices/x86/processor.c @@ -1,10 +1,10 @@ /* * HardInfo - Displays System Information - * Copyright (C) 2003-2006 Leandro A. F. Pereira <leandro@hardinfo.org> + * Copyright (C) 2003-2006 L. A. F. Pereira <l@tia.mat.br> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. + * the Free Software Foundation, version 2 or later. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,7 +19,7 @@ #include "hardinfo.h" #include "devices.h" #include "cpu_util.h" - +#include "nice_name.h" #include "x86_data.h" #include "x86_data.c" @@ -275,7 +275,7 @@ gchar *clocks_summary(GSList * processors) /* create list of all clock references */ for (l = processors; l; l = l->next) { p = (Processor*)l->data; - if (p->cpufreq) { + if (p->cpufreq && p->cpufreq->cpukhz_max > 0) { all_clocks = g_slist_prepend(all_clocks, p->cpufreq); } } @@ -448,14 +448,15 @@ gchar *caches_summary(GSList * processors) return ret; } -#define PROC_SCAN_READ_BUFFER_SIZE 896 +#define PROC_SCAN_READ_BUFFER_SIZE 1024 GSList *processor_scan(void) { GSList *procs = NULL, *l = NULL; Processor *processor = NULL; FILE *cpuinfo; - gchar buffer[PROC_SCAN_READ_BUFFER_SIZE]; + gchar *buffer; + buffer = g_malloc(PROC_SCAN_READ_BUFFER_SIZE); cpuinfo = fopen(PROC_CPUINFO, "r"); if (!cpuinfo) return NULL; @@ -513,6 +514,7 @@ GSList *processor_scan(void) } fclose(cpuinfo); + g_free(buffer); /* finish last */ if (processor) @@ -567,6 +569,8 @@ GSList *processor_scan(void) if (processor->cpufreq->cpukhz_max) processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; + + nice_name_x86_cpuid_model_string(processor->model_name); } return procs; @@ -584,7 +588,7 @@ gchar *processor_get_capabilities_from_flags(gchar *strflags, gchar *lookup_pref old = flags; while (flags[j]) { - if ( sscanf(flags[j], "[%d]", &i) ) { + if ( sscanf(flags[j], "[%d]", &i)==1 ) { /* Some flags are indexes, like [13], and that looks like * a new section to hardinfo shell */ tmp = h_strdup_cprintf("(%s%d)=\n", tmp, @@ -624,7 +628,7 @@ gchar *processor_get_detailed_info(Processor * processor) ret = g_strdup_printf("[%s]\n" "%s=%s\n" "%s=%d, %d, %d (%s)\n" /* family, model, stepping (decoded name) */ - "%s=%s\n" /* vendor */ + "$^$%s=%s\n" /* vendor */ "%s=%s\n" /* microcode */ "[%s]\n" /* configuration */ "%s=%d %s\n" /* cache size (from cpuinfo) */ @@ -648,7 +652,7 @@ gchar *processor_get_detailed_info(Processor * processor) processor->model, processor->stepping, processor->strmodel, - _("Vendor"), vendor_get_name(processor->vendor_id), + _("Vendor"), processor->vendor_id, _("Microcode Version"), processor->microcode, _("Configuration"), _("Cache Size"), processor->cache_size, _("kb"), @@ -678,12 +682,62 @@ gchar *processor_describe(GSList * processors) { return processor_describe_default(processors); } +gchar *dmi_socket_info() { + gchar *ret; + dmi_type dt = 4; + guint i; + dmi_handle_list *hl = dmidecode_handles(&dt); + + if (!hl) { + ret = g_strdup_printf("[%s]\n%s=%s\n", + _("Socket Information"), _("Result"), + (getuid() == 0) + ? _("(Not available)") + : _("(Not available; Perhaps try running HardInfo as root.)") ); + } else { + ret = g_strdup(""); + for(i = 0; i < hl->count; i++) { + dmi_handle h = hl->handles[i]; + gchar *upgrade = dmidecode_match("Upgrade", &dt, &h); + gchar *socket = dmidecode_match("Socket Designation", &dt, &h); + gchar *bus_clock_str = dmidecode_match("External Clock", &dt, &h); + gchar *voltage_str = dmidecode_match("Voltage", &dt, &h); + gchar *max_speed_str = dmidecode_match("Max Speed", &dt, &h); + + ret = h_strdup_cprintf("[%s (%d) %s]\n" + "%s=0x%x\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n", + ret, + _("CPU Socket"), i, socket, + _("DMI Handle"), h, + _("Type"), upgrade, + _("Voltage"), voltage_str, + _("External Clock"), bus_clock_str, + _("Max Frequency"), max_speed_str + ); + g_free(upgrade); + g_free(socket); + g_free(bus_clock_str); + g_free(voltage_str); + g_free(max_speed_str); + } + + dmi_handle_list_free(hl); + } + + return ret; +} + gchar *processor_meta(GSList * processors) { gchar *meta_cpu_name = processor_name(processors); gchar *meta_cpu_desc = processor_describe(processors); gchar *meta_freq_desc = processor_frequency_desc(processors); gchar *meta_clocks = clocks_summary(processors); gchar *meta_caches = caches_summary(processors); + gchar *meta_dmi = dmi_socket_info(); gchar *ret = NULL; UNKIFNULL(meta_cpu_desc); ret = g_strdup_printf("[%s]\n" @@ -691,13 +745,15 @@ gchar *processor_meta(GSList * processors) { "%s=%s\n" "%s=%s\n" "%s" + "%s" "%s", _("Package Information"), _("Name"), meta_cpu_name, _("Topology"), meta_cpu_desc, _("Logical CPU Config"), meta_freq_desc, meta_clocks, - meta_caches); + meta_caches, + meta_dmi); g_free(meta_cpu_desc); g_free(meta_freq_desc); g_free(meta_clocks); @@ -711,8 +767,9 @@ gchar *processor_get_info(GSList * processors) gchar *ret, *tmp, *hashkey; gchar *meta; /* becomes owned by more_info? no need to free? */ GSList *l; + gchar *icons=g_strdup(""); - tmp = g_strdup_printf("$CPU_META$%s=\n", _("Package Information") ); + tmp = g_strdup_printf("$!CPU_META$%s=|Summary\n", "all"); meta = processor_meta(processors); moreinfo_add_with_prefix("DEV", "CPU_META", meta); @@ -720,27 +777,46 @@ gchar *processor_get_info(GSList * processors) for (l = processors; l; l = l->next) { processor = (Processor *) l->data; - tmp = g_strdup_printf("%s$CPU%d$%s=%.2f %s|%d:%d|%d\n", + gchar *model_name = g_strdup(processor->model_name); + const Vendor *v = vendor_match(processor->vendor_id, NULL); + if (v) + tag_vendor(&model_name, 0, v->name_short ? v->name_short : v->name, v->ansi_color, params.fmt_opts); + + // bp: not convinced it looks good, but here's how it would be done... + //icons = h_strdup_cprintf("Icon$CPU%d$cpu%d=processor.png\n", icons, processor->id, processor->id); + + tmp = g_strdup_printf("%s$CPU%d$cpu%d=%.2f %s|%s|%d:%d\n", tmp, processor->id, - processor->model_name, + processor->id, processor->cpu_mhz, _("MHz"), + model_name, processor->cputopo->socket_id, - processor->cputopo->core_id, - processor->cputopo->id ); + processor->cputopo->core_id); hashkey = g_strdup_printf("CPU%d", processor->id); moreinfo_add_with_prefix("DEV", hashkey, processor_get_detailed_info(processor)); g_free(hashkey); + g_free(model_name); } ret = g_strdup_printf("[$ShellParam$]\n" "ViewType=1\n" + "ColumnTitle$TextValue=%s\n" + "ColumnTitle$Value=%s\n" "ColumnTitle$Extra1=%s\n" "ColumnTitle$Extra2=%s\n" + "ShowColumnHeaders=true\n" + "%s" "[Processors]\n" - "%s", _("Socket:Core"), _("Thread" /*TODO: +s*/), tmp); + "%s", _("Device"), _("Frequency"), _("Model"), _("Socket:Core"), icons, tmp); g_free(tmp); + g_free(icons); + + // now here's something fun... + struct Info *i = info_unflatten(ret); + g_free(ret); + ret = info_flatten(i); return ret; } diff --git a/modules/devices/x86/x86_data.c b/modules/devices/x86/x86_data.c index c052f4e1..f56e8668 100644 --- a/modules/devices/x86/x86_data.c +++ b/modules/devices/x86/x86_data.c @@ -18,6 +18,7 @@ * */ +#include <json-glib/json-glib.h> #include <stdlib.h> #include <stdio.h> #include <string.h> @@ -35,9 +36,13 @@ * https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/arch/x86/include/asm/cpufeatures.h?id=refs/tags/v4.9 * hardinfo: modules/devices/x86/processor.c */ -static struct { - char *name, *meaning; -} tab_flag_meaning[] = { + +struct flag_to_meaning { + char *name; + char *meaning; +}; + +static const struct flag_to_meaning builtin_tab_flag_meaning[] = { /* Intel-defined CPU features, CPUID level 0x00000001 (edx) * See also Wikipedia and table 2-27 in Intel Advanced Vector Extensions Programming Reference */ { "fpu", NC_("x86-flag", /*/flag:fpu*/ "Onboard FPU (floating point support)") }, @@ -282,6 +287,8 @@ static struct { { "bug:cpu_meltdown", NC_("x86-flag", /*/bug:cpu_insecure & bug:cpu_meltdown*/ "CPU is affected by meltdown attack and needs kernel page table isolation") }, { "bug:spectre_v1", NC_("x86-flag", /*/bug:spectre_v1*/ "CPU is affected by Spectre variant 1 attack with conditional branches") }, { "bug:spectre_v2", NC_("x86-flag", /*/bug:spectre_v2*/ "CPU is affected by Spectre variant 2 attack with indirect branches") }, + { "bug:spec_store_bypass", NC_("x86-flag", /*/bug:spec_store_bypass*/ "CPU is affected by speculative store bypass attack") }, + { "bug:l1tf", NC_("x86-flag", /*/bug:l1tf*/ "CPU is affected by L1 Terminal Fault") }, /* power management * ... from arch/x86/kernel/cpu/powerflags.h */ { "pm:ts", NC_("x86-flag", /*/flag:pm:ts*/ "temperature sensor") }, @@ -299,32 +306,77 @@ static struct { { NULL, NULL}, }; +static struct flag_to_meaning *tab_flag_meaning; + static char all_flags[4096] = ""; -#define APPEND_FLAG(f) strcat(all_flags, f); strcat(all_flags, " "); -const char *x86_flag_list() { - int i = 0, built = 0; - built = strlen(all_flags); - if (!built) { - while(tab_flag_meaning[i].name != NULL) { - APPEND_FLAG(tab_flag_meaning[i].name); - i++; - } - } - return all_flags; +static void build_meaning_table_iter(JsonObject *object, + const gchar *member_name, + JsonNode *member_node, + gpointer user_data) +{ + int *i = user_data; + + tab_flag_meaning[*i] = (struct flag_to_meaning) { + .name = g_strdup(member_name), + .meaning = g_strdup(json_node_get_string(member_node)), + }; + + (*i)++; } -const char *x86_flag_meaning(const char *flag) { +void cpuflags_x86_init(void) +{ + gchar *flag_json = g_build_filename(g_get_user_config_dir(), "hardinfo2", + "cpuflags.json", NULL); + gboolean use_builtin_table = TRUE; + + if (!g_file_test(flag_json, G_FILE_TEST_EXISTS)) + goto use_builtin_table; + + JsonParser *parser = json_parser_new(); + if (!json_parser_load_from_file(parser, flag_json, NULL)) + goto use_builtin_table_with_json; + + JsonNode *root = json_parser_get_root(parser); + if (json_node_get_node_type(root) != JSON_NODE_OBJECT) + goto use_builtin_table_with_json; + + JsonObject *x86_flags = + json_object_get_object_member(json_node_get_object(root), "x86"); + if (!x86_flags) + goto use_builtin_table_with_json; + + tab_flag_meaning = + g_new(struct flag_to_meaning, json_object_get_size(x86_flags) + 1); int i = 0; - if (flag) - while(tab_flag_meaning[i].name != NULL) { + json_object_foreach_member(x86_flags, build_meaning_table_iter, &i); + tab_flag_meaning[i] = (struct flag_to_meaning){NULL, NULL}; + use_builtin_table = FALSE; + +use_builtin_table_with_json: + g_object_unref(parser); +use_builtin_table: + g_free(flag_json); + + if (use_builtin_table) + tab_flag_meaning = (struct flag_to_meaning *)builtin_tab_flag_meaning; +} + +const char *x86_flag_meaning(const char *flag) { + int i; + + if (!flag) + return NULL; + + for (i = 0; tab_flag_meaning[i].name; i++) { if (strcmp(tab_flag_meaning[i].name, flag) == 0) { if (tab_flag_meaning[i].meaning != NULL) return C_("x86-flag", tab_flag_meaning[i].meaning); else return NULL; } - i++; } + return NULL; } |