aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-script.c
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2017-06-30 04:36:42 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2017-06-30 10:40:20 -0400
commit65c5e18f9df078f40abd22a3f6983eb9804b6d02 (patch)
tree5c3cfaa8d39e34970385f9d0adb042807a98e972 /tools/perf/builtin-script.c
parent47e780848e6229b102e601deeb1ce571dc69a84a (diff)
perf script: Add synthesized Intel PT power and ptwrite events
Add definitions for synthesized Intel PT events for power and ptwrite. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Cc: Andi Kleen <ak@linux.intel.com> Link: http://lkml.kernel.org/r/1498811802-2301-1-git-send-email-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-script.c')
-rw-r--r--tools/perf/builtin-script.c114
1 files changed, 113 insertions, 1 deletions
diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index e87b480bbdd0..b458a0cc3544 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -1203,10 +1203,122 @@ static void print_sample_bpf_output(struct perf_sample *sample)
1203 (char *)(sample->raw_data)); 1203 (char *)(sample->raw_data));
1204} 1204}
1205 1205
1206static void print_sample_synth(struct perf_sample *sample __maybe_unused, 1206static void print_sample_spacing(int len, int spacing)
1207{
1208 if (len > 0 && len < spacing)
1209 printf("%*s", spacing - len, "");
1210}
1211
1212static void print_sample_pt_spacing(int len)
1213{
1214 print_sample_spacing(len, 34);
1215}
1216
1217static void print_sample_synth_ptwrite(struct perf_sample *sample)
1218{
1219 struct perf_synth_intel_ptwrite *data = perf_sample__synth_ptr(sample);
1220 int len;
1221
1222 if (perf_sample__bad_synth_size(sample, *data))
1223 return;
1224
1225 len = printf(" IP: %u payload: %#" PRIx64 " ",
1226 data->ip, le64_to_cpu(data->payload));
1227 print_sample_pt_spacing(len);
1228}
1229
1230static void print_sample_synth_mwait(struct perf_sample *sample)
1231{
1232 struct perf_synth_intel_mwait *data = perf_sample__synth_ptr(sample);
1233 int len;
1234
1235 if (perf_sample__bad_synth_size(sample, *data))
1236 return;
1237
1238 len = printf(" hints: %#x extensions: %#x ",
1239 data->hints, data->extensions);
1240 print_sample_pt_spacing(len);
1241}
1242
1243static void print_sample_synth_pwre(struct perf_sample *sample)
1244{
1245 struct perf_synth_intel_pwre *data = perf_sample__synth_ptr(sample);
1246 int len;
1247
1248 if (perf_sample__bad_synth_size(sample, *data))
1249 return;
1250
1251 len = printf(" hw: %u cstate: %u sub-cstate: %u ",
1252 data->hw, data->cstate, data->subcstate);
1253 print_sample_pt_spacing(len);
1254}
1255
1256static void print_sample_synth_exstop(struct perf_sample *sample)
1257{
1258 struct perf_synth_intel_exstop *data = perf_sample__synth_ptr(sample);
1259 int len;
1260
1261 if (perf_sample__bad_synth_size(sample, *data))
1262 return;
1263
1264 len = printf(" IP: %u ", data->ip);
1265 print_sample_pt_spacing(len);
1266}
1267
1268static void print_sample_synth_pwrx(struct perf_sample *sample)
1269{
1270 struct perf_synth_intel_pwrx *data = perf_sample__synth_ptr(sample);
1271 int len;
1272
1273 if (perf_sample__bad_synth_size(sample, *data))
1274 return;
1275
1276 len = printf(" deepest cstate: %u last cstate: %u wake reason: %#x ",
1277 data->deepest_cstate, data->last_cstate,
1278 data->wake_reason);
1279 print_sample_pt_spacing(len);
1280}
1281
1282static void print_sample_synth_cbr(struct perf_sample *sample)
1283{
1284 struct perf_synth_intel_cbr *data = perf_sample__synth_ptr(sample);
1285 unsigned int percent, freq;
1286 int len;
1287
1288 if (perf_sample__bad_synth_size(sample, *data))
1289 return;
1290
1291 freq = (le32_to_cpu(data->freq) + 500) / 1000;
1292 len = printf(" cbr: %2u freq: %4u MHz ", data->cbr, freq);
1293 if (data->max_nonturbo) {
1294 percent = (5 + (1000 * data->cbr) / data->max_nonturbo) / 10;
1295 len += printf("(%3u%%) ", percent);
1296 }
1297 print_sample_pt_spacing(len);
1298}
1299
1300static void print_sample_synth(struct perf_sample *sample,
1207 struct perf_evsel *evsel) 1301 struct perf_evsel *evsel)
1208{ 1302{
1209 switch (evsel->attr.config) { 1303 switch (evsel->attr.config) {
1304 case PERF_SYNTH_INTEL_PTWRITE:
1305 print_sample_synth_ptwrite(sample);
1306 break;
1307 case PERF_SYNTH_INTEL_MWAIT:
1308 print_sample_synth_mwait(sample);
1309 break;
1310 case PERF_SYNTH_INTEL_PWRE:
1311 print_sample_synth_pwre(sample);
1312 break;
1313 case PERF_SYNTH_INTEL_EXSTOP:
1314 print_sample_synth_exstop(sample);
1315 break;
1316 case PERF_SYNTH_INTEL_PWRX:
1317 print_sample_synth_pwrx(sample);
1318 break;
1319 case PERF_SYNTH_INTEL_CBR:
1320 print_sample_synth_cbr(sample);
1321 break;
1210 default: 1322 default:
1211 break; 1323 break;
1212 } 1324 }