1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4"""
5DTrace/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
16from tracetool import out
17
18
19PROBEPREFIX = None
20
21def _probeprefix():
22    if PROBEPREFIX is None:
23        raise ValueError("you must set PROBEPREFIX")
24    return PROBEPREFIX
25
26
27BINARY = None
28
29def _binary():
30    if BINARY is None:
31        raise ValueError("you must set BINARY")
32    return BINARY
33
34
35def c(events):
36    pass
37
38
39def 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
54def 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
76def 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():
89                # Append underscore to reserved keywords
90                if name in ('limit', 'in', 'next', 'self'):
91                    name += '_'
92                out('  %s = $arg%d;' % (name, i))
93                i += 1
94
95        out('}')
96
97    out()
98