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