diff options
Diffstat (limited to 'modules/devices')
-rw-r--r-- | modules/devices/x86/processor.c | 113 |
1 files changed, 112 insertions, 1 deletions
diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c index 058d48b6..137324f8 100644 --- a/modules/devices/x86/processor.c +++ b/modules/devices/x86/processor.c @@ -678,12 +678,121 @@ gchar *processor_describe(GSList * processors) { return processor_describe_default(processors); } +gchar *dmi_socket_info() { + static const char empty_mem_str[] = "No Module Installed"; + gchar *ret = strdup(""); + unsigned long dt = 4, dtm = 17, i; + dmi_handle_list *hl = dmidecode_handles(&dt); + dmi_handle_list *hlm = dmidecode_handles(&dtm); + 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 { + for(i = 0; i < hl->count; i++) { + unsigned long 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 (%lu) %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); + + if (hlm) { + for(i = 0; i < hlm->count; i++) { + unsigned long h = hlm->handles[i]; + gchar *locator = dmidecode_match("Locator", &dtm, &h); + gchar *size_str = dmidecode_match("Size", &dtm, &h); + + if (strcmp(size_str, empty_mem_str) == 0) { + ret = h_strdup_cprintf("[%s (%lu) %s]\n" + "%s=0x%x\n" + "%s=%s\n", + ret, + _("Memory Socket"), i, locator, + _("DMI Handle"), h, + _("Size"), _("(Empty)") ); + } else { + gchar *form_factor = dmidecode_match("Form Factor", &dtm, &h); + gchar *type = dmidecode_match("Type", &dtm, &h); + gchar *type_detail = dmidecode_match("Type Detail", &dtm, &h); + gchar *speed_str = dmidecode_match("Speed", &dtm, &h); + gchar *configured_clock_str = dmidecode_match("Configured Clock Speed", &dtm, &h); + gchar *voltage_min_str = dmidecode_match("Minimum Voltage", &dtm, &h); + gchar *voltage_max_str = dmidecode_match("Maximum Voltage", &dtm, &h); + gchar *voltage_conf_str = dmidecode_match("Configured Voltage", &dtm, &h); + + ret = h_strdup_cprintf("[%s (%lu) %s]\n" + "%s=0x%x\n" + "%s=%s\n" + "%s=%s / %s\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n" + "%s=%s\n", + ret, + _("Memory Socket"), i, locator, + _("DMI Handle"), h, + _("Form Factor"), form_factor, + _("Type"), type, type_detail, + _("Size"), size_str, + _("Speed"), speed_str, + _("Configured Clock Frequency"), configured_clock_str, + _("Minimum Voltage"), voltage_min_str, + _("Maximum Voltage"), voltage_max_str, + _("Configured Voltage"), voltage_conf_str + ); + g_free(type); + g_free(form_factor); + g_free(speed_str); + g_free(configured_clock_str); + g_free(voltage_min_str); + g_free(voltage_max_str); + g_free(voltage_conf_str); + } + g_free(size_str); + g_free(locator); + } + dmi_handle_list_free(hlm); + } + } + + 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 +800,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); |