102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_kstat10_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_kstat10.c (c) Copyright 2005-2007, Hewlett-Packard Company Version 2.4.3";
302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_CONFIG_H
502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <config.h>
602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <stdio.h>
902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_INTTYPES_H
1102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <inttypes.h>
1202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
1302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDINT_H
1402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdint.h>
1502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
1602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
1702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
1802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_UNISTD_H
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <unistd.h>
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_STRINGS_H
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <strings.h>
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if STDC_HEADERS
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stdlib.h>
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <stddef.h>
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_STDLIB_H
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <stdlib.h>
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.h>
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <kstat.h>
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <sys/sysinfo.h>
3702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netsh.h"
3902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include "netlib.h"
4002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic kstat_ctl_t *kc = NULL;
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic kid_t kcid = 0;
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projecttypedef struct cpu_time_counters {
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t idle;
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t user;
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t kernel;
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t interrupt;
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project} cpu_time_counters_t;
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t starting_cpu_counters[MAXCPUS];
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t ending_cpu_counters[MAXCPUS];
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t delta_cpu_counters[MAXCPUS];
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic cpu_time_counters_t corrected_cpu_counters[MAXCPUS];
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_cpu_time_counters(char *name, int instance, cpu_time_counters_t *counters)
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,"%s[%d]:\n",name,instance);
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "\t idle %llu\n",counters[instance].idle);
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "\t user %llu\n",counters[instance].user);
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "\t kernel %llu\n",counters[instance].kernel);
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  fprintf(where,
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  "\t interrupt %llu\n",counters[instance].interrupt);
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kc = kstat_open();
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (kc == NULL) {
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "cpu_util_init: kstat_open: errno %d %s\n",
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    strerror(errno));
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void)
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kstat_close(kc);
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void)
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return KSTAT_10;
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectprint_unexpected_statistic_warning(char *who, char *what, char *why)
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (why) {
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "WARNING! WARNING! WARNING! WARNING!\n");
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "%s found an unexpected %s statistic %.16s\n",
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    who,
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    why,
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    what);
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "%s is ignoring statistic %.16s\n",
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    who,
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    what);
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_counters(int cpu_num, cpu_time_counters_t *counters)
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kstat_t *ksp;
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int found=0;
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kid_t nkcid;
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kstat_named_t *knp;
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ksp = kstat_lookup(kc, "cpu", cpu_num, "sys");
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) {
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* happiness and joy, keep going */
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nkcid = kstat_read(kc, ksp, NULL);
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (nkcid != -1) {
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* happiness and joy, keep going. we could consider adding a
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 "found < 3" to the end conditions, but then we wouldn't
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 search to the end and find that Sun added some nsec. we
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 probably want to see if they add an nsec. raj 2005-01-28 */
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = ksp->ks_ndata, knp = ksp->ks_data;
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   i > 0;
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   knp++,i--) {
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* we would be hosed if the same name could appear twice */
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (!strcmp("cpu_nsec_idle",knp->name)) {
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  found++;
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  counters[cpu_num].idle = knp->value.ui64;
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if (!strcmp("cpu_nsec_user",knp->name)) {
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  found++;
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  counters[cpu_num].user = knp->value.ui64;
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if (!strcmp("cpu_nsec_kernel",knp->name)) {
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  found++;
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  counters[cpu_num].kernel = knp->value.ui64;
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if (strstr(knp->name,"nsec")) {
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* finding another nsec here means Sun have changed
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     something and we need to warn the user. raj 2005-01-28 */
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  print_unexpected_statistic_warning("get_cpu_counters",
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     knp->name,
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     "nsec");
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if (debug >=2) {
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* might want to tell people about what we are skipping.
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     however, only display other names debug >=2. raj
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     2005-01-28
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  */
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  print_unexpected_statistic_warning("get_cpu_counters",
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     knp->name,
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     NULL);
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (3 == found) {
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* happiness and joy */
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	return;
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"get_cpu_counters could not find one or more of the expected counters!\n");
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(-1);
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the kstat_read returned an error or the chain changed */
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "get_cpu_counters: kstat_read failed or chain id changed %d %s\n",
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      strerror(errno));
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the lookup failed or found the wrong type */
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d name 'sys' and KSTAT_TYPE_NAMED: errno %d %s\n",
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    cpu_num,
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    strerror(errno));
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_interrupt_counters(int cpu_num, cpu_time_counters_t *counters)
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kstat_t *ksp;
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int found=0;
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kid_t nkcid;
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  kstat_named_t *knp;
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ksp = kstat_lookup(kc, "cpu", cpu_num, "intrstat");
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  counters[cpu_num].interrupt = 0;
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((ksp) && (ksp->ks_type == KSTAT_TYPE_NAMED)) {
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* happiness and joy, keep going */
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    nkcid = kstat_read(kc, ksp, NULL);
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (nkcid != -1) {
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* happiness and joy, keep going. we could consider adding a
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 "found < 15" to the end conditions, but then we wouldn't
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 search to the end and find that Sun added some "time." we
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 probably want to see if they add a "nsec." raj 2005-01-28 */
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      for (i = ksp->ks_ndata, knp = ksp->ks_data;
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   i > 0;
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	   knp++,i--) {
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	if (strstr(knp->name,"time")) {
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  found++;
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  counters[cpu_num].interrupt += knp->value.ui64;
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	else if (debug >=2) {
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  /* might want to tell people about what we are skipping.
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     however, only display other names debug >=2. raj
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	     2005-01-28
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  */
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	  print_unexpected_statistic_warning("get_cpu_counters",
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     knp->name,
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     NULL);
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	}
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (15 == found) {
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	/* happiness and joy */
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	return;
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      else {
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fprintf(where,
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		"get_cpu_counters could not find one or more of the expected counters!\n");
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	fflush(where);
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	exit(-1);
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* the kstat_read returned an error or the chain changed */
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "get_cpu_counters: kstat_read failed or chain id changed %d %s\n",
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      errno,
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      strerror(errno));
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* the lookup failed or found the wrong type */
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "get_cpu_counters: kstat_lookup failed for module 'cpu' instance %d class 'intrstat' and KSTAT_TYPE_NAMED: errno %d %s\n",
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    cpu_num,
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    strerror(errno));
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic void
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_time_counters(cpu_time_counters_t *counters)
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++){
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    get_cpu_counters(i, counters);
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    get_interrupt_counters(i, counters);
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project/* the kstat10 mechanism, since it is based on actual nanosecond
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   counters is not going to use a comparison to an idle rate. so, the
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   calibrate_idle_rate routine will be rather simple :) raj 2005-01-28
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   */
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval)
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return 0.0;
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float correction_factor;
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float actual_rate;
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t total_cpu_nsec;
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* multiply by 100 and divide by total and you get whole
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     percentages. multiply by 1000 and divide by total and you get
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     tenths of percentages.  multiply by 10000 and divide by total and
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project     you get hundredths of percentages. etc etc etc raj 2005-01-28 */
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_PERCENT 100
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_TENTH_PERCENT 1000
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_HUNDREDTH_PERCENT 10000
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_THOUSANDTH_PERCENT 100000
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#define CALC_ACCURACY CALC_THOUSANDTH_PERCENT
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t fraction_idle;
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t fraction_user;
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t fraction_kernel;
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t fraction_interrupt;
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t interrupt_idle;
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t interrupt_user;
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  uint64_t interrupt_kernel;
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)0.0;
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0 +
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++) {
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* this is now the fun part.  we have the nanoseconds _allegedly_
35202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       spent in user, idle and kernel.  We also have nanoseconds spent
35302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       servicing interrupts.  Sadly, in the developer's finite wisdom,
35402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the interrupt time accounting is in parallel with the other
35502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       accounting. this means that time accounted in user, kernel or
35602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       idle will also include time spent in interrupt.  for netperf's
35702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       porpoises we do not really care about that for user and kernel,
35802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       but we certainly do care for idle.  the $64B question becomes -
35902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       how to "correct" for this?
36002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
36102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       we could just subtract interrupt time from idle.  that has the
36202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       virtue of simplicity and also "punishes" Sun for doing
36302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       something that seems to be so stupid.  however, we probably
36402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       have to be "fair" even to the allegedly stupid so the other
36502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       mechanism, suggested by a Sun engineer is to subtract interrupt
36602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       time from each of user, kernel and idle in proportion to their
36702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       numbers.  then we sum the corrected user, kernel and idle along
36802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       with the interrupt time and use that to calculate a new idle
36902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       percentage and thus a CPU util percentage.
37002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       that is what we will attempt to do here.  raj 2005-01-28
37202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
37302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       of course, we also have to wonder what we should do if there is
37402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       more interrupt time than the sum of user, kernel and idle.
37502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       that is a theoretical possibility I suppose, but for the
37602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       time-being, one that we will blythly ignore, except perhaps for
37702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       a quick check. raj 2005-01-31
37802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    */
37902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
38002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we ass-u-me that these counters will never wrap during a
38102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       netperf run.  this may not be a particularly safe thing to
38202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       do. raj 2005-01-28 */
38302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    delta_cpu_counters[i].idle = ending_cpu_counters[i].idle -
38402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      starting_cpu_counters[i].idle;
38502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    delta_cpu_counters[i].user = ending_cpu_counters[i].user -
38602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      starting_cpu_counters[i].user;
38702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    delta_cpu_counters[i].kernel = ending_cpu_counters[i].kernel -
38802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      starting_cpu_counters[i].kernel;
38902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    delta_cpu_counters[i].interrupt = ending_cpu_counters[i].interrupt -
39002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      starting_cpu_counters[i].interrupt;
39102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
39302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_cpu_time_counters("delta_cpu_counters",i,delta_cpu_counters);
39402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
39502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
39602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* for this summation, we do not include interrupt time */
39702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    total_cpu_nsec =
39802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      delta_cpu_counters[i].idle +
39902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      delta_cpu_counters[i].user +
40002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      delta_cpu_counters[i].kernel;
40102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
40302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"total_cpu_nsec %llu\n",total_cpu_nsec);
40402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
40502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
40602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (delta_cpu_counters[i].interrupt > total_cpu_nsec) {
40702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we are not in Kansas any more Toto, and I am not quite sure
40802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 the best way to get our tails out of here so let us just
40902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	 punt. raj 2005-01-31 */
41002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
41102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "WARNING! WARNING! WARNING! WARNING! WARNING! \n");
41202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
41302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "calc_cpu_util_internal: more interrupt time than others combined!\n");
41402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
41502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\tso CPU util cannot be estimated\n");
41602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
41702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\t delta[%d].interrupt %llu\n",i,delta_cpu_counters[i].interrupt);
41802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
41902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\t delta[%d].idle %llu\n",i,delta_cpu_counters[i].idle);
42002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
42102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\t delta[%d].user %llu\n",i,delta_cpu_counters[i].user);
42202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
42302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\t delta[%d].kernel %llu\n",i,delta_cpu_counters[i].kernel);
42402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
42502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
42602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_cpu_util = -1.0;
42702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_per_cpu_util[i] = -1.0;
42802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      return -1.0;
42902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
43002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and now some fun with integer math.  i initially tried to
43202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       promote things to long doubled but that didn't seem to result
43302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       in happiness and joy. raj 2005-01-28 */
43402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_idle =
43602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (delta_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec;
43702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
43802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_user =
43902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (delta_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec;
44002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_kernel =
44202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (delta_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec;
44302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok, we have our fractions, now we want to take that fraction of
44502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       the interrupt time and subtract that from the bucket. */
44602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
44702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interrupt_idle =  ((delta_cpu_counters[i].interrupt * fraction_idle) /
44802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		       CALC_ACCURACY);
44902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interrupt_user = ((delta_cpu_counters[i].interrupt * fraction_user) /
45102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		      CALC_ACCURACY);
45202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    interrupt_kernel = ((delta_cpu_counters[i].interrupt * fraction_kernel) /
45402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			CALC_ACCURACY);
45502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
45602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
45702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
45802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\tfraction_idle %llu interrupt_idle %llu\n",
45902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fraction_idle,
46002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interrupt_idle);
46102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
46202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "\tfraction_user %llu interrupt_user %llu\n",
46302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fraction_user,
46402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interrupt_user);
46502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tfraction_kernel %llu interrupt_kernel %llu\n",
46602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      fraction_kernel,
46702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      interrupt_kernel);
46802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
46902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    corrected_cpu_counters[i].idle = delta_cpu_counters[i].idle -
47102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      interrupt_idle;
47202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    corrected_cpu_counters[i].user = delta_cpu_counters[i].user -
47402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      interrupt_user;
47502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    corrected_cpu_counters[i].kernel = delta_cpu_counters[i].kernel -
47702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      interrupt_kernel;
47802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
47902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    corrected_cpu_counters[i].interrupt = delta_cpu_counters[i].interrupt;
48002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
48202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      print_cpu_time_counters("corrected_cpu_counters",
48302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      i,
48402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project			      corrected_cpu_counters);
48502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
48602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
48702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* I was going to checkfor going less than zero, but since all the
48802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       calculations are in unsigned quantities that would seem to be a
48902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       triffle silly... raj 2005-01-28 */
49002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* ok, now we sum the numbers again, this time including interrupt
49202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       */
49302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
49402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    total_cpu_nsec =
49502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      corrected_cpu_counters[i].idle +
49602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      corrected_cpu_counters[i].user +
49702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      corrected_cpu_counters[i].kernel +
49802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      corrected_cpu_counters[i].interrupt;
49902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and recalculate our fractions we are really only going to use
50102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       fraction_idle, but lets calculate the rest just for the heck of
50202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       it. one day we may want to display them. raj 2005-01-28 */
50302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
50402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* multiply by 100 and divide by total and you get whole
50502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       percentages. multiply by 1000 and divide by total and you get
50602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       tenths of percentages.  multiply by 10000 and divide by total
50702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       and you get hundredths of percentages. etc etc etc raj
50802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project       2005-01-28 */
50902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_idle =
51002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (corrected_cpu_counters[i].idle * CALC_ACCURACY) / total_cpu_nsec;
51102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_user =
51302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (corrected_cpu_counters[i].user * CALC_ACCURACY) / total_cpu_nsec;
51402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_kernel =
51602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (corrected_cpu_counters[i].kernel * CALC_ACCURACY) / total_cpu_nsec;
51702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
51802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fraction_interrupt =
51902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (corrected_cpu_counters[i].interrupt * CALC_ACCURACY) / total_cpu_nsec;
52002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
52202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tfraction_idle %lu\n",fraction_idle);
52302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tfraction_user %lu\n",fraction_user);
52402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tfraction_kernel %lu\n",fraction_kernel);
52502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tfraction_interrupt %lu\n",fraction_interrupt);
52602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
52702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
52802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* and finally, what is our CPU utilization? */
52902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = 100.0 - (((float)fraction_idle /
53002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					  (float)CALC_ACCURACY) * 100.0);
53102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
53202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
53302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      "lib_local_per_cpu_util[%d] %g\n",
53402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      i,
53502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	      lib_local_per_cpu_util[i]);
53602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
53702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_cpu_util += lib_local_per_cpu_util[i];
53802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
53902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want the average across all n processors */
54002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util /= (float)lib_num_loc_cpus;
54102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= correction_factor;
54302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
54402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
54702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
54802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
54902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
55002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
55102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_time_counters(starting_cpu_counters);
55202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
55302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
55402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
55502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
55602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
55702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
55802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_time_counters(ending_cpu_counters);
55902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
560