ia64/xen-unstable

view tools/xentrace/xentrace_format @ 2860:61d139354129

bitkeeper revision 1.1159.157.1 (418934b0-qzq3Mn8ZcEAFEUYycHb2Q)

Device section fixes.
author akw27@labyrinth.cl.cam.ac.uk
date Wed Nov 03 19:42:40 2004 +0000 (2004-11-03)
parents 7843b8fd800f
children fa593bda762e 2955b0140fbe 69b60ce3f2dc 0c8a248ff045
line source
1 #!/usr/bin/env python
3 # by Mark Williamson, (C) 2004 Intel Research Cambridge
5 # Program for reformatting trace buffer output according to user-supplied rules
7 import re, sys, string, signal, struct, os, getopt
9 def usage():
10 print >> sys.stderr, \
11 "Usage: " + sys.argv[0] + """ defs-file
12 Parses trace data in binary format, as output by Xentrace and
13 reformats it according to the rules in a file of definitions. The
14 rules in this file should have the format ({ and } show grouping
15 and are not part of the syntax):
17 {event_id}{whitespace}{text format string}
19 The textual format string may include format specifiers, such as:
20 %(cpu)d, %(tsc)d, %(event)d, %(1)d, %(2)d, %(3)d, %(4)d, %(5)d
21 [ the 'd' format specifier outputs in decimal, alternatively 'x'
22 will output in hexadecimal and 'o' will output in octal ]
24 Which correspond to the CPU number, event ID, timestamp counter and
25 the 5 data fields from the trace record. There should be one such
26 rule for each type of event.
28 Depending on your system and the volume of trace buffer data,
29 this script may not be able to keep up with the output of xentrace
30 if it is piped directly. In these circumstances you should have
31 xentrace output to a file for processing off-line.
32 """
33 sys.exit(1)
35 def read_defs(defs_file):
36 defs = {}
38 fd = open(defs_file)
40 reg = re.compile('(\S+)\s+(\S.*)')
42 while True:
43 line = fd.readline()
44 if not line:
45 break
47 if line[0] == '#' or line[0] == '\n':
48 continue
50 m = reg.match(line)
52 if not m: print >> sys.stderr, "Bad format file" ; sys.exit(1)
54 defs[str(eval(m.group(1)))] = m.group(2)
56 return defs
58 def sighand(x,y):
59 global interrupted
60 interrupted = 1
62 ##### Main code
64 mhz = 0
66 if len(sys.argv) < 2:
67 usage()
69 try:
70 opts, arg = getopt.getopt(sys.argv[1:], "c:" )
72 for opt in opts:
73 if opt[0] == '-c' : mhz = int(opt[1])
75 except getopt.GetoptError:
76 usage()
78 print mhz
80 signal.signal(signal.SIGTERM, sighand)
81 signal.signal(signal.SIGHUP, sighand)
82 signal.signal(signal.SIGINT, sighand)
84 interrupted = 0
86 defs = read_defs(arg[0])
88 print defs
90 # structure of trace record + prepended CPU id (as output by xentrace):
91 # CPU(I) TSC(Q) EVENT(L) D1(L) D2(L) D3(L) D4(L) D5(L)
92 TRCREC = "IQLLLLLL"
94 last_tsc = [0,0,0,0,0,0,0,0]
96 i=0
98 while not interrupted:
99 try:
100 i=i+1
101 line = sys.stdin.read(struct.calcsize(TRCREC))
102 if not line:
103 break
105 (cpu, tsc, event, d1, d2, d3, d4, d5) = struct.unpack(TRCREC, line)
107 #tsc = (tscH<<32) | tscL
109 #print i, tsc
111 if tsc < last_tsc[cpu]:
112 print "TSC stepped backward cpu %d ! %d %d" % (cpu,tsc,last_tsc[cpu])
114 last_tsc[cpu] = tsc
116 if mhz:
117 tsc = tsc / (mhz*1000000.0)
119 args = {'cpu' : cpu,
120 'tsc' : tsc,
121 'event' : event,
122 '1' : d1,
123 '2' : d2,
124 '3' : d3,
125 '4' : d4,
126 '5' : d5 }
128 try:
130 if defs.has_key(str(event)):
131 print defs[str(event)] % args
132 else:
133 if defs.has_key(str(0)): print defs[str(0)] % args
134 except TypeError:
135 print defs[str(event)]
136 print args
139 except IOError, struct.error: sys.exit()