#include <event-parse.h>

enum tep_func_arg_type {

typedef unsigned long long (*tep_func_handler)(struct trace_seq *s, unsigned long long *args);

int tep_register_print_function(struct tep_handle *tep, tep_func_handler func, enum tep_func_arg_type ret_type, char *name, );
int tep_unregister_print_function(struct tep_handle *tep, tep_func_handler func, char *name);


Some events may have helper functions in the print format arguments. This allows a plugin to dynamically create a way to process one of these functions.

The tep_register_print_function() registers such helper function. The tep argument is the trace event parser context. The func argument is a pointer to the helper function. The ret_type argument is the return type of the helper function, value from the tep_func_arg_type enum. The name is the name of the helper function, as seen in the print format arguments. The is a variable list of tep_func_arg_type enums, the func function arguments. This list must end with TEP_FUNC_ARG_VOID. See EXAMPLE section.

The tep_unregister_print_function() unregisters a helper function, previously registered with tep_register_print_function(). The tep argument is the trace event parser context. The func and name arguments are the same, used when the helper function was registered.

The tep_func_handler is the type of the helper function. The s argument is the trace sequence, it can be used to create a custom string. The args is a list of arguments, defined when the helper function was registered.


The tep_register_print_function() function returns 0 in case of success. In case of an error, TEP_ERRNO_… code is returned.

The tep_unregister_print_function() returns 0 in case of success, or -1 in case of an error.


Some events have internal functions calls, that appear in the print format output. For example "tracefs/events/i915/g4x_wm/format" has:

print fmt: "pipe %c, frame=%u, scanline=%u, wm %d/%d/%d, sr %s/%d/%d/%d, hpll %s/%d/%d/%d, fbc %s",
            ((REC->pipe) + 'A'), REC->frame, REC->scanline, REC->primary,
            REC->sprite, REC->cursor, yesno(REC->cxsr), REC->sr_plane,
            REC->sr_cursor, REC->sr_fbc, yesno(REC->hpll), REC->hpll_plane,
            REC->hpll_cursor, REC->hpll_fbc, yesno(REC->fbc)

Notice the call to function yesno() in the print arguments. In the kernel context, this function has the following implementation:

static const char *yesno(int x)
        static const char *yes = "yes";
        static const char *no = "no";

        return x ? yes : no;

The user space event parser has no idea how to handle this yesno() function. The tep_register_print_function() API can be used to register a user space helper function, mapped to the kernel’s yesno():

#include <event-parse.h>
#include <trace-seq.h>
struct tep_handle *tep = tep_alloc();
static const char *yes_no_helper(int x)
        return x ? "yes" : "no";
        if ( tep_register_print_function(tep,
                                    TEP_FUNC_ARG_VOID) != 0) {
                /* Failed to register yes_no_helper function */

   Now, when the event parser encounters this yesno() function, it will know
   how to handle it.
        if (tep_unregister_print_function(tep, yes_no_helper, "yesno") != 0) {
                /* Failed to unregister yes_no_helper function */


        Header file to include in order to have access to the library APIs.
        Header file to include in order to have access to trace sequences
        related APIs. Trace sequences are used to allow a function to call
        several other functions to create a string of data to use.
        Linker switch to add when building a program that uses the library.


libtraceevent(3), trace-cmd(1)


Steven Rostedt <>, author of libtraceevent.
Tzvetomir Stoyanov <>, author of this man page.



libtraceevent is Free Software licensed under the GNU LGPL 2.1