Merge branches 'work.misc' and 'work.dcache' of git://git.kernel.org/pub/scm/linux...
[sfrench/cifs-2.6.git] / tools / perf / scripts / python / Perf-Trace-Util / lib / Perf / Trace / Core.py
1 # Core.py - Python extension for perf script, core functions
2 #
3 # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>
4 #
5 # This software may be distributed under the terms of the GNU General
6 # Public License ("GPL") version 2 as published by the Free Software
7 # Foundation.
8
9 from collections import defaultdict
10
11 def autodict():
12     return defaultdict(autodict)
13
14 flag_fields = autodict()
15 symbolic_fields = autodict()
16
17 def define_flag_field(event_name, field_name, delim):
18     flag_fields[event_name][field_name]['delim'] = delim
19
20 def define_flag_value(event_name, field_name, value, field_str):
21     flag_fields[event_name][field_name]['values'][value] = field_str
22
23 def define_symbolic_field(event_name, field_name):
24     # nothing to do, really
25     pass
26
27 def define_symbolic_value(event_name, field_name, value, field_str):
28     symbolic_fields[event_name][field_name]['values'][value] = field_str
29
30 def flag_str(event_name, field_name, value):
31     string = ""
32
33     if flag_fields[event_name][field_name]:
34         print_delim = 0
35         for idx in sorted(flag_fields[event_name][field_name]['values']):
36             if not value and not idx:
37                 string += flag_fields[event_name][field_name]['values'][idx]
38                 break
39             if idx and (value & idx) == idx:
40                 if print_delim and flag_fields[event_name][field_name]['delim']:
41                     string += " " + flag_fields[event_name][field_name]['delim'] + " "
42                 string += flag_fields[event_name][field_name]['values'][idx]
43                 print_delim = 1
44                 value &= ~idx
45
46     return string
47
48 def symbol_str(event_name, field_name, value):
49     string = ""
50
51     if symbolic_fields[event_name][field_name]:
52         for idx in sorted(symbolic_fields[event_name][field_name]['values']):
53             if not value and not idx:
54                 string = symbolic_fields[event_name][field_name]['values'][idx]
55                 break
56             if (value == idx):
57                 string = symbolic_fields[event_name][field_name]['values'][idx]
58                 break
59
60     return string
61
62 trace_flags = { 0x00: "NONE", \
63                     0x01: "IRQS_OFF", \
64                     0x02: "IRQS_NOSUPPORT", \
65                     0x04: "NEED_RESCHED", \
66                     0x08: "HARDIRQ", \
67                     0x10: "SOFTIRQ" }
68
69 def trace_flag_str(value):
70     string = ""
71     print_delim = 0
72
73     for idx in trace_flags:
74         if not value and not idx:
75             string += "NONE"
76             break
77
78         if idx and (value & idx) == idx:
79             if print_delim:
80                 string += " | ";
81             string += trace_flags[idx]
82             print_delim = 1
83             value &= ~idx
84
85     return string
86
87
88 def taskState(state):
89         states = {
90                 0 : "R",
91                 1 : "S",
92                 2 : "D",
93                 64: "DEAD"
94         }
95
96         if state not in states:
97                 return "Unknown"
98
99         return states[state]
100
101
102 class EventHeaders:
103         def __init__(self, common_cpu, common_secs, common_nsecs,
104                      common_pid, common_comm, common_callchain):
105                 self.cpu = common_cpu
106                 self.secs = common_secs
107                 self.nsecs = common_nsecs
108                 self.pid = common_pid
109                 self.comm = common_comm
110                 self.callchain = common_callchain
111
112         def ts(self):
113                 return (self.secs * (10 ** 9)) + self.nsecs
114
115         def ts_format(self):
116                 return "%d.%d" % (self.secs, int(self.nsecs / 1000))