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 357e4b21b8STom Zanussi keys = flag_fields[event_name][field_name]['values'].keys() 367e4b21b8STom Zanussi keys.sort() 377e4b21b8STom Zanussi for idx in keys: 387e4b21b8STom Zanussi if not value and not idx: 397e4b21b8STom Zanussi string += flag_fields[event_name][field_name]['values'][idx] 407e4b21b8STom Zanussi break 417e4b21b8STom Zanussi if idx and (value & idx) == idx: 427e4b21b8STom Zanussi if print_delim and flag_fields[event_name][field_name]['delim']: 437e4b21b8STom Zanussi string += " " + flag_fields[event_name][field_name]['delim'] + " " 447e4b21b8STom Zanussi string += flag_fields[event_name][field_name]['values'][idx] 457e4b21b8STom Zanussi print_delim = 1 467e4b21b8STom Zanussi value &= ~idx 477e4b21b8STom Zanussi 487e4b21b8STom Zanussi return string 497e4b21b8STom Zanussi 507e4b21b8STom Zanussidef symbol_str(event_name, field_name, value): 517e4b21b8STom Zanussi string = "" 527e4b21b8STom Zanussi 537e4b21b8STom Zanussi if symbolic_fields[event_name][field_name]: 547e4b21b8STom Zanussi keys = symbolic_fields[event_name][field_name]['values'].keys() 557e4b21b8STom Zanussi keys.sort() 567e4b21b8STom Zanussi for idx in keys: 577e4b21b8STom Zanussi if not value and not idx: 587e4b21b8STom Zanussi string = symbolic_fields[event_name][field_name]['values'][idx] 597e4b21b8STom Zanussi break 607e4b21b8STom Zanussi if (value == idx): 617e4b21b8STom Zanussi string = symbolic_fields[event_name][field_name]['values'][idx] 627e4b21b8STom Zanussi break 637e4b21b8STom Zanussi 647e4b21b8STom Zanussi return string 657e4b21b8STom Zanussi 667e4b21b8STom Zanussitrace_flags = { 0x00: "NONE", \ 677e4b21b8STom Zanussi 0x01: "IRQS_OFF", \ 687e4b21b8STom Zanussi 0x02: "IRQS_NOSUPPORT", \ 697e4b21b8STom Zanussi 0x04: "NEED_RESCHED", \ 707e4b21b8STom Zanussi 0x08: "HARDIRQ", \ 717e4b21b8STom Zanussi 0x10: "SOFTIRQ" } 727e4b21b8STom Zanussi 737e4b21b8STom Zanussidef trace_flag_str(value): 747e4b21b8STom Zanussi string = "" 757e4b21b8STom Zanussi print_delim = 0 767e4b21b8STom Zanussi 777e4b21b8STom Zanussi keys = trace_flags.keys() 787e4b21b8STom Zanussi 797e4b21b8STom Zanussi for idx in keys: 807e4b21b8STom Zanussi if not value and not idx: 817e4b21b8STom Zanussi string += "NONE" 827e4b21b8STom Zanussi break 837e4b21b8STom Zanussi 847e4b21b8STom Zanussi if idx and (value & idx) == idx: 857e4b21b8STom Zanussi if print_delim: 867e4b21b8STom Zanussi string += " | "; 877e4b21b8STom Zanussi string += trace_flags[idx] 887e4b21b8STom Zanussi print_delim = 1 897e4b21b8STom Zanussi value &= ~idx 907e4b21b8STom Zanussi 917e4b21b8STom Zanussi return string 921b0ff06eSFrederic Weisbecker 931b0ff06eSFrederic Weisbecker 941b0ff06eSFrederic Weisbeckerdef taskState(state): 951b0ff06eSFrederic Weisbecker states = { 961b0ff06eSFrederic Weisbecker 0 : "R", 971b0ff06eSFrederic Weisbecker 1 : "S", 981b0ff06eSFrederic Weisbecker 2 : "D", 991b0ff06eSFrederic Weisbecker 64: "DEAD" 1001b0ff06eSFrederic Weisbecker } 1011b0ff06eSFrederic Weisbecker 1021b0ff06eSFrederic Weisbecker if state not in states: 1031b0ff06eSFrederic Weisbecker return "Unknown" 1041b0ff06eSFrederic Weisbecker 1051b0ff06eSFrederic Weisbecker return states[state] 1061b0ff06eSFrederic Weisbecker 1071b0ff06eSFrederic Weisbecker 1081b0ff06eSFrederic Weisbeckerclass EventHeaders: 1091b0ff06eSFrederic Weisbecker def __init__(self, common_cpu, common_secs, common_nsecs, 1101b0ff06eSFrederic Weisbecker common_pid, common_comm): 1111b0ff06eSFrederic Weisbecker self.cpu = common_cpu 1121b0ff06eSFrederic Weisbecker self.secs = common_secs 1131b0ff06eSFrederic Weisbecker self.nsecs = common_nsecs 1141b0ff06eSFrederic Weisbecker self.pid = common_pid 1151b0ff06eSFrederic Weisbecker self.comm = common_comm 1161b0ff06eSFrederic Weisbecker 1171b0ff06eSFrederic Weisbecker def ts(self): 1181b0ff06eSFrederic Weisbecker return (self.secs * (10 ** 9)) + self.nsecs 1191b0ff06eSFrederic Weisbecker 1201b0ff06eSFrederic Weisbecker def ts_format(self): 1211b0ff06eSFrederic Weisbecker return "%d.%d" % (self.secs, int(self.nsecs / 1000)) 122