diff options
| author | Burt P <pburt0@gmail.com> | 2017-07-11 17:34:20 -0500 | 
|---|---|---|
| committer | Leandro Pereira <leandro@hardinfo.org> | 2017-07-12 19:38:41 -0700 | 
| commit | f1e867b56bf6148c08734d16f1f16ff577a7577d (patch) | |
| tree | 1b91984cb033f6f018009903105596b13c3a709a | |
| parent | b1872a13aa1f21fe35f97cf0dd41876363307177 (diff) | |
s390: multiple cpu, topolog, cpufreq
Signed-off-by: Burt P <pburt0@gmail.com>
| -rw-r--r-- | includes/s390/processor-platform.h | 14 | ||||
| -rw-r--r-- | modules/devices/s390/processor.c | 133 | ||||
| -rw-r--r-- | test/data/s390_hurcules_cpuinfo | 2 | 
3 files changed, 127 insertions, 22 deletions
diff --git a/includes/s390/processor-platform.h b/includes/s390/processor-platform.h index 511fae6b..9164a7f2 100644 --- a/includes/s390/processor-platform.h +++ b/includes/s390/processor-platform.h @@ -19,10 +19,18 @@  #ifndef __PROCESSOR_PLATFORM_H__  #define __PROCESSOR_PLATFORM_H__ +#include "cpu_util.h" +  struct _Processor { -    gchar *vendor_id, *model_name; -    gint cache_size; -    gfloat bogomips, cpu_mhz; +    gint id; +    gfloat cpu_mhz; /* for devices.c, identical to cpukhz_max/1000 */ +    cpu_topology_data *cputopo; +    cpufreq_data *cpufreq; + +    gchar *model_name; /* vendor_id */ +    gchar *proc_str; +    gfloat bogomips; +  };  #endif	/* __PROCESSOR_PLATFORM_H__ */ diff --git a/modules/devices/s390/processor.c b/modules/devices/s390/processor.c index 8a80b7af..9a9b789b 100644 --- a/modules/devices/s390/processor.c +++ b/modules/devices/s390/processor.c @@ -18,58 +18,155 @@  #include "hardinfo.h"  #include "devices.h" +#include "string.h"  #include "cpu_util.h"  GSList *  processor_scan(void)  { -    Processor *processor; +    GSList *procs = NULL; +    Processor *processor = NULL;      FILE *cpuinfo;      gchar buffer[128]; +    gchar *vendor_id = NULL; +    gint   num_procs = 0; +    gfloat bogomips = 0.0f; +    GSList *pi = NULL;      cpuinfo = fopen(PROC_CPUINFO, "r");      if (!cpuinfo) -        return NULL; +    return NULL; -    processor = g_new0(Processor, 1); +#define CHECK_FOR(k) (g_str_has_prefix(tmp[0], k))      while (fgets(buffer, 128, cpuinfo)) {          gchar **tmp = g_strsplit(buffer, ":", 2); -          if (tmp[0] && tmp[1]) {              tmp[0] = g_strstrip(tmp[0]);              tmp[1] = g_strstrip(tmp[1]); +        } else { +            g_strfreev(tmp); +            continue; +        } + +        get_str("vendor_id", vendor_id); +        get_int("# processors", num_procs); +        get_int("bogomips per cpu", bogomips); -            get_str("vendor_id", processor->vendor_id); -            get_float("# processors", processor->cache_size); -            get_int("bogomips per cpu", processor->bogomips); +        if ( CHECK_FOR("processor") ) { +            /* finish previous */ +            if (processor) { +                procs = g_slist_append(procs, processor); +            } +            /* start next */ +            processor = g_new0(Processor, 1); +            if (strlen(tmp[0]) >= 10) +                processor->id = atol(tmp[0] + 10); /* processor n: ... */ +            else +                processor->id = 0; /* idk */ +            processor->proc_str = g_strdup(tmp[1]); + +            if (vendor_id) +                processor->model_name = g_strdup(vendor_id); +            if (bogomips) +                processor->bogomips = bogomips; + +            g_strfreev(tmp); +            continue;          } +          g_strfreev(tmp);      } + +    if (processor) +        procs = g_slist_append(procs, processor); + +    g_free(vendor_id);      fclose(cpuinfo); -    processor->cpu_mhz = 0.0f; +    /* data not from /proc/cpuinfo */ +    for (pi = procs; pi; pi = pi->next) { +        processor = (Processor *) pi->data; + +        /* strings can't be null or segfault later */ +        STRIFNULL(model_name, _("S390 Processor") ); +        UNKIFNULL(proc_str); + +        /* topo & freq */ +        processor->cpufreq = cpufreq_new(processor->id); +        processor->cputopo = cputopo_new(processor->id); -    processor->model_name = g_strconcat("S390 ", processor->vendor_id, NULL); -    g_free(processor->vendor_id); +        if (processor->cpufreq->cpukhz_max) +            processor->cpu_mhz = processor->cpufreq->cpukhz_max / 1000; +        else +            processor->cpu_mhz = 0.0f; -    return g_slist_append(NULL, processor); +    } + +    return procs;  }  gchar * -processor_get_info(GSList *processors) +processor_get_detailed_info(Processor *processor)  { -    Processor *processor = (Processor *)processors->data; +    gchar *tmp_cpufreq, *tmp_topology, *ret; +    tmp_topology = cputopo_section_str(processor->cputopo); +    tmp_cpufreq = cpufreq_section_str(processor->cpufreq); -    return g_strdup_printf("[%s]\n" +    ret = g_strdup_printf("[%s]\n"                          "%s=%s\n"      /* model */ -                        "%s=%d\n"      /* proc count */ +                        "%s=%s\n"      /* proc string */                          "%s=%.2f\n"    /* bogomips */ -                        "%s=%s\n",     /* byte order */ +                        "%s=%s\n"      /* byte order */ +                        "%s"  /* topology */ +                        "%s", /* frequency scaling */                          _("Processor"),                          _("Model"), processor->model_name, -                        _("Processors"), processor->cache_size, +                        _("ID String"), processor->proc_str,                          _("BogoMips"), processor->bogomips, -                        _("Byte Order"), byte_order_str() +                        _("Byte Order"), byte_order_str(), +                        tmp_topology, +                        tmp_cpufreq                          ); +    g_free(tmp_cpufreq); +    g_free(tmp_topology); +    return ret; +} + +gchar *processor_get_info(GSList * processors) +{ +    Processor *processor; + +    if (g_slist_length(processors) > 1) { +    gchar *ret, *tmp, *hashkey; +    GSList *l; + +    tmp = g_strdup(""); + +    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); +    } + +    ret = g_strdup_printf("[$ShellParam$]\n" +                  "ViewType=1\n" +                  "[Processors]\n" +                  "%s", tmp); +    g_free(tmp); + +    return ret; +    } + +    processor = (Processor *) processors->data; +    return processor_get_detailed_info(processor);  } + diff --git a/test/data/s390_hurcules_cpuinfo b/test/data/s390_hurcules_cpuinfo index 5ac5b5fc..722678f0 100644 --- a/test/data/s390_hurcules_cpuinfo +++ b/test/data/s390_hurcules_cpuinfo @@ -1,5 +1,5 @@  vendor_id       : IBM/S390  # processors    : 2  bogomips per cpu: 411.23 -processor 0: version = FF,  identification = 111000,  machine = 7060 +processor 0: version = FF, identification = 111000,  machine = 7060  processor 1: version = FF, identification = 111111, machine = 7060  | 
