Solaris implementation of CPU information retrieval backend to fix bug 24898656

Need to submit upstream along with previous patches, once they're cleaned up.

--- libgtop-2.30.0/sysdeps/solaris/sysinfo.c
+++ libgtop-2.30.0/sysdeps/solaris/sysinfo.c
@@ -37,7 +37,96 @@
 static void
 init_sysinfo (glibtop *server)
 {
+	kstat_ctl_t	*kc;
+	guint		 ncpus;
 
+	if (G_LIKELY (sysinfo.flags))
+		return;
+
+	glibtop_init_s (&server, GLIBTOP_SYSDEPS_CPU, 0);
+	ncpus = sysconf(_SC_NPROCESSORS_CONF);
+
+	if (server->machine->kc == NULL)
+		server->machine->kc = kstat_open ();
+	kc = server->machine->kc;
+
+	for (sysinfo.ncpu = 0;
+	     sysinfo.ncpu < GLIBTOP_NCPU && sysinfo.ncpu < ncpus;
+	     sysinfo.ncpu++) {
+		glibtop_entry * const cpuinfo = &sysinfo.cpuinfo[sysinfo.ncpu];
+		kstat_t	*ksp;
+		kstat_named_t *k;
+		int status;
+
+		ksp = kstat_lookup(kc, "cpu_info", sysinfo.ncpu, NULL);
+		if (ksp == NULL) {
+			continue;
+		}
+
+		status = kstat_read(kc, ksp, NULL);
+		if (status == -1) {
+			continue;
+		}
+
+		cpuinfo->labels = g_ptr_array_new ();
+
+		cpuinfo->values = g_hash_table_new_full(g_str_hash,
+							g_str_equal,
+							NULL, g_free);
+
+		g_ptr_array_add (cpuinfo->labels, "processor");
+		g_hash_table_insert (cpuinfo->values, "processor",
+				     g_strdup_printf("%u", (guint)sysinfo.ncpu));
+
+		/* Map names from Solaris kstats to Linux /proc/cpuinfo keys */
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "brand");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "model name");
+			g_hash_table_insert (cpuinfo->values, "model name",
+					     g_strdup(k->value.str.addr.ptr));
+		}
+
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "core_id");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "core id");
+			g_hash_table_insert (cpuinfo->values, "core id",
+					     g_strdup_printf("%ld", k->value.l));
+		}
+
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "clock_MHz");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "cpu MHz");
+			g_hash_table_insert (cpuinfo->values, "cpu MHz",
+					     g_strdup_printf("%ld", k->value.l));
+		}
+
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "family");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "cpu family");
+			g_hash_table_insert (cpuinfo->values, "cpu family",
+					     g_strdup_printf("%ld", k->value.l));
+		}
+
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "model");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "model");
+			g_hash_table_insert (cpuinfo->values, "model",
+					     g_strdup_printf("%ld", k->value.l));
+		}
+
+		k = (kstat_named_t *) kstat_data_lookup(ksp, "vendor_id");
+		if (k) {
+			g_ptr_array_add (cpuinfo->labels, "vendor_id");
+			g_hash_table_insert (cpuinfo->values, "vendor_id",
+					     g_strdup(k->value.str.addr.ptr));
+		}
+
+
+
+
+	}
+
+	sysinfo.flags = _glibtop_sysdeps_sysinfo;
 }
 
 const glibtop_sysinfo *