aboutsummaryrefslogtreecommitdiff
path: root/modules/devices
diff options
context:
space:
mode:
Diffstat (limited to 'modules/devices')
-rw-r--r--modules/devices/alpha/processor.c8
-rw-r--r--modules/devices/arm/processor.c10
-rw-r--r--modules/devices/cpu_util.c38
-rw-r--r--modules/devices/cpubits.c113
-rw-r--r--modules/devices/ia64/processor.c8
-rw-r--r--modules/devices/m68k/processor.c8
-rw-r--r--modules/devices/mips/processor.c8
-rw-r--r--modules/devices/parisc/processor.c8
-rw-r--r--modules/devices/ppc/processor.c8
-rw-r--r--modules/devices/riscv/processor.c8
-rw-r--r--modules/devices/s390/processor.c8
-rw-r--r--modules/devices/sh/processor.c8
-rw-r--r--modules/devices/sparc/processor.c8
-rw-r--r--modules/devices/x86/processor.c72
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;
}
+