pt_i386.c revision 9338:fd0d0071cbee
1/* 2 * Copyright 2009, Intel Corporation 3 * Copyright 2009, Sun Microsystems, Inc 4 * 5 * This file is part of PowerTOP 6 * 7 * This program file is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License as published by the 9 * Free Software Foundation; version 2 of the License. 10 * 11 * This program is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program in a file named COPYING; if not, write to the 18 * Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, 20 * Boston, MA 02110-1301 USA 21 * 22 * Authors: 23 * Arjan van de Ven <arjan@linux.intel.com> 24 * Eric C Saxe <eric.saxe@sun.com> 25 * Aubrey Li <aubrey.li@intel.com> 26 */ 27 28/* 29 * GPL Disclaimer 30 * 31 * For the avoidance of doubt, except that if any license choice other 32 * than GPL or LGPL is available it will apply instead, Sun elects to 33 * use only the General Public License version 2 (GPLv2) at this time 34 * for any software where a choice of GPL license versions is made 35 * available with the language indicating that GPLv2 or any later 36 * version may be used, or where a choice of which version of the GPL 37 * is applied is otherwise unspecified. 38 */ 39 40/* 41 * DTrace scripts for observing interrupts, callouts and cyclic events 42 * that cause CPU activity. Such activity prevents the processor from 43 * entering lower power states and reducing power consumption. 44 * 45 * g_dtp_events is the default script 46 */ 47const char *g_dtp_events = 48"interrupt-complete" 49"/arg0 != NULL && arg3 !=0/" 50"{" 51" this->devi = (struct dev_info *)arg0;" 52" @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 53" this->devi->devi_instance] = count();" 54"}" 55"" 56"sdt:::callout-start" 57"/(caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 58"{" 59" this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 60" @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 61"}" 62"" 63"sdt:::callout-start" 64"/(caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 65"{" 66" @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 67"}" 68"" 69"sdt:::cyclic-start" 70"/(caddr_t)((cyclic_t *)arg0)->cy_handler == (caddr_t)&`clock/" 71"{" 72" @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 73"}" 74"" 75"fbt::xc_common:entry" 76"{" 77" self->xc_func = arg0;" 78"}" 79"" 80"sysinfo:::xcalls" 81"/pid != $pid/" 82"{" 83" @events_x[execname, self->xc_func] = sum(arg0);" 84"}" 85"" 86"fbt::xc_common:return" 87"/self->xc_func/" 88"{" 89" self->xc_func = 0;" 90"}"; 91 92/* 93 * g_dtp_events_v is enabled through the -v option, it includes cyclic events 94 * in the report, allowing a complete view of system activity 95 */ 96const char *g_dtp_events_v = 97"interrupt-complete" 98"/arg0 != NULL && arg3 !=0/" 99"{" 100" this->devi = (struct dev_info *)arg0;" 101" @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 102" this->devi->devi_instance] = count();" 103"}" 104"" 105"sdt:::callout-start" 106"/(caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 107"{" 108" this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 109" @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 110"}" 111"" 112"sdt:::callout-start" 113"/(caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 114"{" 115" @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 116"}" 117"" 118"sdt:::cyclic-start" 119"/(caddr_t)((cyclic_t *)arg0)->cy_handler != (caddr_t)&`dtrace_state_deadman &&" 120" (caddr_t)((cyclic_t *)arg0)->cy_handler != (caddr_t)&`dtrace_state_clean/" 121"{" 122" @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 123"}" 124"" 125"fbt::xc_common:entry" 126"{" 127" self->xc_func = arg0;" 128"}" 129"" 130"sysinfo:::xcalls" 131"/pid != $pid/" 132"{" 133" @events_x[execname, self->xc_func] = sum(arg0);" 134"}" 135"" 136"fbt::xc_common:return" 137"/self->xc_func/" 138"{" 139" self->xc_func = 0;" 140"}"; 141 142/* 143 * This script is selected through the -c option, it takes the CPU id as 144 * argument and observes activity generated by that CPU 145 */ 146const char *g_dtp_events_c = 147"interrupt-complete" 148"/cpu == $0 &&" 149" arg0 != NULL && arg3 != 0/" 150"{" 151" this->devi = (struct dev_info *)arg0;" 152" @interrupts[stringof(`devnamesp[this->devi->devi_major].dn_name)," 153" this->devi->devi_instance] = count();" 154"}" 155"" 156"sdt:::callout-start" 157"/cpu == $0 &&" 158" (caddr_t)((callout_t *)arg0)->c_func == (caddr_t)&`setrun/" 159"{" 160" this->thr = (kthread_t *)(((callout_t *)arg0)->c_arg);" 161" @events_u[stringof(this->thr->t_procp->p_user.u_comm)] = count();" 162"}" 163"" 164"sdt:::callout-start" 165"/cpu == $0 &&" 166" (caddr_t)((callout_t *)arg0)->c_func != (caddr_t)&`setrun/" 167"{" 168" @events_k[(caddr_t)((callout_t *)arg0)->c_func] = count();" 169"}" 170"" 171"sdt:::cyclic-start" 172"/cpu == $0 &&" 173" (caddr_t)((cyclic_t *)arg0)->cy_handler == (caddr_t)&`clock/" 174"{" 175" @events_k[(caddr_t)((cyclic_t *)arg0)->cy_handler] = count();" 176"}" 177"" 178"fbt::xc_common:entry" 179"/cpu == $0/" 180"{" 181" self->xc_func = arg0;" 182"}" 183"" 184"sysinfo:::xcalls" 185"/pid != $pid &&" 186" cpu == $0/" 187"{" 188" @events_x[execname, self->xc_func] = count();" 189"}" 190"" 191"fbt::xc_common:return" 192"/cpu == $0 &&" 193" self->xc_func/" 194"{" 195" self->xc_func = 0;" 196"}" 197"" 198"fbt::xc_common:entry" 199"/cpu != $0/" 200"{" 201" self->xc_func = arg0;" 202" self->xc_cpu = cpu;" 203"}" 204"" 205"fbt::send_dirint:entry" 206"/pid != $pid &&" 207" self->xc_func &&" 208" arg0 == $0/" 209"{" 210" @events_xc[execname, self->xc_func, self->xc_cpu] = count();" 211" self->xc_func = 0;" 212" self->xc_cpu = 0;" 213"}"; 214 215/* 216 * i386 platform specific display messages 217 */ 218const char *g_msg_idle_state = "C-states (idle power states)"; 219const char *g_msg_freq_state = "P-states (frequencies)"; 220