1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4""" 5DTrace/SystemTAP backend. 6""" 7 8__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 9__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>" 10__license__ = "GPL version 2 or (at your option) any later version" 11 12__maintainer__ = "Stefan Hajnoczi" 13__email__ = "stefanha@linux.vnet.ibm.com" 14 15 16from tracetool import out 17 18 19PROBEPREFIX = None 20 21def _probeprefix(): 22 if PROBEPREFIX is None: 23 raise ValueError("you must set PROBEPREFIX") 24 return PROBEPREFIX 25 26 27BINARY = None 28 29def _binary(): 30 if BINARY is None: 31 raise ValueError("you must set BINARY") 32 return BINARY 33 34 35def c(events): 36 pass 37 38 39def h(events): 40 out('#include "trace-dtrace.h"', 41 '') 42 43 for e in events: 44 out('static inline void trace_%(name)s(%(args)s) {', 45 ' QEMU_%(uppername)s(%(argnames)s);', 46 '}', 47 name = e.name, 48 args = e.args, 49 uppername = e.name.upper(), 50 argnames = ", ".join(e.args.names()), 51 ) 52 53 54def d(events): 55 out('provider qemu {') 56 57 for e in events: 58 args = str(e.args) 59 60 # DTrace provider syntax expects foo() for empty 61 # params, not foo(void) 62 if args == 'void': 63 args = '' 64 65 # Define prototype for probe arguments 66 out('', 67 'probe %(name)s(%(args)s);', 68 name = e.name, 69 args = args, 70 ) 71 72 out('', 73 '};') 74 75 76def stap(events): 77 for e in events: 78 # Define prototype for probe arguments 79 out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")', 80 '{', 81 probeprefix = _probeprefix(), 82 name = e.name, 83 binary = _binary(), 84 ) 85 86 i = 1 87 if len(e.args) > 0: 88 for name in e.args.names(): 89 # Append underscore to reserved keywords 90 if name in ('limit', 'in', 'next', 'self'): 91 name += '_' 92 out(' %s = $arg%d;' % (name, i)) 93 i += 1 94 95 out('}') 96 97 out() 98