]>
Commit | Line | Data |
---|---|---|
52ef093a LV |
1 | #!/usr/bin/env python |
2 | # -*- coding: utf-8 -*- | |
3 | ||
4 | """ | |
5 | DTrace/SystemTAP backend. | |
6 | """ | |
7 | ||
8 | __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" | |
9 | __copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>" | |
10 | __license__ = "GPL version 2 or (at your option) any later version" | |
11 | ||
12 | __maintainer__ = "Stefan Hajnoczi" | |
13 | __email__ = "stefanha@linux.vnet.ibm.com" | |
14 | ||
15 | ||
16 | from tracetool import out | |
17 | ||
18 | ||
19 | PROBEPREFIX = None | |
20 | ||
21 | def _probeprefix(): | |
22 | if PROBEPREFIX is None: | |
23 | raise ValueError("you must set PROBEPREFIX") | |
24 | return PROBEPREFIX | |
25 | ||
26 | ||
27 | BINARY = None | |
28 | ||
29 | def _binary(): | |
30 | if BINARY is None: | |
31 | raise ValueError("you must set BINARY") | |
32 | return BINARY | |
33 | ||
34 | ||
35 | def c(events): | |
36 | pass | |
37 | ||
38 | ||
39 | def h(events): | |
40 | out('#include "trace-dtrace.h"', | |
41 | '') | |
42 | ||
43 | for e in events: | |
44 | out('static inline void trace_%(name)s(%(args)s) {', | |
45 | ' QEMU_%(uppername)s(%(argnames)s);', | |
46 | '}', | |
47 | name = e.name, | |
48 | args = e.args, | |
49 | uppername = e.name.upper(), | |
50 | argnames = ", ".join(e.args.names()), | |
51 | ) | |
52 | ||
53 | ||
54 | def d(events): | |
55 | out('provider qemu {') | |
56 | ||
57 | for e in events: | |
58 | args = str(e.args) | |
59 | ||
60 | # DTrace provider syntax expects foo() for empty | |
61 | # params, not foo(void) | |
62 | if args == 'void': | |
63 | args = '' | |
64 | ||
65 | # Define prototype for probe arguments | |
66 | out('', | |
67 | 'probe %(name)s(%(args)s);', | |
68 | name = e.name, | |
69 | args = args, | |
70 | ) | |
71 | ||
72 | out('', | |
73 | '};') | |
74 | ||
75 | ||
76 | def stap(events): | |
77 | for e in events: | |
78 | # Define prototype for probe arguments | |
79 | out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")', | |
80 | '{', | |
81 | probeprefix = _probeprefix(), | |
82 | name = e.name, | |
83 | binary = _binary(), | |
84 | ) | |
85 | ||
86 | i = 1 | |
87 | if len(e.args) > 0: | |
88 | for name in e.args.names(): | |
256a721d | 89 | # Append underscore to reserved keywords |
d8f8a860 | 90 | if name in ('limit', 'in', 'next', 'self', 'function'): |
256a721d SH |
91 | name += '_' |
92 | out(' %s = $arg%d;' % (name, i)) | |
52ef093a LV |
93 | i += 1 |
94 | ||
95 | out('}') | |
96 | ||
97 | out() |