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