diff options
Diffstat (limited to 'modules/devices')
-rw-r--r-- | modules/devices/alpha/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/arm/processor.c | 10 | ||||
-rw-r--r-- | modules/devices/cpu_util.c | 38 | ||||
-rw-r--r-- | modules/devices/cpubits.c | 113 | ||||
-rw-r--r-- | modules/devices/ia64/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/m68k/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/mips/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/parisc/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/ppc/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/riscv/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/s390/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/sh/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/sparc/processor.c | 8 | ||||
-rw-r--r-- | modules/devices/x86/processor.c | 72 |
14 files changed, 283 insertions, 30 deletions
diff --git a/modules/devices/alpha/processor.c b/modules/devices/alpha/processor.c index 07905f96..c7862232 100644 --- a/modules/devices/alpha/processor.c +++ b/modules/devices/alpha/processor.c @@ -65,6 +65,14 @@ processor_scan(void) return g_slist_append(NULL, processor); } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_info(GSList *processors) { diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c index ed570006..bcfb570e 100644 --- a/modules/devices/arm/processor.c +++ b/modules/devices/arm/processor.c @@ -256,7 +256,7 @@ processor_get_detailed_info(Processor *processor) return ret; } -gchar *get_soc_name(GSList *processors) { +gchar *processor_name(GSList *processors) { /* compatible contains a list of compatible hardware, so be careful * with matching order. * ex: "ti,omap3-beagleboard-xm", "ti,omap3450", "ti,omap3"; @@ -312,14 +312,18 @@ gchar *get_soc_name(GSList *processors) { } } g_free(compat); + UNKIFNULL(ret); return ret; } +gchar *processor_describe(GSList * processors) { + return processor_describe_by_counting_names(processors); +} + gchar *processor_meta(GSList * processors) { - gchar *meta_soc = get_soc_name(processors); + gchar *meta_soc = processor_name(processors); gchar *meta_cpu_desc = processor_describe(processors); gchar *ret = NULL; - UNKIFNULL(meta_soc); UNKIFNULL(meta_cpu_desc); ret = g_strdup_printf("[%s]\n" "%s=%s\n" diff --git a/modules/devices/cpu_util.c b/modules/devices/cpu_util.c index 123b325f..6a689a4e 100644 --- a/modules/devices/cpu_util.c +++ b/modules/devices/cpu_util.c @@ -21,6 +21,10 @@ #include "hardinfo.h" #include "cpu_util.h" +#include "cpubits.c" + +#define CPU_TOPO_NULL -9877 + const gchar *byte_order_str() { #if G_BYTE_ORDER == G_LITTLE_ENDIAN return _("Little Endian"); @@ -61,6 +65,38 @@ gint get_cpu_int(const char* item, int cpuid, int null_val) { return ret; } +int cpu_procs_cores_threads(int *p, int *c, int *t) { + cpubits *threads, *cores, *packs; + char *tmp; + int i, m, pack_id, core_id; + g_file_get_contents("/sys/devices/system/cpu/present", &tmp, NULL, NULL); + if (tmp != NULL) { + threads = cpubits_from_str(tmp); + cores = cpubits_from_str(""); + packs = cpubits_from_str(""); + m = cpubits_max(threads); + for (i = 0; i <= m; i++) { + pack_id = get_cpu_int("topology/physical_package_id", i, CPU_TOPO_NULL); + core_id = get_cpu_int("topology/core_id", i, CPU_TOPO_NULL); + if (pack_id >= 0) { CPUBIT_SET(packs, pack_id); } + if (core_id >= 0) { CPUBIT_SET(cores, core_id); } + } + *t = cpubits_count(threads); + *c = cpubits_count(cores); + *p = cpubits_count(packs); + if (!*c) *c = 1; + if (!*p) *p = 1; + free(threads); + free(cores); + free(packs); + free(tmp); + return 1; + } else { + *p = *c = *t = -1; + return 0; + } +} + cpufreq_data *cpufreq_new(gint id) { cpufreq_data *cpufd; @@ -97,7 +133,6 @@ void cpufreq_free(cpufreq_data *cpufd) g_free(cpufd); } -#define CPU_TOPO_NULL -9877 cpu_topology_data *cputopo_new(gint id) { cpu_topology_data *cputd; @@ -119,7 +154,6 @@ void cputopo_free(cpu_topology_data *cputd) g_free(cputd); } - gchar *cpufreq_section_str(cpufreq_data *cpufd) { if (cpufd == NULL) diff --git a/modules/devices/cpubits.c b/modules/devices/cpubits.c new file mode 100644 index 00000000..ba9bffc7 --- /dev/null +++ b/modules/devices/cpubits.c @@ -0,0 +1,113 @@ +/* + * rpiz - https://github.com/bp0/rpiz + * Copyright (C) 2017 Burt P. <pburt0@gmail.com> + * + * 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; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include <stdint.h> + +typedef uint32_t cpubits; +uint32_t cpubits_count(cpubits *b); +cpubits *cpubits_from_str(char *str); +char *cpubits_to_str(cpubits *bits, char *str, int max_len); + +#define CPUBITS_SIZE 4096 /* bytes, multiple of sizeof(uint32_t) */ +#define CPUBIT_SET(BITS, BIT) (BITS[BIT/32] |= (1 << BIT%32)) +#define CPUBIT_GET(BITS, BIT) ((BITS[BIT/32] & (1 << BIT%32)) >> BIT%32) +#define CPUBITS_CLEAR(BITS) memset(BITS, 0, CPUBITS_SIZE) + +uint32_t cpubits_count(cpubits *b) { + static const uint32_t max = CPUBITS_SIZE * 8; + uint32_t count = 0, i = 0; + while (i < max) { + count += CPUBIT_GET(b, i); + i++; + } + return count; +} + +int cpubits_max(cpubits *b) { + int i = CPUBITS_SIZE * 8; + while (i >= 0) { + if (CPUBIT_GET(b, i)) + break; + i--; + } + return i; +} + +cpubits *cpubits_from_str(char *str) { + char *v, *nv, *hy; + int r0, r1; + cpubits *newbits = malloc(CPUBITS_SIZE); + if (newbits) { + memset(newbits, 0, CPUBITS_SIZE); + if (str != NULL) { + v = (char*)str; + while ( *v != 0 ) { + nv = strchr(v, ','); /* strchrnul() */ + if (nv == NULL) nv = strchr(v, 0); /* equivalent */ + hy = strchr(v, '-'); + if (hy && hy < nv) { + r0 = strtol(v, NULL, 0); + r1 = strtol(hy + 1, NULL, 0); + } else { + r0 = r1 = strtol(v, NULL, 0); + } + for (; r0 <= r1; r0++) { + CPUBIT_SET(newbits, r0); + } + v = (*nv == ',') ? nv + 1 : nv; + } + } + } + return newbits; +} + +char *cpubits_to_str(cpubits *bits, char *str, int max_len) { + static const uint32_t max = CPUBITS_SIZE * 8; + uint32_t i = 1, seq_start = 0, seq_last = 0, seq = 0, l = 0; + char buffer[65536] = ""; + if (CPUBIT_GET(bits, 0)) { + seq = 1; + strcpy(buffer, "0"); + } + while (i < max) { + if (CPUBIT_GET(bits, i) ) { + seq_last = i; + if (!seq) { + seq = 1; + seq_start = i; + l = strlen(buffer); + sprintf(buffer + l, "%s%d", l ? "," : "", i); + } + } else { + if (seq && seq_last != seq_start) { + l = strlen(buffer); + sprintf(buffer + l, "-%d", seq_last); + } + seq = 0; + } + i++; + } + if (str == NULL) + return strdup(buffer); + else { + strncpy(str, buffer, max_len); + return str; + } +} diff --git a/modules/devices/ia64/processor.c b/modules/devices/ia64/processor.c index c617f096..66eef866 100644 --- a/modules/devices/ia64/processor.c +++ b/modules/devices/ia64/processor.c @@ -124,6 +124,14 @@ processor_scan(void) return procs; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_detailed_info(Processor *processor) { diff --git a/modules/devices/m68k/processor.c b/modules/devices/m68k/processor.c index de24ada8..e030732a 100644 --- a/modules/devices/m68k/processor.c +++ b/modules/devices/m68k/processor.c @@ -59,6 +59,14 @@ processor_scan(void) return g_slist_append(NULL, processor); } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_info(GSList *processors) { diff --git a/modules/devices/mips/processor.c b/modules/devices/mips/processor.c index 8cb82807..b31af7dd 100644 --- a/modules/devices/mips/processor.c +++ b/modules/devices/mips/processor.c @@ -52,6 +52,14 @@ processor_scan(void) return g_slist_append(NULL, processor); } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_info(GSList *processors) { diff --git a/modules/devices/parisc/processor.c b/modules/devices/parisc/processor.c index 1a5b6f46..afff58d2 100644 --- a/modules/devices/parisc/processor.c +++ b/modules/devices/parisc/processor.c @@ -120,6 +120,14 @@ processor_scan(void) return procs; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_detailed_info(Processor *processor) { diff --git a/modules/devices/ppc/processor.c b/modules/devices/ppc/processor.c index f06c90a3..76447852 100644 --- a/modules/devices/ppc/processor.c +++ b/modules/devices/ppc/processor.c @@ -129,6 +129,14 @@ processor_scan(void) return procs; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_detailed_info(Processor *processor) { diff --git a/modules/devices/riscv/processor.c b/modules/devices/riscv/processor.c index 740742a5..7cb3a395 100644 --- a/modules/devices/riscv/processor.c +++ b/modules/devices/riscv/processor.c @@ -150,6 +150,14 @@ gchar *processor_get_capabilities_from_flags(gchar * strflags) return tmp; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_detailed_info(Processor *processor) { diff --git a/modules/devices/s390/processor.c b/modules/devices/s390/processor.c index b075a53c..1e980caf 100644 --- a/modules/devices/s390/processor.c +++ b/modules/devices/s390/processor.c @@ -106,6 +106,14 @@ processor_scan(void) return procs; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_detailed_info(Processor *processor) { diff --git a/modules/devices/sh/processor.c b/modules/devices/sh/processor.c index 05a90191..9da2f9b0 100644 --- a/modules/devices/sh/processor.c +++ b/modules/devices/sh/processor.c @@ -58,6 +58,14 @@ processor_scan(void) return g_slist_append(NULL, processor); } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_info(GSList *processors) { diff --git a/modules/devices/sparc/processor.c b/modules/devices/sparc/processor.c index 32450f6f..32c7aa94 100644 --- a/modules/devices/sparc/processor.c +++ b/modules/devices/sparc/processor.c @@ -53,6 +53,14 @@ processor_scan(void) return g_slist_append(NULL, processor); } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + gchar * processor_get_info(GSList *processors) { diff --git a/modules/devices/x86/processor.c b/modules/devices/x86/processor.c index 707983ed..c5bdd5e2 100644 --- a/modules/devices/x86/processor.c +++ b/modules/devices/x86/processor.c @@ -430,39 +430,61 @@ gchar *processor_get_detailed_info(Processor * processor) return ret; } +gchar *processor_name(GSList * processors) { + return processor_name_default(processors); +} + +gchar *processor_describe(GSList * processors) { + return processor_describe_default(processors); +} + +gchar *processor_meta(GSList * processors) { + gchar *meta_cpu_name = processor_name(processors); + gchar *meta_cpu_desc = processor_describe(processors); + gchar *ret = NULL; + UNKIFNULL(meta_cpu_desc); + ret = g_strdup_printf("[%s]\n" + "%s=%s\n" + "%s=%s\n", + _("Package Information"), + _("Name"), meta_cpu_name, + _("Description"), meta_cpu_desc); + g_free(meta_cpu_desc); + return ret; +} + gchar *processor_get_info(GSList * processors) { Processor *processor; + gchar *ret, *tmp, *hashkey; + gchar *meta; /* becomes owned by more_info? no need to free? */ + GSList *l; - if (g_slist_length(processors) > 1) { - gchar *ret, *tmp, *hashkey; - GSList *l; + tmp = g_strdup_printf("$CPU_META$%s=\n", _("Package Information") ); - tmp = g_strdup(""); + meta = processor_meta(processors); + moreinfo_add_with_prefix("DEV", "CPU_META", meta); - for (l = processors; l; l = l->next) { - processor = (Processor *) l->data; - - tmp = g_strdup_printf(_("%s$CPU%d$%s=%.2fMHz\n"), - tmp, processor->id, - processor->model_name, - processor->cpu_mhz); - - hashkey = g_strdup_printf("CPU%d", processor->id); - moreinfo_add_with_prefix("DEV", hashkey, - processor_get_detailed_info(processor)); - g_free(hashkey); - } + for (l = processors; l; l = l->next) { + processor = (Processor *) l->data; - ret = g_strdup_printf("[$ShellParam$]\n" - "ViewType=1\n" - "[Processors]\n" - "%s", tmp); - g_free(tmp); + tmp = g_strdup_printf(_("%s$CPU%d$%s=%.2fMHz\n"), + tmp, processor->id, + processor->model_name, + processor->cpu_mhz); - return ret; + hashkey = g_strdup_printf("CPU%d", processor->id); + moreinfo_add_with_prefix("DEV", hashkey, + processor_get_detailed_info(processor)); + g_free(hashkey); } - processor = (Processor *) processors->data; - return processor_get_detailed_info(processor); + ret = g_strdup_printf("[$ShellParam$]\n" + "ViewType=1\n" + "[Processors]\n" + "%s", tmp); + g_free(tmp); + + return ret; } + |