• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #! /usr/bin/env python
2 """
3 Read oprofile events file, generate C data struct for Android opcontrol.
4 
5 Android does not use script for opcontrol, they use a C binary, which
6 has embedded data structures with the event set that is supported.
7 Initially that is just Arm V6 and V7.
8 
9 This tool allows us to convert various MIPS cpu event files for
10 inclusion, and should work with other processor arch's as well.
11 
12 Neither Arm or Mips uses unit_masks, so that file is ignored.
13 
14 Event entries in file look like this:
15 
16     event:0x1 counters:0,1 um:zero minimum:500 name:INSTRUCTIONS : Instructions completed
17 
18 The format is key:value. A single : appears at the end of line
19 and the remaining text is the description
20 """
21 
22 import os, sys
23 
24 def number(s):
25     if s == 'zero':
26         return '0'
27     if s == 'one':
28         return '1'
29     if s[0] == 'x':
30         return '0'+s
31 
32 def parse_event(line,ovf):
33     ''' return dictionary of items from one line of event file '''
34     dict = {}
35     fields = line.split(None, 1)
36     while (fields):
37         first = fields[0].split(':', 1)
38         if first[0] == 'include':
39             ev(first[1] + "/events", ovf)
40             return None
41         line = fields[1]
42         if first[0] == 'um':
43             first[1] = number(first[1])
44         if first[0] == '':
45             dict['description'] = fields[1]
46             fields = None;
47         else:
48             dict[first[0]] = first[1]
49             fields = line.split(None, 1)
50     return dict
51 
52 def parse_ctr(s):
53     ''' convert comma separated list of integers x,y,... , to CTR(x) | CTR(y) | ... '''
54     if s == 'cpuid':
55         return 0
56     ctrs = s.split(',')
57     c = ''
58     for i in range(len(ctrs)-1):
59         c += ("CTR(%s) | " % ctrs[i])
60     c += ("CTR(%s)" % ctrs[-1])
61     return c
62 
63 def ev(fname,ovf):
64     ''' read file, parse, generate C data struct to file ovf '''
65     evf = open(fname, "r")
66     all_lines = evf.readlines()
67     lines = [s.strip() for s in all_lines if s.strip()]     # strip blanks
68     lines = [s for s in lines if not s.startswith('#')]     # strip comments
69     eventlist = [parse_event(line,ovf) for line in lines]
70 
71     ovf.write("// events from file %s\n" % fname)
72     for d in eventlist:
73         if d!=None:
74             ovf.write('    {%s, %s, %s, "%s",\n' % (d['event'], parse_ctr(d['counters']), d['um'], d['name']))
75             ovf.write('     "%s"},\n' % d['description'])
76 
77 
78 if __name__ == "__main__" :
79     if len(sys.argv) != 2:
80         fname = "events/mips/24K/events"    # convenient testing
81     else:
82         fname = sys.argv[1]
83     ovf = open(fname + ".h", "w")
84     ev(fname, ovf)
85