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
7652ef093aSLluís Vilanovadef stap(events):
7752ef093aSLluís Vilanova    for e in events:
7852ef093aSLluís Vilanova        # Define prototype for probe arguments
7952ef093aSLluís Vilanova        out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
8052ef093aSLluís Vilanova            '{',
8152ef093aSLluís Vilanova            probeprefix = _probeprefix(),
8252ef093aSLluís Vilanova            name = e.name,
8352ef093aSLluís Vilanova            binary = _binary(),
8452ef093aSLluís Vilanova            )
8552ef093aSLluís Vilanova
8652ef093aSLluís Vilanova        i = 1
8752ef093aSLluís Vilanova        if len(e.args) > 0:
8852ef093aSLluís Vilanova            for name in e.args.names():
89*256a721dSStefan Hajnoczi                # Append underscore to reserved keywords
90*256a721dSStefan Hajnoczi                if name in ('limit', 'in', 'next', 'self'):
91*256a721dSStefan Hajnoczi                    name += '_'
92*256a721dSStefan Hajnoczi                out('  %s = $arg%d;' % (name, i))
9352ef093aSLluís Vilanova                i += 1
9452ef093aSLluís Vilanova
9552ef093aSLluís Vilanova        out('}')
9652ef093aSLluís Vilanova
9752ef093aSLluís Vilanova    out()
98