From 2fe2ab4349655c6ce35b12e06beaef835f0f7a01 Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Thu, 21 Sep 2006 03:09:47 +0000 Subject: [PATCH] Use kstat.cpu_info.brand to determine sigar_cpu_info_t.vendor on Solaris 10+ --- ChangeLog | 2 + src/os/solaris/solaris_sigar.c | 67 ++++++++++++++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 07f7096c..4fe99932 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2006-09-21 Doug MacEachern + * Use kstat.cpu_info.brand to determine sigar_cpu_info_t.vendor on Solaris 10+ + * Fix Linux cpu_info /proc/cpuinfo parsing on ia64 2006-09-08 Doug MacEachern diff --git a/src/os/solaris/solaris_sigar.c b/src/os/solaris/solaris_sigar.c index 367558e9..bf1f610b 100644 --- a/src/os/solaris/solaris_sigar.c +++ b/src/os/solaris/solaris_sigar.c @@ -245,6 +245,52 @@ int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap) return SIGAR_OK; } +static int get_chip_brand(sigar_t *sigar, int processor, + sigar_cpu_info_t *info) +{ + kstat_t *ksp = sigar->ks.cpu_info[processor]; + kstat_named_t *brand; + + if (sigar->solaris_version < 10) { + /* don't bother; doesn't exist. */ + return 0; + } + + if (ksp && + (kstat_read(sigar->kc, ksp, NULL) != -1) && + (brand = (kstat_named_t *)kstat_data_lookup(ksp, "brand"))) + { + /* same offset as KSTAT_NAMED_STR_PTR(brand) */ + char *name = (char *)brand->value.i32; + char *vendor = "Sun"; + char *vendors[] = { + "Intel", "AMD", NULL + }; + int i; + + if (!name) { + return 0; + } + + for (i=0; vendors[i]; i++) { + if (strstr(name, vendors[i])) { + vendor = vendors[i]; + break; + } + } + + SIGAR_SSTRCPY(info->vendor, vendor); +#if 0 + SIGAR_SSTRCPY(info->model, name); + sigar_cpu_model_adjust(sigar, info); +#endif + return 1; + } + else { + return 0; + } +} + static int get_chip_id(sigar_t *sigar, int processor) { kstat_t *ksp = sigar->ks.cpu_info[processor]; @@ -1551,6 +1597,7 @@ int sigar_cpu_info_list_get(sigar_t *sigar, processor_info_t stats; unsigned int i; int status = SIGAR_OK; + int brand = -1; if (sigar_kstat_update(sigar) == -1) { /* for sigar->ncpu */ return errno; @@ -1592,18 +1639,30 @@ int sigar_cpu_info_list_get(sigar_t *sigar, SIGAR_SSTRCPY(info->model, stats.pi_processor_type); + if (brand == -1) { + brand = get_chip_brand(sigar, i, info); + } + if (strEQ(info->model, "i386")) { - /* XXX assuming Intel on x86 */ - SIGAR_SSTRCPY(info->vendor, "Intel"); + if (!brand) { + /* assume Intel on x86 */ + SIGAR_SSTRCPY(info->vendor, "Intel"); + } SIGAR_SSTRCPY(info->model, "x86"); } else { - /* sparc */ - SIGAR_SSTRCPY(info->vendor, "Sun"); + if (!brand) { + /* assume Sun */ + SIGAR_SSTRCPY(info->vendor, "Sun"); + } /* s/sparc/Sparc/ */ info->model[0] = toupper(info->model[0]); } + if (brand) { + SIGAR_SSTRCPY(info->vendor, cpu_infos->data[0].vendor); + } + info->mhz = stats.pi_clock; info->cache_size = SIGAR_FIELD_NOTIMPL; /*XXX*/ }