1bcde4861SRafael Vanoni Polanczyk /*
288681574SRafael Vanoni * Copyright 2009, Intel Corporation
388681574SRafael Vanoni * Copyright 2009, Sun Microsystems, Inc
4bcde4861SRafael Vanoni Polanczyk *
5bcde4861SRafael Vanoni Polanczyk * This file is part of PowerTOP
6bcde4861SRafael Vanoni Polanczyk *
7bcde4861SRafael Vanoni Polanczyk * This program file is free software; you can redistribute it and/or modify it
8bcde4861SRafael Vanoni Polanczyk * under the terms of the GNU General Public License as published by the
9bcde4861SRafael Vanoni Polanczyk * Free Software Foundation; version 2 of the License.
10bcde4861SRafael Vanoni Polanczyk *
11bcde4861SRafael Vanoni Polanczyk * This program is distributed in the hope that it will be useful, but WITHOUT
12bcde4861SRafael Vanoni Polanczyk * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13bcde4861SRafael Vanoni Polanczyk * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14bcde4861SRafael Vanoni Polanczyk * for more details.
15bcde4861SRafael Vanoni Polanczyk *
16bcde4861SRafael Vanoni Polanczyk * You should have received a copy of the GNU General Public License
17bcde4861SRafael Vanoni Polanczyk * along with this program in a file named COPYING; if not, write to the
18bcde4861SRafael Vanoni Polanczyk * Free Software Foundation, Inc.,
19bcde4861SRafael Vanoni Polanczyk * 51 Franklin Street, Fifth Floor,
20bcde4861SRafael Vanoni Polanczyk * Boston, MA 02110-1301 USA
21bcde4861SRafael Vanoni Polanczyk *
22bcde4861SRafael Vanoni Polanczyk * Authors:
23bcde4861SRafael Vanoni Polanczyk * Arjan van de Ven <arjan@linux.intel.com>
24bcde4861SRafael Vanoni Polanczyk * Eric C Saxe <eric.saxe@sun.com>
25bcde4861SRafael Vanoni Polanczyk * Aubrey Li <aubrey.li@intel.com>
26bcde4861SRafael Vanoni Polanczyk */
27bcde4861SRafael Vanoni Polanczyk
28bcde4861SRafael Vanoni Polanczyk /*
29bcde4861SRafael Vanoni Polanczyk * GPL Disclaimer
30bcde4861SRafael Vanoni Polanczyk *
31bcde4861SRafael Vanoni Polanczyk * For the avoidance of doubt, except that if any license choice other
32bcde4861SRafael Vanoni Polanczyk * than GPL or LGPL is available it will apply instead, Sun elects to
33bcde4861SRafael Vanoni Polanczyk * use only the General Public License version 2 (GPLv2) at this time
34bcde4861SRafael Vanoni Polanczyk * for any software where a choice of GPL license versions is made
35bcde4861SRafael Vanoni Polanczyk * available with the language indicating that GPLv2 or any later
36bcde4861SRafael Vanoni Polanczyk * version may be used, or where a choice of which version of the GPL
37bcde4861SRafael Vanoni Polanczyk * is applied is otherwise unspecified.
38bcde4861SRafael Vanoni Polanczyk */
39bcde4861SRafael Vanoni Polanczyk
40bcde4861SRafael Vanoni Polanczyk #include <stdarg.h>
41bcde4861SRafael Vanoni Polanczyk #include <stdlib.h>
42bcde4861SRafael Vanoni Polanczyk #include <libgen.h>
43bcde4861SRafael Vanoni Polanczyk #include <unistd.h>
44bcde4861SRafael Vanoni Polanczyk #include <strings.h>
45bcde4861SRafael Vanoni Polanczyk #include <sys/systeminfo.h>
46bcde4861SRafael Vanoni Polanczyk #include <kstat.h>
47bcde4861SRafael Vanoni Polanczyk #include <errno.h>
48bcde4861SRafael Vanoni Polanczyk #include "powertop.h"
49bcde4861SRafael Vanoni Polanczyk
50bcde4861SRafael Vanoni Polanczyk static char PROG_FMT[] = "%s: ";
51bcde4861SRafael Vanoni Polanczyk static char ERR_FMT[] = ": %s";
52bcde4861SRafael Vanoni Polanczyk static char *progname;
53bcde4861SRafael Vanoni Polanczyk
54bcde4861SRafael Vanoni Polanczyk void
pt_set_progname(char * name)55bcde4861SRafael Vanoni Polanczyk pt_set_progname(char *name)
56bcde4861SRafael Vanoni Polanczyk {
57bcde4861SRafael Vanoni Polanczyk progname = basename(name);
58bcde4861SRafael Vanoni Polanczyk }
59bcde4861SRafael Vanoni Polanczyk
60bcde4861SRafael Vanoni Polanczyk /*PRINTFLIKE1*/
61bcde4861SRafael Vanoni Polanczyk void
pt_error(char * format,...)62bcde4861SRafael Vanoni Polanczyk pt_error(char *format, ...)
63bcde4861SRafael Vanoni Polanczyk {
64bcde4861SRafael Vanoni Polanczyk int err = errno;
65bcde4861SRafael Vanoni Polanczyk va_list alist;
66bcde4861SRafael Vanoni Polanczyk
67b47b5b34SRafael Vanoni if (g_gui)
68b158c044SRafael Vanoni return;
69b158c044SRafael Vanoni
70bcde4861SRafael Vanoni Polanczyk if (progname != NULL)
71bcde4861SRafael Vanoni Polanczyk (void) fprintf(stderr, PROG_FMT, progname);
72bcde4861SRafael Vanoni Polanczyk
73bcde4861SRafael Vanoni Polanczyk va_start(alist, format);
74bcde4861SRafael Vanoni Polanczyk (void) vfprintf(stderr, format, alist);
75bcde4861SRafael Vanoni Polanczyk va_end(alist);
76bcde4861SRafael Vanoni Polanczyk
77bcde4861SRafael Vanoni Polanczyk if (strchr(format, '\n') == NULL)
78*2d83778aSRafael Vanoni (void) fprintf(stderr, ERR_FMT, strerror(err));
79bcde4861SRafael Vanoni Polanczyk }
80bcde4861SRafael Vanoni Polanczyk
81b47b5b34SRafael Vanoni /*
82b47b5b34SRafael Vanoni * Returns the number of online CPUs.
83b47b5b34SRafael Vanoni */
84b47b5b34SRafael Vanoni uint_t
pt_enumerate_cpus(void)85*2d83778aSRafael Vanoni pt_enumerate_cpus(void)
86bcde4861SRafael Vanoni Polanczyk {
87bcde4861SRafael Vanoni Polanczyk int cpuid;
88bcde4861SRafael Vanoni Polanczyk int max, cpus_conf;
89b47b5b34SRafael Vanoni uint_t ncpus = 0;
90bcde4861SRafael Vanoni Polanczyk
91bcde4861SRafael Vanoni Polanczyk max = sysconf(_SC_CPUID_MAX);
92bcde4861SRafael Vanoni Polanczyk cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
93b47b5b34SRafael Vanoni
94b47b5b34SRafael Vanoni /* Fall back to one CPU if any of the sysconf calls above failed */
95b47b5b34SRafael Vanoni if (max == -1 || cpus_conf == -1) {
96b47b5b34SRafael Vanoni max = cpus_conf = 1;
97b47b5b34SRafael Vanoni }
98b47b5b34SRafael Vanoni
99b47b5b34SRafael Vanoni if ((g_cpu_table = malloc(cpus_conf * sizeof (processorid_t))) == NULL)
100b47b5b34SRafael Vanoni return (0);
101bcde4861SRafael Vanoni Polanczyk
102bcde4861SRafael Vanoni Polanczyk for (cpuid = 0; cpuid < max; cpuid++) {
103bcde4861SRafael Vanoni Polanczyk if (p_online(cpuid, P_STATUS) != -1) {
104b47b5b34SRafael Vanoni g_cpu_table[ncpus] = cpuid;
105bcde4861SRafael Vanoni Polanczyk ncpus++;
106bcde4861SRafael Vanoni Polanczyk }
107bcde4861SRafael Vanoni Polanczyk }
108b47b5b34SRafael Vanoni return (ncpus);
109bcde4861SRafael Vanoni Polanczyk }
110bcde4861SRafael Vanoni Polanczyk
111bcde4861SRafael Vanoni Polanczyk void
pt_usage(void)112*2d83778aSRafael Vanoni pt_usage(void)
113bcde4861SRafael Vanoni Polanczyk {
114b47b5b34SRafael Vanoni (void) fprintf(stderr, "%s %s\n\n", TITLE, COPYRIGHT_INTEL);
115*2d83778aSRafael Vanoni (void) fprintf(stderr, "usage: powertop [option]\n");
116bcde4861SRafael Vanoni Polanczyk (void) fprintf(stderr, " -d, --dump [count] Read wakeups count "
117bcde4861SRafael Vanoni Polanczyk "times and print list of top offenders\n");
118bcde4861SRafael Vanoni Polanczyk (void) fprintf(stderr, " -t, --time [interval] Default time to gather "
119*2d83778aSRafael Vanoni "data in seconds [1-30s]\n");
120bcde4861SRafael Vanoni Polanczyk (void) fprintf(stderr, " -v, --verbose Verbose mode, reports "
121bcde4861SRafael Vanoni Polanczyk "kernel cyclic activity\n");
122b47b5b34SRafael Vanoni (void) fprintf(stderr, " -c, --cpu [CPU] Only observe a specific"
123b47b5b34SRafael Vanoni " CPU\n");
124bcde4861SRafael Vanoni Polanczyk (void) fprintf(stderr, " -h, --help Show this help "
125bcde4861SRafael Vanoni Polanczyk "message\n");
126bcde4861SRafael Vanoni Polanczyk }
127bcde4861SRafael Vanoni Polanczyk
128bcde4861SRafael Vanoni Polanczyk int
pt_get_bit_depth(void)129*2d83778aSRafael Vanoni pt_get_bit_depth(void)
130bcde4861SRafael Vanoni Polanczyk {
131bcde4861SRafael Vanoni Polanczyk /*
132bcde4861SRafael Vanoni Polanczyk * This little routine was derived from isainfo.c to look up
133bcde4861SRafael Vanoni Polanczyk * the system's bit depth. It feeds a 10 byte long buffer to
134bcde4861SRafael Vanoni Polanczyk * sysinfo (we only need the first word, sysinfo truncates and
135bcde4861SRafael Vanoni Polanczyk * \0 terminates the rest) from which we figure out which isa
136bcde4861SRafael Vanoni Polanczyk * we're running on.
137bcde4861SRafael Vanoni Polanczyk */
138bcde4861SRafael Vanoni Polanczyk char buf[BIT_DEPTH_BUF];
139bcde4861SRafael Vanoni Polanczyk
140bcde4861SRafael Vanoni Polanczyk if (sysinfo(SI_ARCHITECTURE_64, buf, BIT_DEPTH_BUF) == -1)
141bcde4861SRafael Vanoni Polanczyk if (sysinfo(SI_ARCHITECTURE_32, buf, BIT_DEPTH_BUF) == -1)
142bcde4861SRafael Vanoni Polanczyk return (-2);
143bcde4861SRafael Vanoni Polanczyk
144bcde4861SRafael Vanoni Polanczyk if (strcmp(buf, "sparc") == 0 || strcmp(buf, "i386") == 0)
145bcde4861SRafael Vanoni Polanczyk return (32);
146bcde4861SRafael Vanoni Polanczyk
147bcde4861SRafael Vanoni Polanczyk if (strcmp(buf, "sparcv9") == 0 || strcmp(buf, "amd64") == 0)
148bcde4861SRafael Vanoni Polanczyk return (64);
149bcde4861SRafael Vanoni Polanczyk
150bcde4861SRafael Vanoni Polanczyk return (-3);
151bcde4861SRafael Vanoni Polanczyk }
152bcde4861SRafael Vanoni Polanczyk
153bcde4861SRafael Vanoni Polanczyk /*
154bcde4861SRafael Vanoni Polanczyk * Simple integer comparison routine for the event report qsort(3C).
155bcde4861SRafael Vanoni Polanczyk */
156bcde4861SRafael Vanoni Polanczyk int
pt_event_compare(const void * p1,const void * p2)157*2d83778aSRafael Vanoni pt_event_compare(const void *p1, const void *p2)
158bcde4861SRafael Vanoni Polanczyk {
159bcde4861SRafael Vanoni Polanczyk event_info_t i = *((event_info_t *)p1);
160bcde4861SRafael Vanoni Polanczyk event_info_t j = *((event_info_t *)p2);
161bcde4861SRafael Vanoni Polanczyk
162bcde4861SRafael Vanoni Polanczyk if (i.total_count > j.total_count)
163bcde4861SRafael Vanoni Polanczyk return (-1);
164bcde4861SRafael Vanoni Polanczyk
165bcde4861SRafael Vanoni Polanczyk if (i.total_count < j.total_count)
166bcde4861SRafael Vanoni Polanczyk return (1);
167bcde4861SRafael Vanoni Polanczyk
168bcde4861SRafael Vanoni Polanczyk return (0);
169bcde4861SRafael Vanoni Polanczyk }
170