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