2017-05-26 11:17:35 +03:00
# intel-pt-events.py: Print Intel PT Power Events and PTWRITE
# Copyright (c) 2017, Intel Corporation.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms and conditions of the GNU General Public License,
# version 2, as published by the Free Software Foundation.
#
# This program is distributed in the hope it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
2019-03-05 08:19:02 -08:00
from __future__ import print_function
2017-05-26 11:17:35 +03:00
import os
import sys
import struct
sys . path . append ( os . environ [ ' PERF_EXEC_PATH ' ] + \
' /scripts/python/Perf-Trace-Util/lib/Perf/Trace ' )
# These perf imports are not used at present
#from perf_trace_context import *
#from Core import *
def trace_begin ( ) :
2019-03-05 08:19:02 -08:00
print ( " Intel PT Power Events and PTWRITE " )
2017-05-26 11:17:35 +03:00
def trace_end ( ) :
2019-03-05 08:19:02 -08:00
print ( " End " )
2017-05-26 11:17:35 +03:00
def trace_unhandled ( event_name , context , event_fields_dict ) :
2019-03-05 08:19:02 -08:00
print ( ' ' . join ( [ ' %s = %s ' % ( k , str ( v ) ) for k , v in sorted ( event_fields_dict . items ( ) ) ] ) )
2017-05-26 11:17:35 +03:00
def print_ptwrite ( raw_buf ) :
data = struct . unpack_from ( " <IQ " , raw_buf )
flags = data [ 0 ]
payload = data [ 1 ]
exact_ip = flags & 1
2019-03-05 08:19:02 -08:00
print ( " IP: %u payload: %#x " % ( exact_ip , payload ) , end = ' ' )
2017-05-26 11:17:35 +03:00
def print_cbr ( raw_buf ) :
data = struct . unpack_from ( " <BBBBII " , raw_buf )
cbr = data [ 0 ]
f = ( data [ 4 ] + 500 ) / 1000
p = ( ( cbr * 1000 / data [ 2 ] ) + 5 ) / 10
2019-03-05 08:19:02 -08:00
print ( " %3u freq: %4u MHz ( %3u %% ) " % ( cbr , f , p ) , end = ' ' )
2017-05-26 11:17:35 +03:00
def print_mwait ( raw_buf ) :
data = struct . unpack_from ( " <IQ " , raw_buf )
payload = data [ 1 ]
hints = payload & 0xff
extensions = ( payload >> 32 ) & 0x3
2019-03-05 08:19:02 -08:00
print ( " hints: %#x extensions: %#x " % ( hints , extensions ) , end = ' ' )
2017-05-26 11:17:35 +03:00
def print_pwre ( raw_buf ) :
data = struct . unpack_from ( " <IQ " , raw_buf )
payload = data [ 1 ]
hw = ( payload >> 7 ) & 1
cstate = ( payload >> 12 ) & 0xf
subcstate = ( payload >> 8 ) & 0xf
2019-03-05 08:19:02 -08:00
print ( " hw: %u cstate: %u sub-cstate: %u " % ( hw , cstate , subcstate ) ,
end = ' ' )
2017-05-26 11:17:35 +03:00
def print_exstop ( raw_buf ) :
data = struct . unpack_from ( " <I " , raw_buf )
flags = data [ 0 ]
exact_ip = flags & 1
2019-03-05 08:19:02 -08:00
print ( " IP: %u " % ( exact_ip ) , end = ' ' )
2017-05-26 11:17:35 +03:00
def print_pwrx ( raw_buf ) :
data = struct . unpack_from ( " <IQ " , raw_buf )
payload = data [ 1 ]
deepest_cstate = payload & 0xf
last_cstate = ( payload >> 4 ) & 0xf
wake_reason = ( payload >> 8 ) & 0xf
2019-03-05 08:19:02 -08:00
print ( " deepest cstate: %u last cstate: %u wake reason: %#x " %
( deepest_cstate , last_cstate , wake_reason ) , end = ' ' )
2017-05-26 11:17:35 +03:00
def print_common_start ( comm , sample , name ) :
ts = sample [ " time " ]
cpu = sample [ " cpu " ]
pid = sample [ " pid " ]
tid = sample [ " tid " ]
2019-03-05 08:19:02 -08:00
print ( " %16s %5u / %-5u [ %03u ] %9u . %09u %7s : " %
( comm , pid , tid , cpu , ts / 1000000000 , ts % 1000000000 , name ) ,
end = ' ' )
2017-05-26 11:17:35 +03:00
def print_common_ip ( sample , symbol , dso ) :
ip = sample [ " ip " ]
2019-03-05 08:19:02 -08:00
print ( " %16x %s ( %s ) " % ( ip , symbol , dso ) )
2017-05-26 11:17:35 +03:00
def process_event ( param_dict ) :
2019-03-01 17:18:57 -08:00
event_attr = param_dict [ " attr " ]
sample = param_dict [ " sample " ]
raw_buf = param_dict [ " raw_buf " ]
comm = param_dict [ " comm " ]
name = param_dict [ " ev_name " ]
# Symbol and dso info are not always resolved
2019-03-05 08:19:02 -08:00
if " dso " in param_dict :
2019-03-01 17:18:57 -08:00
dso = param_dict [ " dso " ]
else :
dso = " [unknown] "
2019-03-05 08:19:02 -08:00
if " symbol " in param_dict :
2019-03-01 17:18:57 -08:00
symbol = param_dict [ " symbol " ]
else :
symbol = " [unknown] "
2017-05-26 11:17:35 +03:00
if name == " ptwrite " :
print_common_start ( comm , sample , name )
print_ptwrite ( raw_buf )
print_common_ip ( sample , symbol , dso )
elif name == " cbr " :
print_common_start ( comm , sample , name )
print_cbr ( raw_buf )
print_common_ip ( sample , symbol , dso )
elif name == " mwait " :
print_common_start ( comm , sample , name )
print_mwait ( raw_buf )
print_common_ip ( sample , symbol , dso )
elif name == " pwre " :
print_common_start ( comm , sample , name )
print_pwre ( raw_buf )
print_common_ip ( sample , symbol , dso )
elif name == " exstop " :
print_common_start ( comm , sample , name )
print_exstop ( raw_buf )
print_common_ip ( sample , symbol , dso )
elif name == " pwrx " :
print_common_start ( comm , sample , name )
print_pwrx ( raw_buf )
print_common_ip ( sample , symbol , dso )