1765532c8SArnaldo Carvalho de Melo# Core.py - Python extension for perf script, core functions 27e4b21b8STom Zanussi# 37e4b21b8STom Zanussi# Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com> 47e4b21b8STom Zanussi# 57e4b21b8STom Zanussi# This software may be distributed under the terms of the GNU General 67e4b21b8STom Zanussi# Public License ("GPL") version 2 as published by the Free Software 77e4b21b8STom Zanussi# Foundation. 87e4b21b8STom Zanussi 97e4b21b8STom Zanussifrom collections import defaultdict 107e4b21b8STom Zanussi 117e4b21b8STom Zanussidef autodict(): 127e4b21b8STom Zanussi return defaultdict(autodict) 137e4b21b8STom Zanussi 147e4b21b8STom Zanussiflag_fields = autodict() 157e4b21b8STom Zanussisymbolic_fields = autodict() 167e4b21b8STom Zanussi 177e4b21b8STom Zanussidef define_flag_field(event_name, field_name, delim): 187e4b21b8STom Zanussi flag_fields[event_name][field_name]['delim'] = delim 197e4b21b8STom Zanussi 207e4b21b8STom Zanussidef define_flag_value(event_name, field_name, value, field_str): 217e4b21b8STom Zanussi flag_fields[event_name][field_name]['values'][value] = field_str 227e4b21b8STom Zanussi 237e4b21b8STom Zanussidef define_symbolic_field(event_name, field_name): 247e4b21b8STom Zanussi # nothing to do, really 257e4b21b8STom Zanussi pass 267e4b21b8STom Zanussi 277e4b21b8STom Zanussidef define_symbolic_value(event_name, field_name, value, field_str): 287e4b21b8STom Zanussi symbolic_fields[event_name][field_name]['values'][value] = field_str 297e4b21b8STom Zanussi 307e4b21b8STom Zanussidef flag_str(event_name, field_name, value): 317e4b21b8STom Zanussi string = "" 327e4b21b8STom Zanussi 337e4b21b8STom Zanussi if flag_fields[event_name][field_name]: 347e4b21b8STom Zanussi print_delim = 0 35770d2f86SJeremy Cline for idx in sorted(flag_fields[event_name][field_name]['values']): 367e4b21b8STom Zanussi if not value and not idx: 377e4b21b8STom Zanussi string += flag_fields[event_name][field_name]['values'][idx] 387e4b21b8STom Zanussi break 397e4b21b8STom Zanussi if idx and (value & idx) == idx: 407e4b21b8STom Zanussi if print_delim and flag_fields[event_name][field_name]['delim']: 417e4b21b8STom Zanussi string += " " + flag_fields[event_name][field_name]['delim'] + " " 427e4b21b8STom Zanussi string += flag_fields[event_name][field_name]['values'][idx] 437e4b21b8STom Zanussi print_delim = 1 447e4b21b8STom Zanussi value &= ~idx 457e4b21b8STom Zanussi 467e4b21b8STom Zanussi return string 477e4b21b8STom Zanussi 487e4b21b8STom Zanussidef symbol_str(event_name, field_name, value): 497e4b21b8STom Zanussi string = "" 507e4b21b8STom Zanussi 517e4b21b8STom Zanussi if symbolic_fields[event_name][field_name]: 52770d2f86SJeremy Cline for idx in sorted(symbolic_fields[event_name][field_name]['values']): 537e4b21b8STom Zanussi if not value and not idx: 547e4b21b8STom Zanussi string = symbolic_fields[event_name][field_name]['values'][idx] 557e4b21b8STom Zanussi break 567e4b21b8STom Zanussi if (value == idx): 577e4b21b8STom Zanussi string = symbolic_fields[event_name][field_name]['values'][idx] 587e4b21b8STom Zanussi break 597e4b21b8STom Zanussi 607e4b21b8STom Zanussi return string 617e4b21b8STom Zanussi 627e4b21b8STom Zanussitrace_flags = { 0x00: "NONE", \ 637e4b21b8STom Zanussi 0x01: "IRQS_OFF", \ 647e4b21b8STom Zanussi 0x02: "IRQS_NOSUPPORT", \ 657e4b21b8STom Zanussi 0x04: "NEED_RESCHED", \ 667e4b21b8STom Zanussi 0x08: "HARDIRQ", \ 677e4b21b8STom Zanussi 0x10: "SOFTIRQ" } 687e4b21b8STom Zanussi 697e4b21b8STom Zanussidef trace_flag_str(value): 707e4b21b8STom Zanussi string = "" 717e4b21b8STom Zanussi print_delim = 0 727e4b21b8STom Zanussi 73770d2f86SJeremy Cline for idx in trace_flags: 747e4b21b8STom Zanussi if not value and not idx: 757e4b21b8STom Zanussi string += "NONE" 767e4b21b8STom Zanussi break 777e4b21b8STom Zanussi 787e4b21b8STom Zanussi if idx and (value & idx) == idx: 797e4b21b8STom Zanussi if print_delim: 807e4b21b8STom Zanussi string += " | "; 817e4b21b8STom Zanussi string += trace_flags[idx] 827e4b21b8STom Zanussi print_delim = 1 837e4b21b8STom Zanussi value &= ~idx 847e4b21b8STom Zanussi 857e4b21b8STom Zanussi return string 861b0ff06eSFrederic Weisbecker 871b0ff06eSFrederic Weisbecker 881b0ff06eSFrederic Weisbeckerdef taskState(state): 891b0ff06eSFrederic Weisbecker states = { 901b0ff06eSFrederic Weisbecker 0 : "R", 911b0ff06eSFrederic Weisbecker 1 : "S", 921b0ff06eSFrederic Weisbecker 2 : "D", 931b0ff06eSFrederic Weisbecker 64: "DEAD" 941b0ff06eSFrederic Weisbecker } 951b0ff06eSFrederic Weisbecker 961b0ff06eSFrederic Weisbecker if state not in states: 971b0ff06eSFrederic Weisbecker return "Unknown" 981b0ff06eSFrederic Weisbecker 991b0ff06eSFrederic Weisbecker return states[state] 1001b0ff06eSFrederic Weisbecker 1011b0ff06eSFrederic Weisbecker 1021b0ff06eSFrederic Weisbeckerclass EventHeaders: 1031b0ff06eSFrederic Weisbecker def __init__(self, common_cpu, common_secs, common_nsecs, 1040f5f5bcdSJoseph Schuchart common_pid, common_comm, common_callchain): 1051b0ff06eSFrederic Weisbecker self.cpu = common_cpu 1061b0ff06eSFrederic Weisbecker self.secs = common_secs 1071b0ff06eSFrederic Weisbecker self.nsecs = common_nsecs 1081b0ff06eSFrederic Weisbecker self.pid = common_pid 1091b0ff06eSFrederic Weisbecker self.comm = common_comm 1100f5f5bcdSJoseph Schuchart self.callchain = common_callchain 1111b0ff06eSFrederic Weisbecker 1121b0ff06eSFrederic Weisbecker def ts(self): 1131b0ff06eSFrederic Weisbecker return (self.secs * (10 ** 9)) + self.nsecs 1141b0ff06eSFrederic Weisbecker 1151b0ff06eSFrederic Weisbecker def ts_format(self): 1161b0ff06eSFrederic Weisbecker return "%d.%d" % (self.secs, int(self.nsecs / 1000)) 117