From c43fcbdf6093d716fe6ced15dabdad9fc69ac088 Mon Sep 17 00:00:00 2001 From: oxmc7769 Date: Sun, 23 Mar 2025 03:21:43 -0700 Subject: [PATCH] Patch for missing cpu model from /proc/cpuinfo --- include/glibtop/sysinfo.h | 2 ++ sysdeps/linux/sysinfo.c | 50 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/glibtop/sysinfo.h b/include/glibtop/sysinfo.h index bc249513..980e653e 100644 --- a/include/glibtop/sysinfo.h +++ b/include/glibtop/sysinfo.h @@ -53,6 +53,8 @@ struct _glibtop_sysinfo glibtop_entry cpuinfo [GLIBTOP_NCPU]; }; +const char *decode_cpu_part(unsigned int part); + #define glibtop_get_sysinfo_r glibtop_get_sysinfo_s const glibtop_sysinfo *glibtop_get_sysinfo_s (glibtop *server); diff --git a/sysdeps/linux/sysinfo.c b/sysdeps/linux/sysinfo.c index 7dbd5eeb..9b792220 100644 --- a/sysdeps/linux/sysinfo.c +++ b/sysdeps/linux/sysinfo.c @@ -33,6 +33,39 @@ static const unsigned long _glibtop_sysdeps_sysinfo = static glibtop_sysinfo sysinfo = { .flags = 0 }; +/* Lookup table for CPU part decoding */ +static const struct { + unsigned int part; + const char *model; +} cpu_part_lookup[] = { + { 0xd0b, "Cortex-A78" }, + { 0xd0c, "Cortex-X1" }, + { 0xd40, "Neoverse-N1" }, + { 0xd41, "Cortex-A78AE" }, + { 0xd42, "Cortex-A710" }, + { 0xd44, "Cortex-X2" }, + { 0xd4a, "Neoverse-V1" }, + { 0xd4b, "Neoverse-N2" }, + { 0xd4c, "Cortex-A715" }, + { 0xd4d, "Cortex-X3" }, + { 0xd49, "Cortex-A520" }, + { 0xd4e, "Cortex-A720" }, + { 0xd4f, "Cortex-X4" }, + { 0xd08, "Cortex-A55" }, + { 0x0000, "Unknown" } // Default fallback +}; + + +/* Function to decode CPU part */ +const char *decode_cpu_part(unsigned int part) { + for (int i = 0; cpu_part_lookup[i].part != 0x0000; i++) { + if (cpu_part_lookup[i].part == part) { + return cpu_part_lookup[i].model; + } + } + return "Unknown"; +} + static void init_sysinfo (glibtop *server) { @@ -77,6 +110,9 @@ init_sysinfo (glibtop *server) /* " : " */ parts = g_strsplit_set(*this_proc, ":\n", 0); + unsigned int cpu_part = 0; + gboolean has_model = FALSE; + for(p = parts; *p && *(p+1); p += 2) { /* stole the allocated memory */ @@ -85,15 +121,27 @@ init_sysinfo (glibtop *server) g_ptr_array_add(cpuinfo->labels, key); g_hash_table_insert(cpuinfo->values, key, value); + + /* Extract CPU part */ + if (g_strcmp0(key, "CPU part") == 0) { + cpu_part = strtoul(value, NULL, 16); + } + if (g_strcmp0(key, "model name") == 0) { + has_model = TRUE; + } } + /* If model name is missing, add it */ + if (!has_model && cpu_part != 0) { + const char *decoded_model = decode_cpu_part(cpu_part); + g_hash_table_insert(cpuinfo->values, g_strdup("model name"), g_strdup(decoded_model)); + } /* the last key has no value and has not been added */ if(*p) g_free(*p); /* just g_free instead of g_strvfree because we stole the memory*/ - g_free(parts); sysinfo.ncpu++;