Paul Lind | 73f45fe | 2013-03-04 17:10:49 -0800 | [diff] [blame] | 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) |