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;  } + | 
