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
19*93fba161SLluís VilanovaPUBLIC = True
20*93fba161SLluís Vilanova
21*93fba161SLluís Vilanova
2252ef093aSLluís VilanovaPROBEPREFIX = None
2352ef093aSLluís Vilanova
2452ef093aSLluís Vilanovadef _probeprefix():
2552ef093aSLluís Vilanova    if PROBEPREFIX is None:
2652ef093aSLluís Vilanova        raise ValueError("you must set PROBEPREFIX")
2752ef093aSLluís Vilanova    return PROBEPREFIX
2852ef093aSLluís Vilanova
2952ef093aSLluís Vilanova
3052ef093aSLluís VilanovaBINARY = None
3152ef093aSLluís Vilanova
3252ef093aSLluís Vilanovadef _binary():
3352ef093aSLluís Vilanova    if BINARY is None:
3452ef093aSLluís Vilanova        raise ValueError("you must set BINARY")
3552ef093aSLluís Vilanova    return BINARY
3652ef093aSLluís Vilanova
3752ef093aSLluís Vilanova
3852ef093aSLluís Vilanovadef c(events):
3952ef093aSLluís Vilanova    pass
4052ef093aSLluís Vilanova
4152ef093aSLluís Vilanova
4252ef093aSLluís Vilanovadef h(events):
43eac236eaSLluís Vilanova    out('#include "trace/generated-tracers-dtrace.h"',
4452ef093aSLluís Vilanova        '')
4552ef093aSLluís Vilanova
4652ef093aSLluís Vilanova    for e in events:
4752ef093aSLluís Vilanova        out('static inline void trace_%(name)s(%(args)s) {',
4852ef093aSLluís Vilanova            '    QEMU_%(uppername)s(%(argnames)s);',
4952ef093aSLluís Vilanova            '}',
5052ef093aSLluís Vilanova            name = e.name,
5152ef093aSLluís Vilanova            args = e.args,
5252ef093aSLluís Vilanova            uppername = e.name.upper(),
5352ef093aSLluís Vilanova            argnames = ", ".join(e.args.names()),
5452ef093aSLluís Vilanova            )
5552ef093aSLluís Vilanova
5652ef093aSLluís Vilanova
5752ef093aSLluís Vilanovadef d(events):
5852ef093aSLluís Vilanova    out('provider qemu {')
5952ef093aSLluís Vilanova
6052ef093aSLluís Vilanova    for e in events:
6152ef093aSLluís Vilanova        args = str(e.args)
6252ef093aSLluís Vilanova
6352ef093aSLluís Vilanova        # DTrace provider syntax expects foo() for empty
6452ef093aSLluís Vilanova        # params, not foo(void)
6552ef093aSLluís Vilanova        if args == 'void':
6652ef093aSLluís Vilanova            args = ''
6752ef093aSLluís Vilanova
6852ef093aSLluís Vilanova        # Define prototype for probe arguments
6952ef093aSLluís Vilanova        out('',
7052ef093aSLluís Vilanova            'probe %(name)s(%(args)s);',
7152ef093aSLluís Vilanova            name = e.name,
7252ef093aSLluís Vilanova            args = args,
7352ef093aSLluís Vilanova            )
7452ef093aSLluís Vilanova
7552ef093aSLluís Vilanova    out('',
7652ef093aSLluís Vilanova        '};')
7752ef093aSLluís Vilanova
7852ef093aSLluís Vilanova
7981dee729SDaniel P. Berrange# Technically 'self' is not used by systemtap yet, but
8081dee729SDaniel P. Berrange# they recommended we keep it in the reserved list anyway
8181dee729SDaniel P. BerrangeRESERVED_WORDS = (
8281dee729SDaniel P. Berrange    'break', 'catch', 'continue', 'delete', 'else', 'for',
8381dee729SDaniel P. Berrange    'foreach', 'function', 'global', 'if', 'in', 'limit',
8481dee729SDaniel P. Berrange    'long', 'next', 'probe', 'return', 'self', 'string',
8581dee729SDaniel P. Berrange    'try', 'while'
8681dee729SDaniel P. Berrange    )
8781dee729SDaniel P. Berrange
8852ef093aSLluís Vilanovadef stap(events):
8952ef093aSLluís Vilanova    for e in events:
9052ef093aSLluís Vilanova        # Define prototype for probe arguments
9152ef093aSLluís Vilanova        out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
9252ef093aSLluís Vilanova            '{',
9352ef093aSLluís Vilanova            probeprefix = _probeprefix(),
9452ef093aSLluís Vilanova            name = e.name,
9552ef093aSLluís Vilanova            binary = _binary(),
9652ef093aSLluís Vilanova            )
9752ef093aSLluís Vilanova
9852ef093aSLluís Vilanova        i = 1
9952ef093aSLluís Vilanova        if len(e.args) > 0:
10052ef093aSLluís Vilanova            for name in e.args.names():
101256a721dSStefan Hajnoczi                # Append underscore to reserved keywords
10281dee729SDaniel P. Berrange                if name in RESERVED_WORDS:
103256a721dSStefan Hajnoczi                    name += '_'
104256a721dSStefan Hajnoczi                out('  %s = $arg%d;' % (name, i))
10552ef093aSLluís Vilanova                i += 1
10652ef093aSLluís Vilanova
10752ef093aSLluís Vilanova        out('}')
10852ef093aSLluís Vilanova
10952ef093aSLluís Vilanova    out()
110