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):
40*eac236eaSLluís Vilanova    out('#include "trace/generated-tracers-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
7681dee729SDaniel P. Berrange# Technically 'self' is not used by systemtap yet, but
7781dee729SDaniel P. Berrange# they recommended we keep it in the reserved list anyway
7881dee729SDaniel P. BerrangeRESERVED_WORDS = (
7981dee729SDaniel P. Berrange    'break', 'catch', 'continue', 'delete', 'else', 'for',
8081dee729SDaniel P. Berrange    'foreach', 'function', 'global', 'if', 'in', 'limit',
8181dee729SDaniel P. Berrange    'long', 'next', 'probe', 'return', 'self', 'string',
8281dee729SDaniel P. Berrange    'try', 'while'
8381dee729SDaniel P. Berrange    )
8481dee729SDaniel 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
9981dee729SDaniel 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