102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectchar   netcpu_perfstat_id[]="\
202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project@(#)netcpu_perfstat.c Version 2.4.0";
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 TIME_WITH_SYS_TIME
1902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <sys/time.h>
2002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <time.h>
2102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#else
2202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# if HAVE_SYS_TIME_H
2302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <sys/time.h>
2402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# else
2502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  include <time.h>
2602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif
2702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
2802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
2902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#if HAVE_LIMITS_H
3002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# include <limits.h>
3102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# ifndef LONG_LONG_MAX
3202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#  define LONG_LONG_MAX LLONG_MAX
3302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project# endif /* LONG_LONG_MAX */
3402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#endif
3502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
3602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project#include <errno.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 Project/* the lib_start_count and lib_end_count arrays hold the starting
4202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   and ending values of whatever is counting when the system is
4302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   idle. The rate at which this increments during a test is compared
4402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   with a previous calibration to arrive at a CPU utilization
4502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project   percentage. raj 2005-01-26 */
4602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_start_count[MAXCPUS];
4702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectstatic uint64_t  lib_end_count[MAXCPUS];
4802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
4902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
5102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_init(void)
5202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
5302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
5402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
5502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
5602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
5702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_util_terminate(void)
5802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
5902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
6002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
6102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectint
6302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_method(void)
6402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
6502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return PERFSTAT;
6602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
6702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
6802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
6902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectget_cpu_idle(uint64_t *res)
7002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
7102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_cpu_t *perfstat_buffer;
7202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_cpu_t *per_cpu_pointer;
7302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_id_t  name;
7402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i,ret;
7502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
7602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* a name of "" will cause us to start from the beginning */
7702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  strcpy(name.name,"");
7802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_buffer = (perfstat_cpu_t *)malloc(lib_num_loc_cpus *
7902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project					     sizeof(perfstat_cpu_t));
8002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (perfstat_buffer == NULL) {
8102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
8202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "cpu_start: malloc failed errno %d\n",
8302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno);
8402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
8502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
8602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
8702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
8802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* happiness and joy, keep going */
8902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  ret = perfstat_cpu(&name,
9002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     perfstat_buffer,
9102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     sizeof(perfstat_cpu_t),
9202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project		     lib_num_loc_cpus);
9302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
9402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if ((ret == -1) ||
9502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      (ret != lib_num_loc_cpus)) {
9602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
9702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    "cpu_start: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
9802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    errno,
9902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    lib_num_loc_cpus,
10002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project	    ret);
10102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
10202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
10302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
10402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
10502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  per_cpu_pointer = perfstat_buffer;
10602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++){
10702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    res[i] = per_cpu_pointer->idle;
10802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    per_cpu_pointer++;
10902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
11002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  free(perfstat_buffer);
11102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
11302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
11402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
11502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
11602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalibrate_idle_rate(int iterations, int interval)
11702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
11802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  unsigned long long
11902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    firstcnt[MAXCPUS],
12002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    secondcnt[MAXCPUS];
12102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float
12302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed,
12402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    temp_rate,
12502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rate[MAXTIMES],
12602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    local_maxrate;
12702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
12802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  long
12902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sec,
13002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec;
13102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int
13302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    i,
13402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    j;
13502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  timeval time1, time2 ;
13702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  struct  timezone tz;
13802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
13902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_cpu_t  *perfstat_buffer;
14002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_cpu_t  *per_cpu_pointer;
14102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_id_t   name;
14202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int ret;
14302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
14502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"enter calibrate_perfstat\n");
14602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
14702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
14802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
14902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (iterations > MAXTIMES) {
15002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    iterations = MAXTIMES;
15102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
15202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  local_maxrate = (float)-1.0;
15402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
15502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  perfstat_buffer = (perfstat_cpu_t *)malloc(lib_num_loc_cpus *
15602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                                             sizeof(perfstat_cpu_t));
15702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (perfstat_buffer == NULL) {
15802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
15902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "calibrate_perfstat: malloc failed errno %d\n",
16002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            errno);
16102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
16202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    exit(-1);
16302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
16402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
16502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for(i = 0; i < iterations; i++) {
16602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    rate[i] = (float)0.0;
16702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a name of "" will cause us to start from the beginning */
16802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    strcpy(name.name,"");
16902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* happiness and joy, keep going */
17102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ret = perfstat_cpu(&name,
17202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       perfstat_buffer,
17302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       sizeof(perfstat_cpu_t),
17402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       lib_num_loc_cpus);
17502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
17602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((ret == -1) ||
17702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (ret != lib_num_loc_cpus)) {
17802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
17902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "calibrate_perfstat: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
18002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              errno,
18102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_num_loc_cpus,
18202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              ret);
18302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
18402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
18502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
18602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
18702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    per_cpu_pointer = perfstat_buffer;
18802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < lib_num_loc_cpus; j++) {
18902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      firstcnt[j] = per_cpu_pointer->idle;
19002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      per_cpu_pointer++;
19102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
19202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday (&time1, &tz);
19302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sleep(interval);
19402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    gettimeofday (&time2, &tz);
19502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
19602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (time2.tv_usec < time1.tv_usec)
19702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      {
19802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        time2.tv_usec += 1000000;
19902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        time2.tv_sec -=1;
20002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
20102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    sec = time2.tv_sec - time1.tv_sec;
20202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    usec = time2.tv_usec - time1.tv_usec;
20302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    elapsed = (float)sec + ((float)usec/(float)1000000.0);
20402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
20502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* happiness and joy, keep going */
20602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    ret = perfstat_cpu(&name,
20702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       perfstat_buffer,
20802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       sizeof(perfstat_cpu_t),
20902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                       lib_num_loc_cpus);
21002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
21102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if ((ret == -1) ||
21202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (ret != lib_num_loc_cpus)) {
21302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
21402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "calibrate_perfstat: perfstat_cpu failed/count off; errno %d cpus %d count %d\n",
21502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              errno,
21602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_num_loc_cpus,
21702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              ret);
21802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fflush(where);
21902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      exit(-1);
22002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
22102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    per_cpu_pointer = perfstat_buffer;
22302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
22402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if(debug) {
22502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where, "Calibration for perfstat counter run: %d\n",i);
22602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\tsec = %ld usec = %ld\n",sec,usec);
22702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,"\telapsed time = %g\n",elapsed);
22802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
22902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
23002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    for (j = 0; j < lib_num_loc_cpus; j++) {
23102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      secondcnt[j] = per_cpu_pointer->idle;
23202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      per_cpu_pointer++;
23302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if(debug) {
23402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* I know that there are situations where compilers know about */
23502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        /* long long, but the library functions do not... raj 4/95 */
23602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,
23702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                "\tfirstcnt[%d] = 0x%8.8lx%8.8lx secondcnt[%d] = 0x%8.8lx%8.8lx\n",
23802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                j,
23902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                firstcnt[j],
24002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                firstcnt[j],
24102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                j,
24202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                secondcnt[j],
24302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project                secondcnt[j]);
24402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
24502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* we assume that it would wrap no more than once. we also */
24602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      /* assume that the result of subtracting will "fit" raj 4/95 */
24702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      temp_rate = (secondcnt[j] >= firstcnt[j]) ?
24802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        (float)(secondcnt[j] - firstcnt[j])/elapsed :
24902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project          (float)(secondcnt[j]-firstcnt[j]+MAXLONG)/elapsed;
25002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (temp_rate > rate[i]) rate[i] = temp_rate;
25102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if(debug) {
25202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fprintf(where,"\trate[%d] = %g\n",i,rate[i]);
25302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project        fflush(where);
25402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      }
25502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      if (local_maxrate < rate[i]) local_maxrate = rate[i];
25602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
25702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
25802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if(debug) {
25902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,"\tlocal maxrate = %g per sec. \n",local_maxrate);
26002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fflush(where);
26102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
26202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  free(perfstat_buffer);
26302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return local_maxrate;
26402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
26502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
26602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectfloat
26702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcalc_cpu_util_internal(float elapsed_time)
26802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
26902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  int i;
27002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float actual_rate;
27202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  float correction_factor;
27302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
27402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util = (float)0.0;
27502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* It is possible that the library measured a time other than */
27602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* the one that the user want for the cpu utilization */
27702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* calculations - for example, tests that were ended by */
27802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* watchdog timers such as the udp stream test. We let these */
27902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* tests tell up what the elapsed time should be. */
28002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (elapsed_time != 0.0) {
28202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0 +
28302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      ((lib_elapsed - elapsed_time) / elapsed_time);
28402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  else {
28602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    correction_factor = (float) 1.0;
28702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
28802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
28902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* this looks just like the looper case. at least I think it */
29002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* should :) raj 4/95 */
29102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  for (i = 0; i < lib_num_loc_cpus; i++) {
29202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* we assume that the two are not more than a long apart. I */
29402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* know that this is bad, but trying to go from long longs to */
29502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* a float (perhaps a double) is boggling my mind right now. */
29602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    /* raj 4/95 */
29702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
29802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    long long
29902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff;
30002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
30102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (lib_end_count[i] >= lib_start_count[i]) {
30202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff = lib_end_count[i] - lib_start_count[i];
30302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
30402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    else {
30502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      diff = lib_end_count[i] - lib_start_count[i] + LONG_LONG_MAX;
30602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
30702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    actual_rate = (float) diff / lib_elapsed;
30802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_per_cpu_util[i] = (lib_local_maxrate - actual_rate) /
30902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      lib_local_maxrate * 100;
31002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    lib_local_cpu_util += lib_local_per_cpu_util[i];
31102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    if (debug) {
31202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project      fprintf(where,
31302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              "calc_cpu_util: actual_rate on cpu %d is %g max_rate %g cpu %6.2f\n",
31402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              i,
31502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              actual_rate,
31602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_local_maxrate,
31702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project              lib_local_per_cpu_util[i]);
31802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    }
31902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
32002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  /* we want the average across all n processors */
32202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util /= (float)lib_num_loc_cpus;
32302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
32502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
32602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "calc_cpu_util: average across CPUs is %g\n",lib_local_cpu_util);
32702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
32802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
32902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  lib_local_cpu_util *= correction_factor;
33002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  if (debug) {
33202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project    fprintf(where,
33302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project            "calc_cpu_util: returning %g\n",lib_local_cpu_util);
33402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  }
33502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return lib_local_cpu_util;
33702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
33802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
33902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
34002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_start_internal(void)
34102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
34202fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_start_count);
34302fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  return;
34402fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
34502fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
34602fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectvoid
34702fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Projectcpu_stop_internal(void)
34802fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project{
34902fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project  get_cpu_idle(lib_end_count);
35002fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project}
35102fb0aca1189a2c1fd20806c588e9ee80d9755f8The Android Open Source Project
352