kvm: optimize inline assembly
[qemu-kvm/fedora.git] / addrfilt
blob3e70754e5ff9a7719a98d68e9c71a10ac905f8a6
1 #!/usr/bin/python
3 import sys, re, os.path
4 import subprocess
5 from optparse import OptionParser
7 class Addr2line:
8 def __init__(self, vmlinux, prefix = ''):
9 self.a2l = subprocess.Popen(['addr2line', '-fe', vmlinux],
10 stdin = subprocess.PIPE,
11 stdout = subprocess.PIPE,
12 stderr = subprocess.PIPE,
13 close_fds = True)
14 self.prefix = prefix
15 self.cache = dict()
16 def resolve(self, addr):
17 self.a2l.stdin.write('%08x\n' % addr)
18 symbol = self.a2l.stdout.readline().strip()
19 file = self.a2l.stdout.readline().strip()
20 if symbol == '??':
21 return None
22 if file.startswith(self.prefix):
23 file = file[len(self.prefix):]
24 return (symbol, file)
26 class MultiResolver:
27 def __init__(self, resolvers):
28 self.resolvers = resolvers
29 def resolve(self, addr):
30 for resolver in self.resolvers:
31 ret = resolver.resolve(addr)
32 if ret:
33 return ret
35 class Cache:
36 def __init__(self, resolver):
37 self.resolver = resolver
38 self.cache = dict()
39 def resolve(self, addr):
40 if not self.cache.has_key(addr):
41 self.cache[addr] = self.resolver.resolve(addr)
42 return self.cache[addr]
44 optparser = OptionParser()
45 optparser.add_option('-g', '--guest', dest='guest', action='store_true',
46 default=True,
47 help='interpret kernel addresses as guest (default)')
48 optparser.add_option('-H', '--host', dest='guest', action='store_false',
49 help='interpret kernel addresses as host')
50 (options, args) = optparser.parse_args()
52 basedir = os.getcwd()
53 basedir = re.sub(r'(.*/kvm)(/.*)', r'\1', basedir)
55 addr_re = re.compile(r'\b[0-9a-fA-F]{8,16}\b')
56 if options.guest:
57 linux = Addr2line(basedir + '/qemu/vmlinux',
58 basedir + '/qemu/linux/')
59 else:
60 linux = Addr2line(basedir + '/kernel/vmlinux',
61 basedir + '/kernel/linux/')
62 addr2line = Cache(linux)
64 def expand_addr(addr):
65 addr = addr.group(0)
66 result = addr2line.resolve(int(addr, 16))
67 if result:
68 (symbol, file) = result
69 return '%s %s(%s)' % (addr, symbol, file)
70 else:
71 return addr
73 try:
74 for line in sys.stdin:
75 line = addr_re.sub(expand_addr, line)
76 print line,
77 except KeyboardInterrupt:
78 sys.exit()