summaryrefslogtreecommitdiff
path: root/modules/devices/arm
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2017-05-24 13:54:01 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2017-06-02 12:50:14 -0700
commit4a755a36f0e8410ce9fe5ed7f9640b3923f9f12e (patch)
tree1941957f81a6806487822d2aa1e66f3e08fe15ce /modules/devices/arm
parentb7be9c2136b988cccf76054c35f754dc9552f810 (diff)
arm: more processor details
* Report the ARM CPUID information from /proc/cpuinfo. * Attempt to detect if running 32-bit on a 64-bit processor. Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules/devices/arm')
-rw-r--r--modules/devices/arm/processor.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/modules/devices/arm/processor.c b/modules/devices/arm/processor.c
index 7caa2ba7..512a6c58 100644
--- a/modules/devices/arm/processor.c
+++ b/modules/devices/arm/processor.c
@@ -19,6 +19,18 @@
#include "hardinfo.h"
#include "devices.h"
+enum {
+ ARM_A32 = 0,
+ ARM_A64 = 1,
+ ARM_A32_ON_A64 = 2,
+};
+
+static const gchar *arm_mode_str[] = {
+ "A32",
+ "A64",
+ "A32 on A64",
+};
+
/* sources:
* https://unix.stackexchange.com/a/43563
* git:linux/arch/arm/kernel/setup.c
@@ -98,6 +110,30 @@ static gint get_cpu_int(const gchar* file, gint cpuid) {
return ret;
}
+static gboolean _g_strv_contains(const gchar * const * strv, const gchar *str) {
+ /* g_strv_contains() requires glib>2.44 */
+ //return g_strv_contains(strv, str);
+ gint i = 0;
+ while(strv[i] != NULL) {
+ if (g_strcmp0(strv[i], str) == 0)
+ return 1;
+ i++;
+ }
+ return 0;
+}
+
+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)
{
@@ -144,6 +180,22 @@ processor_scan(void)
get_str("model name", processor->model_name);
get_str("Features", processor->flags);
get_float("BogoMIPS", processor->bogomips);
+
+ get_str("CPU implementer", processor->cpu_implementer);
+ get_str("CPU architecture", processor->cpu_architecture);
+ get_str("CPU variant", processor->cpu_variant);
+ get_str("CPU part", processor->cpu_part);
+ get_str("CPU revision", processor->cpu_revision);
+
+ processor->mode = ARM_A32;
+ if ( processor_has_flag(processor->flags, "pmull")
+ || processor_has_flag(processor->flags, "crc32") ) {
+#ifdef __aarch64__
+ processor->mode = ARM_A64;
+#else
+ processor->mode = ARM_A32_ON_A64;
+#endif
+ }
}
g_strfreev(tmp);
}
@@ -193,6 +245,7 @@ processor_get_detailed_info(Processor *processor)
ret = g_strdup_printf("[Processor]\n"
"Name=%s\n"
+ "Mode=%s\n"
"BogoMips=%.2f\n"
"Endianesss="
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
@@ -205,14 +258,26 @@ processor_get_detailed_info(Processor *processor)
"Min=%d kHz\n"
"Max=%d kHz\n"
"Cur=%d kHz\n"
+ "[ARM]\n"
+ "Implementer=%s\n"
+ "Architecture=%s\n"
+ "Variant=%s\n"
+ "Part=%s\n"
+ "Revision=%s\n"
"[Capabilities]\n"
"%s"
"%s",
processor->model_name,
+ arm_mode_str[processor->mode],
processor->bogomips,
processor->cpukhz_min,
processor->cpukhz_max,
processor->cpukhz_cur,
+ processor->cpu_implementer,
+ processor->cpu_architecture,
+ processor->cpu_variant,
+ processor->cpu_part,
+ processor->cpu_revision,
tmp_flags,
"");
g_free(tmp_flags);