diff options
Diffstat (limited to 'opev.py')
-rwxr-xr-x | opev.py | 84 |
1 files changed, 84 insertions, 0 deletions
@@ -0,0 +1,84 @@ +#! /usr/bin/env python +""" +Read oprofile events file, generate C data struct for Android opcontrol. + +Android does not use script for opcontrol, they use a C binary, which +has embedded data structures with the event set that is supported. +Initially that is just Arm V6 and V7. + +This tool allows us to convert various MIPS cpu event files for +inclusion, and should work with other processor arch's as well. + +Neither Arm or Mips uses unit_masks, so that file is ignored. + +Event entries in file look like this: + + event:0x1 counters:0,1 um:zero minimum:500 name:INSTRUCTIONS : Instructions completed + +The format is key:value. A single : appears at the end of line +and the remaining text is the description +""" + +import os, sys + +def number(s): + if s == 'zero': + return '0' + if s == 'one': + return '1' + if s[0] == 'x': + return '0'+s + +def parse_event(line,ovf): + ''' return dictionary of items from one line of event file ''' + dict = {} + fields = line.split(None, 1) + while (fields): + first = fields[0].split(':', 1) + if first[0] == 'include': + ev(first[1] + "/events", ovf) + return None + line = fields[1] + if first[0] == 'um': + first[1] = number(first[1]) + if first[0] == '': + dict['description'] = fields[1] + fields = None; + else: + dict[first[0]] = first[1] + fields = line.split(None, 1) + return dict + +def parse_ctr(s): + ''' convert comma separated list of integers x,y,... , to CTR(x) | CTR(y) | ... ''' + if s == 'cpuid': + return 0 + ctrs = s.split(',') + c = '' + for i in range(len(ctrs)-1): + c += ("CTR(%s) | " % ctrs[i]) + c += ("CTR(%s)" % ctrs[-1]) + return c + +def ev(fname,ovf): + ''' read file, parse, generate C data struct to file ovf ''' + evf = open(fname, "r") + all_lines = evf.readlines() + lines = [s.strip() for s in all_lines if s.strip()] # strip blanks + lines = [s for s in lines if not s.startswith('#')] # strip comments + eventlist = [parse_event(line,ovf) for line in lines] + + ovf.write("// events from file %s\n" % fname) + for d in eventlist: + if d!=None: + ovf.write(' {%s, %s, %s, "%s",\n' % (d['event'], parse_ctr(d['counters']), d['um'], d['name'])) + ovf.write(' "%s"},\n' % d['description']) + + +if __name__ == "__main__" : + if len(sys.argv) != 2: + fname = "events/mips/24K/events" # convenient testing + else: + fname = sys.argv[1] + ovf = open(fname + ".h", "w") + ev(fname, ovf) |