13f8b112dSStefan Hajnoczi# -*- coding: utf-8 -*- 23f8b112dSStefan Hajnoczi 33f8b112dSStefan Hajnoczi""" 43f8b112dSStefan HajnocziGenerate .stp file that outputs simpletrace binary traces (DTrace with SystemTAP only). 53f8b112dSStefan Hajnoczi""" 63f8b112dSStefan Hajnoczi 73f8b112dSStefan Hajnoczi__author__ = "Stefan Hajnoczi <redhat.com>" 83f8b112dSStefan Hajnoczi__copyright__ = "Copyright (C) 2014, Red Hat, Inc." 93f8b112dSStefan Hajnoczi__license__ = "GPL version 2 or (at your option) any later version" 103f8b112dSStefan Hajnoczi 113f8b112dSStefan Hajnoczi__maintainer__ = "Stefan Hajnoczi" 123f8b112dSStefan Hajnoczi__email__ = "stefanha@redhat.com" 133f8b112dSStefan Hajnoczi 143f8b112dSStefan Hajnoczi 153f8b112dSStefan Hajnoczifrom tracetool import out 16*9ab5a24bSPhilippe Mathieu-Daudéfrom tracetool.backend.dtrace import probeprefix 173f8b112dSStefan Hajnoczifrom tracetool.backend.simple import is_string 183f8b112dSStefan Hajnoczifrom tracetool.format.stap import stap_escape 193f8b112dSStefan Hajnoczi 20ea1ff54fSDaniel P. Berrangedef global_var_name(name): 21ea1ff54fSDaniel P. Berrange return probeprefix().replace(".", "_") + "_" + name 223f8b112dSStefan Hajnoczi 2380dd5c49SDaniel P. Berrangedef generate(events, backend, group): 243f8b112dSStefan Hajnoczi out('/* This file is autogenerated by tracetool, do not edit. */', 25d6b76d68SStefan Hajnoczi '') 263f8b112dSStefan Hajnoczi 273f8b112dSStefan Hajnoczi for event_id, e in enumerate(events): 283f8b112dSStefan Hajnoczi if 'disable' in e.properties: 293f8b112dSStefan Hajnoczi continue 303f8b112dSStefan Hajnoczi 313f8b112dSStefan Hajnoczi out('probe %(probeprefix)s.simpletrace.%(name)s = %(probeprefix)s.%(name)s ?', 323f8b112dSStefan Hajnoczi '{', 333f8b112dSStefan Hajnoczi probeprefix=probeprefix(), 343f8b112dSStefan Hajnoczi name=e.name) 353f8b112dSStefan Hajnoczi 363f8b112dSStefan Hajnoczi # Calculate record size 373f8b112dSStefan Hajnoczi sizes = ['24'] # sizeof(TraceRecord) 383f8b112dSStefan Hajnoczi for type_, name in e.args: 393f8b112dSStefan Hajnoczi name = stap_escape(name) 403f8b112dSStefan Hajnoczi if is_string(type_): 413f8b112dSStefan Hajnoczi out(' try {', 423f8b112dSStefan Hajnoczi ' arg%(name)s_str = %(name)s ? user_string_n(%(name)s, 512) : "<null>"', 433f8b112dSStefan Hajnoczi ' } catch {}', 443f8b112dSStefan Hajnoczi ' arg%(name)s_len = strlen(arg%(name)s_str)', 453f8b112dSStefan Hajnoczi name=name) 463f8b112dSStefan Hajnoczi sizes.append('4 + arg%s_len' % name) 473f8b112dSStefan Hajnoczi else: 483f8b112dSStefan Hajnoczi sizes.append('8') 493f8b112dSStefan Hajnoczi sizestr = ' + '.join(sizes) 503f8b112dSStefan Hajnoczi 513f8b112dSStefan Hajnoczi # Generate format string and value pairs for record header and arguments 52d6b76d68SStefan Hajnoczi fields = [('8b', str(event_id)), 533f8b112dSStefan Hajnoczi ('8b', 'gettimeofday_ns()'), 543f8b112dSStefan Hajnoczi ('4b', sizestr), 553f8b112dSStefan Hajnoczi ('4b', 'pid()')] 563f8b112dSStefan Hajnoczi for type_, name in e.args: 573f8b112dSStefan Hajnoczi name = stap_escape(name) 583f8b112dSStefan Hajnoczi if is_string(type_): 593f8b112dSStefan Hajnoczi fields.extend([('4b', 'arg%s_len' % name), 603f8b112dSStefan Hajnoczi ('.*s', 'arg%s_len, arg%s_str' % (name, name))]) 613f8b112dSStefan Hajnoczi else: 623f8b112dSStefan Hajnoczi fields.append(('8b', name)) 633f8b112dSStefan Hajnoczi 643f8b112dSStefan Hajnoczi # Emit the entire record in a single SystemTap printf() 653f8b112dSStefan Hajnoczi fmt_str = '%'.join(fmt for fmt, _ in fields) 663f8b112dSStefan Hajnoczi arg_str = ', '.join(arg for _, arg in fields) 677f1b588fSDaniel P. Berrange out(' printf("%%8b%%%(fmt_str)s", 1, %(arg_str)s)', 683f8b112dSStefan Hajnoczi fmt_str=fmt_str, arg_str=arg_str) 693f8b112dSStefan Hajnoczi 703f8b112dSStefan Hajnoczi out('}') 713f8b112dSStefan Hajnoczi 723f8b112dSStefan Hajnoczi out() 73