]>
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 | ||
81dee729 DB |
76 | # Technically 'self' is not used by systemtap yet, but |
77 | # they recommended we keep it in the reserved list anyway | |
78 | RESERVED_WORDS = ( | |
79 | 'break', 'catch', 'continue', 'delete', 'else', 'for', | |
80 | 'foreach', 'function', 'global', 'if', 'in', 'limit', | |
81 | 'long', 'next', 'probe', 'return', 'self', 'string', | |
82 | 'try', 'while' | |
83 | ) | |
84 | ||
52ef093a LV |
85 | def stap(events): |
86 | for e in events: | |
87 | # Define prototype for probe arguments | |
88 | out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")', | |
89 | '{', | |
90 | probeprefix = _probeprefix(), | |
91 | name = e.name, | |
92 | binary = _binary(), | |
93 | ) | |
94 | ||
95 | i = 1 | |
96 | if len(e.args) > 0: | |
97 | for name in e.args.names(): | |
256a721d | 98 | # Append underscore to reserved keywords |
81dee729 | 99 | if name in RESERVED_WORDS: |
256a721d SH |
100 | name += '_' |
101 | out(' %s = $arg%d;' % (name, i)) | |
52ef093a LV |
102 | i += 1 |
103 | ||
104 | out('}') | |
105 | ||
106 | out() |