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