152ef093aSLluís Vilanova#!/usr/bin/env python
252ef093aSLluís Vilanova# -*- coding: utf-8 -*-
352ef093aSLluís Vilanova
452ef093aSLluís Vilanova"""
552ef093aSLluís VilanovaDTrace/SystemTAP backend.
652ef093aSLluís Vilanova"""
752ef093aSLluís Vilanova
852ef093aSLluís Vilanova__author__     = "Lluís Vilanova <vilanova@ac.upc.edu>"
952ef093aSLluís Vilanova__copyright__  = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
1052ef093aSLluís Vilanova__license__    = "GPL version 2 or (at your option) any later version"
1152ef093aSLluís Vilanova
1252ef093aSLluís Vilanova__maintainer__ = "Stefan Hajnoczi"
1352ef093aSLluís Vilanova__email__      = "stefanha@linux.vnet.ibm.com"
1452ef093aSLluís Vilanova
1552ef093aSLluís Vilanova
1652ef093aSLluís Vilanovafrom tracetool import out
1752ef093aSLluís Vilanova
1852ef093aSLluís Vilanova
1952ef093aSLluís VilanovaPROBEPREFIX = None
2052ef093aSLluís Vilanova
2152ef093aSLluís Vilanovadef _probeprefix():
2252ef093aSLluís Vilanova    if PROBEPREFIX is None:
2352ef093aSLluís Vilanova        raise ValueError("you must set PROBEPREFIX")
2452ef093aSLluís Vilanova    return PROBEPREFIX
2552ef093aSLluís Vilanova
2652ef093aSLluís Vilanova
2752ef093aSLluís VilanovaBINARY = None
2852ef093aSLluís Vilanova
2952ef093aSLluís Vilanovadef _binary():
3052ef093aSLluís Vilanova    if BINARY is None:
3152ef093aSLluís Vilanova        raise ValueError("you must set BINARY")
3252ef093aSLluís Vilanova    return BINARY
3352ef093aSLluís Vilanova
3452ef093aSLluís Vilanova
3552ef093aSLluís Vilanovadef c(events):
3652ef093aSLluís Vilanova    pass
3752ef093aSLluís Vilanova
3852ef093aSLluís Vilanova
3952ef093aSLluís Vilanovadef h(events):
4052ef093aSLluís Vilanova    out('#include "trace-dtrace.h"',
4152ef093aSLluís Vilanova        '')
4252ef093aSLluís Vilanova
4352ef093aSLluís Vilanova    for e in events:
4452ef093aSLluís Vilanova        out('static inline void trace_%(name)s(%(args)s) {',
4552ef093aSLluís Vilanova            '    QEMU_%(uppername)s(%(argnames)s);',
4652ef093aSLluís Vilanova            '}',
4752ef093aSLluís Vilanova            name = e.name,
4852ef093aSLluís Vilanova            args = e.args,
4952ef093aSLluís Vilanova            uppername = e.name.upper(),
5052ef093aSLluís Vilanova            argnames = ", ".join(e.args.names()),
5152ef093aSLluís Vilanova            )
5252ef093aSLluís Vilanova
5352ef093aSLluís Vilanova
5452ef093aSLluís Vilanovadef d(events):
5552ef093aSLluís Vilanova    out('provider qemu {')
5652ef093aSLluís Vilanova
5752ef093aSLluís Vilanova    for e in events:
5852ef093aSLluís Vilanova        args = str(e.args)
5952ef093aSLluís Vilanova
6052ef093aSLluís Vilanova        # DTrace provider syntax expects foo() for empty
6152ef093aSLluís Vilanova        # params, not foo(void)
6252ef093aSLluís Vilanova        if args == 'void':
6352ef093aSLluís Vilanova            args = ''
6452ef093aSLluís Vilanova
6552ef093aSLluís Vilanova        # Define prototype for probe arguments
6652ef093aSLluís Vilanova        out('',
6752ef093aSLluís Vilanova            'probe %(name)s(%(args)s);',
6852ef093aSLluís Vilanova            name = e.name,
6952ef093aSLluís Vilanova            args = args,
7052ef093aSLluís Vilanova            )
7152ef093aSLluís Vilanova
7252ef093aSLluís Vilanova    out('',
7352ef093aSLluís Vilanova        '};')
7452ef093aSLluís Vilanova
7552ef093aSLluís Vilanova
76*81dee729SDaniel P. Berrange# Technically 'self' is not used by systemtap yet, but
77*81dee729SDaniel P. Berrange# they recommended we keep it in the reserved list anyway
78*81dee729SDaniel P. BerrangeRESERVED_WORDS = (
79*81dee729SDaniel P. Berrange    'break', 'catch', 'continue', 'delete', 'else', 'for',
80*81dee729SDaniel P. Berrange    'foreach', 'function', 'global', 'if', 'in', 'limit',
81*81dee729SDaniel P. Berrange    'long', 'next', 'probe', 'return', 'self', 'string',
82*81dee729SDaniel P. Berrange    'try', 'while'
83*81dee729SDaniel P. Berrange    )
84*81dee729SDaniel P. Berrange
8552ef093aSLluís Vilanovadef stap(events):
8652ef093aSLluís Vilanova    for e in events:
8752ef093aSLluís Vilanova        # Define prototype for probe arguments
8852ef093aSLluís Vilanova        out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
8952ef093aSLluís Vilanova            '{',
9052ef093aSLluís Vilanova            probeprefix = _probeprefix(),
9152ef093aSLluís Vilanova            name = e.name,
9252ef093aSLluís Vilanova            binary = _binary(),
9352ef093aSLluís Vilanova            )
9452ef093aSLluís Vilanova
9552ef093aSLluís Vilanova        i = 1
9652ef093aSLluís Vilanova        if len(e.args) > 0:
9752ef093aSLluís Vilanova            for name in e.args.names():
98256a721dSStefan Hajnoczi                # Append underscore to reserved keywords
99*81dee729SDaniel P. Berrange                if name in RESERVED_WORDS:
100256a721dSStefan Hajnoczi                    name += '_'
101256a721dSStefan Hajnoczi                out('  %s = $arg%d;' % (name, i))
10252ef093aSLluís Vilanova                i += 1
10352ef093aSLluís Vilanova
10452ef093aSLluís Vilanova        out('}')
10552ef093aSLluís Vilanova
10652ef093aSLluís Vilanova    out()
107