cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

event-parse.c (167627B)


      1// SPDX-License-Identifier: LGPL-2.1
      2/*
      3 * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
      4 *
      5 *
      6 *  The parts for function graph printing was taken and modified from the
      7 *  Linux Kernel that were written by
      8 *    - Copyright (C) 2009  Frederic Weisbecker,
      9 *  Frederic Weisbecker gave his permission to relicense the code to
     10 *  the Lesser General Public License.
     11 */
     12#include <inttypes.h>
     13#include <stdio.h>
     14#include <stdlib.h>
     15#include <string.h>
     16#include <stdarg.h>
     17#include <ctype.h>
     18#include <errno.h>
     19#include <stdint.h>
     20#include <limits.h>
     21#include <linux/time64.h>
     22
     23#include <netinet/in.h>
     24#include "event-parse.h"
     25
     26#include "event-parse-local.h"
     27#include "event-utils.h"
     28#include "trace-seq.h"
     29
     30static const char *input_buf;
     31static unsigned long long input_buf_ptr;
     32static unsigned long long input_buf_siz;
     33
     34static int is_flag_field;
     35static int is_symbolic_field;
     36
     37static int show_warning = 1;
     38
     39#define do_warning(fmt, ...)				\
     40	do {						\
     41		if (show_warning)			\
     42			warning(fmt, ##__VA_ARGS__);	\
     43	} while (0)
     44
     45#define do_warning_event(event, fmt, ...)			\
     46	do {							\
     47		if (!show_warning)				\
     48			continue;				\
     49								\
     50		if (event)					\
     51			warning("[%s:%s] " fmt, event->system,	\
     52				event->name, ##__VA_ARGS__);	\
     53		else						\
     54			warning(fmt, ##__VA_ARGS__);		\
     55	} while (0)
     56
     57/**
     58 * init_input_buf - init buffer for parsing
     59 * @buf: buffer to parse
     60 * @size: the size of the buffer
     61 *
     62 * Initializes the internal buffer that tep_read_token() will parse.
     63 */
     64__hidden void init_input_buf(const char *buf, unsigned long long size)
     65{
     66	input_buf = buf;
     67	input_buf_siz = size;
     68	input_buf_ptr = 0;
     69}
     70
     71__hidden const char *get_input_buf(void)
     72{
     73	return input_buf;
     74}
     75
     76__hidden unsigned long long get_input_buf_ptr(void)
     77{
     78	return input_buf_ptr;
     79}
     80
     81struct event_handler {
     82	struct event_handler		*next;
     83	int				id;
     84	const char			*sys_name;
     85	const char			*event_name;
     86	tep_event_handler_func		func;
     87	void				*context;
     88};
     89
     90struct func_params {
     91	struct func_params	*next;
     92	enum tep_func_arg_type	type;
     93};
     94
     95struct tep_function_handler {
     96	struct tep_function_handler	*next;
     97	enum tep_func_arg_type		ret_type;
     98	char				*name;
     99	tep_func_handler		func;
    100	struct func_params		*params;
    101	int				nr_args;
    102};
    103
    104static unsigned long long
    105process_defined_func(struct trace_seq *s, void *data, int size,
    106		     struct tep_event *event, struct tep_print_arg *arg);
    107
    108static void free_func_handle(struct tep_function_handler *func);
    109
    110void breakpoint(void)
    111{
    112	static int x;
    113	x++;
    114}
    115
    116static struct tep_print_arg *alloc_arg(void)
    117{
    118	return calloc(1, sizeof(struct tep_print_arg));
    119}
    120
    121struct tep_cmdline {
    122	char *comm;
    123	int pid;
    124};
    125
    126static int cmdline_cmp(const void *a, const void *b)
    127{
    128	const struct tep_cmdline *ca = a;
    129	const struct tep_cmdline *cb = b;
    130
    131	if (ca->pid < cb->pid)
    132		return -1;
    133	if (ca->pid > cb->pid)
    134		return 1;
    135
    136	return 0;
    137}
    138
    139/* Looking for where to place the key */
    140static int cmdline_slot_cmp(const void *a, const void *b)
    141{
    142	const struct tep_cmdline *ca = a;
    143	const struct tep_cmdline *cb = b;
    144	const struct tep_cmdline *cb1 = cb + 1;
    145
    146	if (ca->pid < cb->pid)
    147		return -1;
    148
    149	if (ca->pid > cb->pid) {
    150		if (ca->pid <= cb1->pid)
    151			return 0;
    152		return 1;
    153	}
    154
    155	return 0;
    156}
    157
    158struct cmdline_list {
    159	struct cmdline_list	*next;
    160	char			*comm;
    161	int			pid;
    162};
    163
    164static int cmdline_init(struct tep_handle *tep)
    165{
    166	struct cmdline_list *cmdlist = tep->cmdlist;
    167	struct cmdline_list *item;
    168	struct tep_cmdline *cmdlines;
    169	int i;
    170
    171	cmdlines = malloc(sizeof(*cmdlines) * tep->cmdline_count);
    172	if (!cmdlines)
    173		return -1;
    174
    175	i = 0;
    176	while (cmdlist) {
    177		cmdlines[i].pid = cmdlist->pid;
    178		cmdlines[i].comm = cmdlist->comm;
    179		i++;
    180		item = cmdlist;
    181		cmdlist = cmdlist->next;
    182		free(item);
    183	}
    184
    185	qsort(cmdlines, tep->cmdline_count, sizeof(*cmdlines), cmdline_cmp);
    186
    187	tep->cmdlines = cmdlines;
    188	tep->cmdlist = NULL;
    189
    190	return 0;
    191}
    192
    193static const char *find_cmdline(struct tep_handle *tep, int pid)
    194{
    195	const struct tep_cmdline *comm;
    196	struct tep_cmdline key;
    197
    198	if (!pid)
    199		return "<idle>";
    200
    201	if (!tep->cmdlines && cmdline_init(tep))
    202		return "<not enough memory for cmdlines!>";
    203
    204	key.pid = pid;
    205
    206	comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
    207		       sizeof(*tep->cmdlines), cmdline_cmp);
    208
    209	if (comm)
    210		return comm->comm;
    211	return "<...>";
    212}
    213
    214/**
    215 * tep_is_pid_registered - return if a pid has a cmdline registered
    216 * @tep: a handle to the trace event parser context
    217 * @pid: The pid to check if it has a cmdline registered with.
    218 *
    219 * Returns true if the pid has a cmdline mapped to it
    220 * false otherwise.
    221 */
    222bool tep_is_pid_registered(struct tep_handle *tep, int pid)
    223{
    224	const struct tep_cmdline *comm;
    225	struct tep_cmdline key;
    226
    227	if (!pid)
    228		return true;
    229
    230	if (!tep->cmdlines && cmdline_init(tep))
    231		return false;
    232
    233	key.pid = pid;
    234
    235	comm = bsearch(&key, tep->cmdlines, tep->cmdline_count,
    236		       sizeof(*tep->cmdlines), cmdline_cmp);
    237
    238	if (comm)
    239		return true;
    240	return false;
    241}
    242
    243/*
    244 * If the command lines have been converted to an array, then
    245 * we must add this pid. This is much slower than when cmdlines
    246 * are added before the array is initialized.
    247 */
    248static int add_new_comm(struct tep_handle *tep,
    249			const char *comm, int pid, bool override)
    250{
    251	struct tep_cmdline *cmdlines = tep->cmdlines;
    252	struct tep_cmdline *cmdline;
    253	struct tep_cmdline key;
    254	char *new_comm;
    255	int cnt;
    256
    257	if (!pid)
    258		return 0;
    259
    260	/* avoid duplicates */
    261	key.pid = pid;
    262
    263	cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count,
    264			  sizeof(*tep->cmdlines), cmdline_cmp);
    265	if (cmdline) {
    266		if (!override) {
    267			errno = EEXIST;
    268			return -1;
    269		}
    270		new_comm = strdup(comm);
    271		if (!new_comm) {
    272			errno = ENOMEM;
    273			return -1;
    274		}
    275		free(cmdline->comm);
    276		cmdline->comm = new_comm;
    277
    278		return 0;
    279	}
    280
    281	cmdlines = realloc(cmdlines, sizeof(*cmdlines) * (tep->cmdline_count + 1));
    282	if (!cmdlines) {
    283		errno = ENOMEM;
    284		return -1;
    285	}
    286	tep->cmdlines = cmdlines;
    287
    288	key.comm = strdup(comm);
    289	if (!key.comm) {
    290		errno = ENOMEM;
    291		return -1;
    292	}
    293
    294	if (!tep->cmdline_count) {
    295		/* no entries yet */
    296		tep->cmdlines[0] = key;
    297		tep->cmdline_count++;
    298		return 0;
    299	}
    300
    301	/* Now find where we want to store the new cmdline */
    302	cmdline = bsearch(&key, tep->cmdlines, tep->cmdline_count - 1,
    303			  sizeof(*tep->cmdlines), cmdline_slot_cmp);
    304
    305	cnt = tep->cmdline_count;
    306	if (cmdline) {
    307		/* cmdline points to the one before the spot we want */
    308		cmdline++;
    309		cnt -= cmdline - tep->cmdlines;
    310
    311	} else {
    312		/* The new entry is either before or after the list */
    313		if (key.pid > tep->cmdlines[tep->cmdline_count - 1].pid) {
    314			tep->cmdlines[tep->cmdline_count++] = key;
    315			return 0;
    316		}
    317		cmdline = &tep->cmdlines[0];
    318	}
    319	memmove(cmdline + 1, cmdline, (cnt * sizeof(*cmdline)));
    320	*cmdline = key;
    321
    322	tep->cmdline_count++;
    323
    324	return 0;
    325}
    326
    327static int _tep_register_comm(struct tep_handle *tep,
    328			      const char *comm, int pid, bool override)
    329{
    330	struct cmdline_list *item;
    331
    332	if (tep->cmdlines)
    333		return add_new_comm(tep, comm, pid, override);
    334
    335	item = malloc(sizeof(*item));
    336	if (!item)
    337		return -1;
    338
    339	if (comm)
    340		item->comm = strdup(comm);
    341	else
    342		item->comm = strdup("<...>");
    343	if (!item->comm) {
    344		free(item);
    345		return -1;
    346	}
    347	item->pid = pid;
    348	item->next = tep->cmdlist;
    349
    350	tep->cmdlist = item;
    351	tep->cmdline_count++;
    352
    353	return 0;
    354}
    355
    356/**
    357 * tep_register_comm - register a pid / comm mapping
    358 * @tep: a handle to the trace event parser context
    359 * @comm: the command line to register
    360 * @pid: the pid to map the command line to
    361 *
    362 * This adds a mapping to search for command line names with
    363 * a given pid. The comm is duplicated. If a command with the same pid
    364 * already exist, -1 is returned and errno is set to EEXIST
    365 */
    366int tep_register_comm(struct tep_handle *tep, const char *comm, int pid)
    367{
    368	return _tep_register_comm(tep, comm, pid, false);
    369}
    370
    371/**
    372 * tep_override_comm - register a pid / comm mapping
    373 * @tep: a handle to the trace event parser context
    374 * @comm: the command line to register
    375 * @pid: the pid to map the command line to
    376 *
    377 * This adds a mapping to search for command line names with
    378 * a given pid. The comm is duplicated. If a command with the same pid
    379 * already exist, the command string is udapted with the new one
    380 */
    381int tep_override_comm(struct tep_handle *tep, const char *comm, int pid)
    382{
    383	if (!tep->cmdlines && cmdline_init(tep)) {
    384		errno = ENOMEM;
    385		return -1;
    386	}
    387	return _tep_register_comm(tep, comm, pid, true);
    388}
    389
    390struct func_map {
    391	unsigned long long		addr;
    392	char				*func;
    393	char				*mod;
    394};
    395
    396struct func_list {
    397	struct func_list	*next;
    398	unsigned long long	addr;
    399	char			*func;
    400	char			*mod;
    401};
    402
    403static int func_cmp(const void *a, const void *b)
    404{
    405	const struct func_map *fa = a;
    406	const struct func_map *fb = b;
    407
    408	if (fa->addr < fb->addr)
    409		return -1;
    410	if (fa->addr > fb->addr)
    411		return 1;
    412
    413	return 0;
    414}
    415
    416/*
    417 * We are searching for a record in between, not an exact
    418 * match.
    419 */
    420static int func_bcmp(const void *a, const void *b)
    421{
    422	const struct func_map *fa = a;
    423	const struct func_map *fb = b;
    424
    425	if ((fa->addr == fb->addr) ||
    426
    427	    (fa->addr > fb->addr &&
    428	     fa->addr < (fb+1)->addr))
    429		return 0;
    430
    431	if (fa->addr < fb->addr)
    432		return -1;
    433
    434	return 1;
    435}
    436
    437static int func_map_init(struct tep_handle *tep)
    438{
    439	struct func_list *funclist;
    440	struct func_list *item;
    441	struct func_map *func_map;
    442	int i;
    443
    444	func_map = malloc(sizeof(*func_map) * (tep->func_count + 1));
    445	if (!func_map)
    446		return -1;
    447
    448	funclist = tep->funclist;
    449
    450	i = 0;
    451	while (funclist) {
    452		func_map[i].func = funclist->func;
    453		func_map[i].addr = funclist->addr;
    454		func_map[i].mod = funclist->mod;
    455		i++;
    456		item = funclist;
    457		funclist = funclist->next;
    458		free(item);
    459	}
    460
    461	qsort(func_map, tep->func_count, sizeof(*func_map), func_cmp);
    462
    463	/*
    464	 * Add a special record at the end.
    465	 */
    466	func_map[tep->func_count].func = NULL;
    467	func_map[tep->func_count].addr = 0;
    468	func_map[tep->func_count].mod = NULL;
    469
    470	tep->func_map = func_map;
    471	tep->funclist = NULL;
    472
    473	return 0;
    474}
    475
    476static struct func_map *
    477__find_func(struct tep_handle *tep, unsigned long long addr)
    478{
    479	struct func_map *func;
    480	struct func_map key;
    481
    482	if (!tep->func_map)
    483		func_map_init(tep);
    484
    485	key.addr = addr;
    486
    487	func = bsearch(&key, tep->func_map, tep->func_count,
    488		       sizeof(*tep->func_map), func_bcmp);
    489
    490	return func;
    491}
    492
    493struct func_resolver {
    494	tep_func_resolver_t	*func;
    495	void			*priv;
    496	struct func_map		map;
    497};
    498
    499/**
    500 * tep_set_function_resolver - set an alternative function resolver
    501 * @tep: a handle to the trace event parser context
    502 * @resolver: function to be used
    503 * @priv: resolver function private state.
    504 *
    505 * Some tools may have already a way to resolve kernel functions, allow them to
    506 * keep using it instead of duplicating all the entries inside tep->funclist.
    507 */
    508int tep_set_function_resolver(struct tep_handle *tep,
    509			      tep_func_resolver_t *func, void *priv)
    510{
    511	struct func_resolver *resolver = malloc(sizeof(*resolver));
    512
    513	if (resolver == NULL)
    514		return -1;
    515
    516	resolver->func = func;
    517	resolver->priv = priv;
    518
    519	free(tep->func_resolver);
    520	tep->func_resolver = resolver;
    521
    522	return 0;
    523}
    524
    525/**
    526 * tep_reset_function_resolver - reset alternative function resolver
    527 * @tep: a handle to the trace event parser context
    528 *
    529 * Stop using whatever alternative resolver was set, use the default
    530 * one instead.
    531 */
    532void tep_reset_function_resolver(struct tep_handle *tep)
    533{
    534	free(tep->func_resolver);
    535	tep->func_resolver = NULL;
    536}
    537
    538static struct func_map *
    539find_func(struct tep_handle *tep, unsigned long long addr)
    540{
    541	struct func_map *map;
    542
    543	if (!tep->func_resolver)
    544		return __find_func(tep, addr);
    545
    546	map = &tep->func_resolver->map;
    547	map->mod  = NULL;
    548	map->addr = addr;
    549	map->func = tep->func_resolver->func(tep->func_resolver->priv,
    550					     &map->addr, &map->mod);
    551	if (map->func == NULL)
    552		return NULL;
    553
    554	return map;
    555}
    556
    557/**
    558 * tep_find_function - find a function by a given address
    559 * @tep: a handle to the trace event parser context
    560 * @addr: the address to find the function with
    561 *
    562 * Returns a pointer to the function stored that has the given
    563 * address. Note, the address does not have to be exact, it
    564 * will select the function that would contain the address.
    565 */
    566const char *tep_find_function(struct tep_handle *tep, unsigned long long addr)
    567{
    568	struct func_map *map;
    569
    570	map = find_func(tep, addr);
    571	if (!map)
    572		return NULL;
    573
    574	return map->func;
    575}
    576
    577/**
    578 * tep_find_function_address - find a function address by a given address
    579 * @tep: a handle to the trace event parser context
    580 * @addr: the address to find the function with
    581 *
    582 * Returns the address the function starts at. This can be used in
    583 * conjunction with tep_find_function to print both the function
    584 * name and the function offset.
    585 */
    586unsigned long long
    587tep_find_function_address(struct tep_handle *tep, unsigned long long addr)
    588{
    589	struct func_map *map;
    590
    591	map = find_func(tep, addr);
    592	if (!map)
    593		return 0;
    594
    595	return map->addr;
    596}
    597
    598/**
    599 * tep_register_function - register a function with a given address
    600 * @tep: a handle to the trace event parser context
    601 * @function: the function name to register
    602 * @addr: the address the function starts at
    603 * @mod: the kernel module the function may be in (NULL for none)
    604 *
    605 * This registers a function name with an address and module.
    606 * The @func passed in is duplicated.
    607 */
    608int tep_register_function(struct tep_handle *tep, char *func,
    609			  unsigned long long addr, char *mod)
    610{
    611	struct func_list *item = malloc(sizeof(*item));
    612
    613	if (!item)
    614		return -1;
    615
    616	item->next = tep->funclist;
    617	item->func = strdup(func);
    618	if (!item->func)
    619		goto out_free;
    620
    621	if (mod) {
    622		item->mod = strdup(mod);
    623		if (!item->mod)
    624			goto out_free_func;
    625	} else
    626		item->mod = NULL;
    627	item->addr = addr;
    628
    629	tep->funclist = item;
    630	tep->func_count++;
    631
    632	return 0;
    633
    634out_free_func:
    635	free(item->func);
    636	item->func = NULL;
    637out_free:
    638	free(item);
    639	errno = ENOMEM;
    640	return -1;
    641}
    642
    643/**
    644 * tep_print_funcs - print out the stored functions
    645 * @tep: a handle to the trace event parser context
    646 *
    647 * This prints out the stored functions.
    648 */
    649void tep_print_funcs(struct tep_handle *tep)
    650{
    651	int i;
    652
    653	if (!tep->func_map)
    654		func_map_init(tep);
    655
    656	for (i = 0; i < (int)tep->func_count; i++) {
    657		printf("%016llx %s",
    658		       tep->func_map[i].addr,
    659		       tep->func_map[i].func);
    660		if (tep->func_map[i].mod)
    661			printf(" [%s]\n", tep->func_map[i].mod);
    662		else
    663			printf("\n");
    664	}
    665}
    666
    667struct printk_map {
    668	unsigned long long		addr;
    669	char				*printk;
    670};
    671
    672struct printk_list {
    673	struct printk_list	*next;
    674	unsigned long long	addr;
    675	char			*printk;
    676};
    677
    678static int printk_cmp(const void *a, const void *b)
    679{
    680	const struct printk_map *pa = a;
    681	const struct printk_map *pb = b;
    682
    683	if (pa->addr < pb->addr)
    684		return -1;
    685	if (pa->addr > pb->addr)
    686		return 1;
    687
    688	return 0;
    689}
    690
    691static int printk_map_init(struct tep_handle *tep)
    692{
    693	struct printk_list *printklist;
    694	struct printk_list *item;
    695	struct printk_map *printk_map;
    696	int i;
    697
    698	printk_map = malloc(sizeof(*printk_map) * (tep->printk_count + 1));
    699	if (!printk_map)
    700		return -1;
    701
    702	printklist = tep->printklist;
    703
    704	i = 0;
    705	while (printklist) {
    706		printk_map[i].printk = printklist->printk;
    707		printk_map[i].addr = printklist->addr;
    708		i++;
    709		item = printklist;
    710		printklist = printklist->next;
    711		free(item);
    712	}
    713
    714	qsort(printk_map, tep->printk_count, sizeof(*printk_map), printk_cmp);
    715
    716	tep->printk_map = printk_map;
    717	tep->printklist = NULL;
    718
    719	return 0;
    720}
    721
    722static struct printk_map *
    723find_printk(struct tep_handle *tep, unsigned long long addr)
    724{
    725	struct printk_map *printk;
    726	struct printk_map key;
    727
    728	if (!tep->printk_map && printk_map_init(tep))
    729		return NULL;
    730
    731	key.addr = addr;
    732
    733	printk = bsearch(&key, tep->printk_map, tep->printk_count,
    734			 sizeof(*tep->printk_map), printk_cmp);
    735
    736	return printk;
    737}
    738
    739/**
    740 * tep_register_print_string - register a string by its address
    741 * @tep: a handle to the trace event parser context
    742 * @fmt: the string format to register
    743 * @addr: the address the string was located at
    744 *
    745 * This registers a string by the address it was stored in the kernel.
    746 * The @fmt passed in is duplicated.
    747 */
    748int tep_register_print_string(struct tep_handle *tep, const char *fmt,
    749			      unsigned long long addr)
    750{
    751	struct printk_list *item = malloc(sizeof(*item));
    752	char *p;
    753
    754	if (!item)
    755		return -1;
    756
    757	item->next = tep->printklist;
    758	item->addr = addr;
    759
    760	/* Strip off quotes and '\n' from the end */
    761	if (fmt[0] == '"')
    762		fmt++;
    763	item->printk = strdup(fmt);
    764	if (!item->printk)
    765		goto out_free;
    766
    767	p = item->printk + strlen(item->printk) - 1;
    768	if (*p == '"')
    769		*p = 0;
    770
    771	p -= 2;
    772	if (strcmp(p, "\\n") == 0)
    773		*p = 0;
    774
    775	tep->printklist = item;
    776	tep->printk_count++;
    777
    778	return 0;
    779
    780out_free:
    781	free(item);
    782	errno = ENOMEM;
    783	return -1;
    784}
    785
    786/**
    787 * tep_print_printk - print out the stored strings
    788 * @tep: a handle to the trace event parser context
    789 *
    790 * This prints the string formats that were stored.
    791 */
    792void tep_print_printk(struct tep_handle *tep)
    793{
    794	int i;
    795
    796	if (!tep->printk_map)
    797		printk_map_init(tep);
    798
    799	for (i = 0; i < (int)tep->printk_count; i++) {
    800		printf("%016llx %s\n",
    801		       tep->printk_map[i].addr,
    802		       tep->printk_map[i].printk);
    803	}
    804}
    805
    806static struct tep_event *alloc_event(void)
    807{
    808	return calloc(1, sizeof(struct tep_event));
    809}
    810
    811static int add_event(struct tep_handle *tep, struct tep_event *event)
    812{
    813	int i;
    814	struct tep_event **events = realloc(tep->events, sizeof(event) *
    815					    (tep->nr_events + 1));
    816	if (!events)
    817		return -1;
    818
    819	tep->events = events;
    820
    821	for (i = 0; i < tep->nr_events; i++) {
    822		if (tep->events[i]->id > event->id)
    823			break;
    824	}
    825	if (i < tep->nr_events)
    826		memmove(&tep->events[i + 1],
    827			&tep->events[i],
    828			sizeof(event) * (tep->nr_events - i));
    829
    830	tep->events[i] = event;
    831	tep->nr_events++;
    832
    833	event->tep = tep;
    834
    835	return 0;
    836}
    837
    838static int event_item_type(enum tep_event_type type)
    839{
    840	switch (type) {
    841	case TEP_EVENT_ITEM ... TEP_EVENT_SQUOTE:
    842		return 1;
    843	case TEP_EVENT_ERROR ... TEP_EVENT_DELIM:
    844	default:
    845		return 0;
    846	}
    847}
    848
    849static void free_flag_sym(struct tep_print_flag_sym *fsym)
    850{
    851	struct tep_print_flag_sym *next;
    852
    853	while (fsym) {
    854		next = fsym->next;
    855		free(fsym->value);
    856		free(fsym->str);
    857		free(fsym);
    858		fsym = next;
    859	}
    860}
    861
    862static void free_arg(struct tep_print_arg *arg)
    863{
    864	struct tep_print_arg *farg;
    865
    866	if (!arg)
    867		return;
    868
    869	switch (arg->type) {
    870	case TEP_PRINT_ATOM:
    871		free(arg->atom.atom);
    872		break;
    873	case TEP_PRINT_FIELD:
    874		free(arg->field.name);
    875		break;
    876	case TEP_PRINT_FLAGS:
    877		free_arg(arg->flags.field);
    878		free(arg->flags.delim);
    879		free_flag_sym(arg->flags.flags);
    880		break;
    881	case TEP_PRINT_SYMBOL:
    882		free_arg(arg->symbol.field);
    883		free_flag_sym(arg->symbol.symbols);
    884		break;
    885	case TEP_PRINT_HEX:
    886	case TEP_PRINT_HEX_STR:
    887		free_arg(arg->hex.field);
    888		free_arg(arg->hex.size);
    889		break;
    890	case TEP_PRINT_INT_ARRAY:
    891		free_arg(arg->int_array.field);
    892		free_arg(arg->int_array.count);
    893		free_arg(arg->int_array.el_size);
    894		break;
    895	case TEP_PRINT_TYPE:
    896		free(arg->typecast.type);
    897		free_arg(arg->typecast.item);
    898		break;
    899	case TEP_PRINT_STRING:
    900	case TEP_PRINT_BSTRING:
    901		free(arg->string.string);
    902		break;
    903	case TEP_PRINT_BITMASK:
    904		free(arg->bitmask.bitmask);
    905		break;
    906	case TEP_PRINT_DYNAMIC_ARRAY:
    907	case TEP_PRINT_DYNAMIC_ARRAY_LEN:
    908		free(arg->dynarray.index);
    909		break;
    910	case TEP_PRINT_OP:
    911		free(arg->op.op);
    912		free_arg(arg->op.left);
    913		free_arg(arg->op.right);
    914		break;
    915	case TEP_PRINT_FUNC:
    916		while (arg->func.args) {
    917			farg = arg->func.args;
    918			arg->func.args = farg->next;
    919			free_arg(farg);
    920		}
    921		break;
    922
    923	case TEP_PRINT_NULL:
    924	default:
    925		break;
    926	}
    927
    928	free(arg);
    929}
    930
    931static enum tep_event_type get_type(int ch)
    932{
    933	if (ch == '\n')
    934		return TEP_EVENT_NEWLINE;
    935	if (isspace(ch))
    936		return TEP_EVENT_SPACE;
    937	if (isalnum(ch) || ch == '_')
    938		return TEP_EVENT_ITEM;
    939	if (ch == '\'')
    940		return TEP_EVENT_SQUOTE;
    941	if (ch == '"')
    942		return TEP_EVENT_DQUOTE;
    943	if (!isprint(ch))
    944		return TEP_EVENT_NONE;
    945	if (ch == '(' || ch == ')' || ch == ',')
    946		return TEP_EVENT_DELIM;
    947
    948	return TEP_EVENT_OP;
    949}
    950
    951static int __read_char(void)
    952{
    953	if (input_buf_ptr >= input_buf_siz)
    954		return -1;
    955
    956	return input_buf[input_buf_ptr++];
    957}
    958
    959/**
    960 * peek_char - peek at the next character that will be read
    961 *
    962 * Returns the next character read, or -1 if end of buffer.
    963 */
    964__hidden int peek_char(void)
    965{
    966	if (input_buf_ptr >= input_buf_siz)
    967		return -1;
    968
    969	return input_buf[input_buf_ptr];
    970}
    971
    972static int extend_token(char **tok, char *buf, int size)
    973{
    974	char *newtok = realloc(*tok, size);
    975
    976	if (!newtok) {
    977		free(*tok);
    978		*tok = NULL;
    979		return -1;
    980	}
    981
    982	if (!*tok)
    983		strcpy(newtok, buf);
    984	else
    985		strcat(newtok, buf);
    986	*tok = newtok;
    987
    988	return 0;
    989}
    990
    991static enum tep_event_type force_token(const char *str, char **tok);
    992
    993static enum tep_event_type __read_token(char **tok)
    994{
    995	char buf[BUFSIZ];
    996	int ch, last_ch, quote_ch, next_ch;
    997	int i = 0;
    998	int tok_size = 0;
    999	enum tep_event_type type;
   1000
   1001	*tok = NULL;
   1002
   1003
   1004	ch = __read_char();
   1005	if (ch < 0)
   1006		return TEP_EVENT_NONE;
   1007
   1008	type = get_type(ch);
   1009	if (type == TEP_EVENT_NONE)
   1010		return type;
   1011
   1012	buf[i++] = ch;
   1013
   1014	switch (type) {
   1015	case TEP_EVENT_NEWLINE:
   1016	case TEP_EVENT_DELIM:
   1017		if (asprintf(tok, "%c", ch) < 0)
   1018			return TEP_EVENT_ERROR;
   1019
   1020		return type;
   1021
   1022	case TEP_EVENT_OP:
   1023		switch (ch) {
   1024		case '-':
   1025			next_ch = peek_char();
   1026			if (next_ch == '>') {
   1027				buf[i++] = __read_char();
   1028				break;
   1029			}
   1030			/* fall through */
   1031		case '+':
   1032		case '|':
   1033		case '&':
   1034		case '>':
   1035		case '<':
   1036			last_ch = ch;
   1037			ch = peek_char();
   1038			if (ch != last_ch)
   1039				goto test_equal;
   1040			buf[i++] = __read_char();
   1041			switch (last_ch) {
   1042			case '>':
   1043			case '<':
   1044				goto test_equal;
   1045			default:
   1046				break;
   1047			}
   1048			break;
   1049		case '!':
   1050		case '=':
   1051			goto test_equal;
   1052		default: /* what should we do instead? */
   1053			break;
   1054		}
   1055		buf[i] = 0;
   1056		*tok = strdup(buf);
   1057		return type;
   1058
   1059 test_equal:
   1060		ch = peek_char();
   1061		if (ch == '=')
   1062			buf[i++] = __read_char();
   1063		goto out;
   1064
   1065	case TEP_EVENT_DQUOTE:
   1066	case TEP_EVENT_SQUOTE:
   1067		/* don't keep quotes */
   1068		i--;
   1069		quote_ch = ch;
   1070		last_ch = 0;
   1071 concat:
   1072		do {
   1073			if (i == (BUFSIZ - 1)) {
   1074				buf[i] = 0;
   1075				tok_size += BUFSIZ;
   1076
   1077				if (extend_token(tok, buf, tok_size) < 0)
   1078					return TEP_EVENT_NONE;
   1079				i = 0;
   1080			}
   1081			last_ch = ch;
   1082			ch = __read_char();
   1083			buf[i++] = ch;
   1084			/* the '\' '\' will cancel itself */
   1085			if (ch == '\\' && last_ch == '\\')
   1086				last_ch = 0;
   1087		} while (ch != quote_ch || last_ch == '\\');
   1088		/* remove the last quote */
   1089		i--;
   1090
   1091		/*
   1092		 * For strings (double quotes) check the next token.
   1093		 * If it is another string, concatinate the two.
   1094		 */
   1095		if (type == TEP_EVENT_DQUOTE) {
   1096			unsigned long long save_input_buf_ptr = input_buf_ptr;
   1097
   1098			do {
   1099				ch = __read_char();
   1100			} while (isspace(ch));
   1101			if (ch == '"')
   1102				goto concat;
   1103			input_buf_ptr = save_input_buf_ptr;
   1104		}
   1105
   1106		goto out;
   1107
   1108	case TEP_EVENT_ERROR ... TEP_EVENT_SPACE:
   1109	case TEP_EVENT_ITEM:
   1110	default:
   1111		break;
   1112	}
   1113
   1114	while (get_type(peek_char()) == type) {
   1115		if (i == (BUFSIZ - 1)) {
   1116			buf[i] = 0;
   1117			tok_size += BUFSIZ;
   1118
   1119			if (extend_token(tok, buf, tok_size) < 0)
   1120				return TEP_EVENT_NONE;
   1121			i = 0;
   1122		}
   1123		ch = __read_char();
   1124		buf[i++] = ch;
   1125	}
   1126
   1127 out:
   1128	buf[i] = 0;
   1129	if (extend_token(tok, buf, tok_size + i + 1) < 0)
   1130		return TEP_EVENT_NONE;
   1131
   1132	if (type == TEP_EVENT_ITEM) {
   1133		/*
   1134		 * Older versions of the kernel has a bug that
   1135		 * creates invalid symbols and will break the mac80211
   1136		 * parsing. This is a work around to that bug.
   1137		 *
   1138		 * See Linux kernel commit:
   1139		 *  811cb50baf63461ce0bdb234927046131fc7fa8b
   1140		 */
   1141		if (strcmp(*tok, "LOCAL_PR_FMT") == 0) {
   1142			free(*tok);
   1143			*tok = NULL;
   1144			return force_token("\"%s\" ", tok);
   1145		} else if (strcmp(*tok, "STA_PR_FMT") == 0) {
   1146			free(*tok);
   1147			*tok = NULL;
   1148			return force_token("\" sta:%pM\" ", tok);
   1149		} else if (strcmp(*tok, "VIF_PR_FMT") == 0) {
   1150			free(*tok);
   1151			*tok = NULL;
   1152			return force_token("\" vif:%p(%d)\" ", tok);
   1153		}
   1154	}
   1155
   1156	return type;
   1157}
   1158
   1159static enum tep_event_type force_token(const char *str, char **tok)
   1160{
   1161	const char *save_input_buf;
   1162	unsigned long long save_input_buf_ptr;
   1163	unsigned long long save_input_buf_siz;
   1164	enum tep_event_type type;
   1165	
   1166	/* save off the current input pointers */
   1167	save_input_buf = input_buf;
   1168	save_input_buf_ptr = input_buf_ptr;
   1169	save_input_buf_siz = input_buf_siz;
   1170
   1171	init_input_buf(str, strlen(str));
   1172
   1173	type = __read_token(tok);
   1174
   1175	/* reset back to original token */
   1176	input_buf = save_input_buf;
   1177	input_buf_ptr = save_input_buf_ptr;
   1178	input_buf_siz = save_input_buf_siz;
   1179
   1180	return type;
   1181}
   1182
   1183/**
   1184 * free_token - free a token returned by tep_read_token
   1185 * @token: the token to free
   1186 */
   1187__hidden void free_token(char *tok)
   1188{
   1189	if (tok)
   1190		free(tok);
   1191}
   1192
   1193/**
   1194 * read_token - access to utilities to use the tep parser
   1195 * @tok: The token to return
   1196 *
   1197 * This will parse tokens from the string given by
   1198 * tep_init_data().
   1199 *
   1200 * Returns the token type.
   1201 */
   1202__hidden enum tep_event_type read_token(char **tok)
   1203{
   1204	enum tep_event_type type;
   1205
   1206	for (;;) {
   1207		type = __read_token(tok);
   1208		if (type != TEP_EVENT_SPACE)
   1209			return type;
   1210
   1211		free_token(*tok);
   1212	}
   1213
   1214	/* not reached */
   1215	*tok = NULL;
   1216	return TEP_EVENT_NONE;
   1217}
   1218
   1219/* no newline */
   1220static enum tep_event_type read_token_item(char **tok)
   1221{
   1222	enum tep_event_type type;
   1223
   1224	for (;;) {
   1225		type = __read_token(tok);
   1226		if (type != TEP_EVENT_SPACE && type != TEP_EVENT_NEWLINE)
   1227			return type;
   1228		free_token(*tok);
   1229		*tok = NULL;
   1230	}
   1231
   1232	/* not reached */
   1233	*tok = NULL;
   1234	return TEP_EVENT_NONE;
   1235}
   1236
   1237static int test_type(enum tep_event_type type, enum tep_event_type expect)
   1238{
   1239	if (type != expect) {
   1240		do_warning("Error: expected type %d but read %d",
   1241		    expect, type);
   1242		return -1;
   1243	}
   1244	return 0;
   1245}
   1246
   1247static int test_type_token(enum tep_event_type type, const char *token,
   1248		    enum tep_event_type expect, const char *expect_tok)
   1249{
   1250	if (type != expect) {
   1251		do_warning("Error: expected type %d but read %d",
   1252		    expect, type);
   1253		return -1;
   1254	}
   1255
   1256	if (strcmp(token, expect_tok) != 0) {
   1257		do_warning("Error: expected '%s' but read '%s'",
   1258		    expect_tok, token);
   1259		return -1;
   1260	}
   1261	return 0;
   1262}
   1263
   1264static int __read_expect_type(enum tep_event_type expect, char **tok, int newline_ok)
   1265{
   1266	enum tep_event_type type;
   1267
   1268	if (newline_ok)
   1269		type = read_token(tok);
   1270	else
   1271		type = read_token_item(tok);
   1272	return test_type(type, expect);
   1273}
   1274
   1275static int read_expect_type(enum tep_event_type expect, char **tok)
   1276{
   1277	return __read_expect_type(expect, tok, 1);
   1278}
   1279
   1280static int __read_expected(enum tep_event_type expect, const char *str,
   1281			   int newline_ok)
   1282{
   1283	enum tep_event_type type;
   1284	char *token;
   1285	int ret;
   1286
   1287	if (newline_ok)
   1288		type = read_token(&token);
   1289	else
   1290		type = read_token_item(&token);
   1291
   1292	ret = test_type_token(type, token, expect, str);
   1293
   1294	free_token(token);
   1295
   1296	return ret;
   1297}
   1298
   1299static int read_expected(enum tep_event_type expect, const char *str)
   1300{
   1301	return __read_expected(expect, str, 1);
   1302}
   1303
   1304static int read_expected_item(enum tep_event_type expect, const char *str)
   1305{
   1306	return __read_expected(expect, str, 0);
   1307}
   1308
   1309static char *event_read_name(void)
   1310{
   1311	char *token;
   1312
   1313	if (read_expected(TEP_EVENT_ITEM, "name") < 0)
   1314		return NULL;
   1315
   1316	if (read_expected(TEP_EVENT_OP, ":") < 0)
   1317		return NULL;
   1318
   1319	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   1320		goto fail;
   1321
   1322	return token;
   1323
   1324 fail:
   1325	free_token(token);
   1326	return NULL;
   1327}
   1328
   1329static int event_read_id(void)
   1330{
   1331	char *token;
   1332	int id;
   1333
   1334	if (read_expected_item(TEP_EVENT_ITEM, "ID") < 0)
   1335		return -1;
   1336
   1337	if (read_expected(TEP_EVENT_OP, ":") < 0)
   1338		return -1;
   1339
   1340	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   1341		goto fail;
   1342
   1343	id = strtoul(token, NULL, 0);
   1344	free_token(token);
   1345	return id;
   1346
   1347 fail:
   1348	free_token(token);
   1349	return -1;
   1350}
   1351
   1352static int field_is_string(struct tep_format_field *field)
   1353{
   1354	if ((field->flags & TEP_FIELD_IS_ARRAY) &&
   1355	    (strstr(field->type, "char") || strstr(field->type, "u8") ||
   1356	     strstr(field->type, "s8")))
   1357		return 1;
   1358
   1359	return 0;
   1360}
   1361
   1362static int field_is_dynamic(struct tep_format_field *field)
   1363{
   1364	if (strncmp(field->type, "__data_loc", 10) == 0)
   1365		return 1;
   1366
   1367	return 0;
   1368}
   1369
   1370static int field_is_relative_dynamic(struct tep_format_field *field)
   1371{
   1372	if (strncmp(field->type, "__rel_loc", 9) == 0)
   1373		return 1;
   1374
   1375	return 0;
   1376}
   1377
   1378static int field_is_long(struct tep_format_field *field)
   1379{
   1380	/* includes long long */
   1381	if (strstr(field->type, "long"))
   1382		return 1;
   1383
   1384	return 0;
   1385}
   1386
   1387static unsigned int type_size(const char *name)
   1388{
   1389	/* This covers all TEP_FIELD_IS_STRING types. */
   1390	static struct {
   1391		const char *type;
   1392		unsigned int size;
   1393	} table[] = {
   1394		{ "u8",   1 },
   1395		{ "u16",  2 },
   1396		{ "u32",  4 },
   1397		{ "u64",  8 },
   1398		{ "s8",   1 },
   1399		{ "s16",  2 },
   1400		{ "s32",  4 },
   1401		{ "s64",  8 },
   1402		{ "char", 1 },
   1403		{ },
   1404	};
   1405	int i;
   1406
   1407	for (i = 0; table[i].type; i++) {
   1408		if (!strcmp(table[i].type, name))
   1409			return table[i].size;
   1410	}
   1411
   1412	return 0;
   1413}
   1414
   1415static int append(char **buf, const char *delim, const char *str)
   1416{
   1417	char *new_buf;
   1418
   1419	new_buf = realloc(*buf, strlen(*buf) + strlen(delim) + strlen(str) + 1);
   1420	if (!new_buf)
   1421		return -1;
   1422	strcat(new_buf, delim);
   1423	strcat(new_buf, str);
   1424	*buf = new_buf;
   1425	return 0;
   1426}
   1427
   1428static int event_read_fields(struct tep_event *event, struct tep_format_field **fields)
   1429{
   1430	struct tep_format_field *field = NULL;
   1431	enum tep_event_type type;
   1432	char *token;
   1433	char *last_token;
   1434	char *delim = " ";
   1435	int count = 0;
   1436	int ret;
   1437
   1438	do {
   1439		unsigned int size_dynamic = 0;
   1440
   1441		type = read_token(&token);
   1442		if (type == TEP_EVENT_NEWLINE) {
   1443			free_token(token);
   1444			return count;
   1445		}
   1446
   1447		count++;
   1448
   1449		if (test_type_token(type, token, TEP_EVENT_ITEM, "field"))
   1450			goto fail;
   1451		free_token(token);
   1452
   1453		type = read_token(&token);
   1454		/*
   1455		 * The ftrace fields may still use the "special" name.
   1456		 * Just ignore it.
   1457		 */
   1458		if (event->flags & TEP_EVENT_FL_ISFTRACE &&
   1459		    type == TEP_EVENT_ITEM && strcmp(token, "special") == 0) {
   1460			free_token(token);
   1461			type = read_token(&token);
   1462		}
   1463
   1464		if (test_type_token(type, token, TEP_EVENT_OP, ":") < 0)
   1465			goto fail;
   1466
   1467		free_token(token);
   1468		if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   1469			goto fail;
   1470
   1471		last_token = token;
   1472
   1473		field = calloc(1, sizeof(*field));
   1474		if (!field)
   1475			goto fail;
   1476
   1477		field->event = event;
   1478
   1479		/* read the rest of the type */
   1480		for (;;) {
   1481			type = read_token(&token);
   1482			if (type == TEP_EVENT_ITEM ||
   1483			    (type == TEP_EVENT_OP && strcmp(token, "*") == 0) ||
   1484			    /*
   1485			     * Some of the ftrace fields are broken and have
   1486			     * an illegal "." in them.
   1487			     */
   1488			    (event->flags & TEP_EVENT_FL_ISFTRACE &&
   1489			     type == TEP_EVENT_OP && strcmp(token, ".") == 0)) {
   1490
   1491				if (strcmp(token, "*") == 0)
   1492					field->flags |= TEP_FIELD_IS_POINTER;
   1493
   1494				if (field->type) {
   1495					ret = append(&field->type, delim, last_token);
   1496					free(last_token);
   1497					if (ret < 0)
   1498						goto fail;
   1499				} else
   1500					field->type = last_token;
   1501				last_token = token;
   1502				delim = " ";
   1503				continue;
   1504			}
   1505
   1506			/* Handle __attribute__((user)) */
   1507			if ((type == TEP_EVENT_DELIM) &&
   1508			    strcmp("__attribute__", last_token) == 0 &&
   1509			    token[0] == '(') {
   1510				int depth = 1;
   1511				int ret;
   1512
   1513				ret = append(&field->type, " ", last_token);
   1514				ret |= append(&field->type, "", "(");
   1515				if (ret < 0)
   1516					goto fail;
   1517
   1518				delim = " ";
   1519				while ((type = read_token(&token)) != TEP_EVENT_NONE) {
   1520					if (type == TEP_EVENT_DELIM) {
   1521						if (token[0] == '(')
   1522							depth++;
   1523						else if (token[0] == ')')
   1524							depth--;
   1525						if (!depth)
   1526							break;
   1527						ret = append(&field->type, "", token);
   1528						delim = "";
   1529					} else {
   1530						ret = append(&field->type, delim, token);
   1531						delim = " ";
   1532					}
   1533					if (ret < 0)
   1534						goto fail;
   1535					free(last_token);
   1536					last_token = token;
   1537				}
   1538				continue;
   1539			}
   1540			break;
   1541		}
   1542
   1543		if (!field->type) {
   1544			do_warning_event(event, "%s: no type found", __func__);
   1545			goto fail;
   1546		}
   1547		field->name = field->alias = last_token;
   1548
   1549		if (test_type(type, TEP_EVENT_OP))
   1550			goto fail;
   1551
   1552		if (strcmp(token, "[") == 0) {
   1553			enum tep_event_type last_type = type;
   1554			char *brackets = token;
   1555
   1556			field->flags |= TEP_FIELD_IS_ARRAY;
   1557
   1558			type = read_token(&token);
   1559
   1560			if (type == TEP_EVENT_ITEM)
   1561				field->arraylen = strtoul(token, NULL, 0);
   1562			else
   1563				field->arraylen = 0;
   1564
   1565		        while (strcmp(token, "]") != 0) {
   1566				const char *delim;
   1567
   1568				if (last_type == TEP_EVENT_ITEM &&
   1569				    type == TEP_EVENT_ITEM)
   1570					delim = " ";
   1571				else
   1572					delim = "";
   1573
   1574				last_type = type;
   1575
   1576				ret = append(&brackets, delim, token);
   1577				if (ret < 0) {
   1578					free(brackets);
   1579					goto fail;
   1580				}
   1581				/* We only care about the last token */
   1582				field->arraylen = strtoul(token, NULL, 0);
   1583				free_token(token);
   1584				type = read_token(&token);
   1585				if (type == TEP_EVENT_NONE) {
   1586					free(brackets);
   1587					do_warning_event(event, "failed to find token");
   1588					goto fail;
   1589				}
   1590			}
   1591
   1592			free_token(token);
   1593
   1594			ret = append(&brackets, "", "]");
   1595			if (ret < 0) {
   1596				free(brackets);
   1597				goto fail;
   1598			}
   1599
   1600			/* add brackets to type */
   1601
   1602			type = read_token(&token);
   1603			/*
   1604			 * If the next token is not an OP, then it is of
   1605			 * the format: type [] item;
   1606			 */
   1607			if (type == TEP_EVENT_ITEM) {
   1608				ret = append(&field->type, " ", field->name);
   1609				if (ret < 0) {
   1610					free(brackets);
   1611					goto fail;
   1612				}
   1613				ret = append(&field->type, "", brackets);
   1614
   1615				size_dynamic = type_size(field->name);
   1616				free_token(field->name);
   1617				field->name = field->alias = token;
   1618				type = read_token(&token);
   1619			} else {
   1620				ret = append(&field->type, "", brackets);
   1621				if (ret < 0) {
   1622					free(brackets);
   1623					goto fail;
   1624				}
   1625			}
   1626			free(brackets);
   1627		}
   1628
   1629		if (field_is_string(field))
   1630			field->flags |= TEP_FIELD_IS_STRING;
   1631		if (field_is_dynamic(field))
   1632			field->flags |= TEP_FIELD_IS_DYNAMIC;
   1633		if (field_is_relative_dynamic(field))
   1634			field->flags |= TEP_FIELD_IS_DYNAMIC | TEP_FIELD_IS_RELATIVE;
   1635		if (field_is_long(field))
   1636			field->flags |= TEP_FIELD_IS_LONG;
   1637
   1638		if (test_type_token(type, token,  TEP_EVENT_OP, ";"))
   1639			goto fail;
   1640		free_token(token);
   1641
   1642		if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
   1643			goto fail_expect;
   1644
   1645		if (read_expected(TEP_EVENT_OP, ":") < 0)
   1646			goto fail_expect;
   1647
   1648		if (read_expect_type(TEP_EVENT_ITEM, &token))
   1649			goto fail;
   1650		field->offset = strtoul(token, NULL, 0);
   1651		free_token(token);
   1652
   1653		if (read_expected(TEP_EVENT_OP, ";") < 0)
   1654			goto fail_expect;
   1655
   1656		if (read_expected(TEP_EVENT_ITEM, "size") < 0)
   1657			goto fail_expect;
   1658
   1659		if (read_expected(TEP_EVENT_OP, ":") < 0)
   1660			goto fail_expect;
   1661
   1662		if (read_expect_type(TEP_EVENT_ITEM, &token))
   1663			goto fail;
   1664		field->size = strtoul(token, NULL, 0);
   1665		free_token(token);
   1666
   1667		if (read_expected(TEP_EVENT_OP, ";") < 0)
   1668			goto fail_expect;
   1669
   1670		type = read_token(&token);
   1671		if (type != TEP_EVENT_NEWLINE) {
   1672			/* newer versions of the kernel have a "signed" type */
   1673			if (test_type_token(type, token, TEP_EVENT_ITEM, "signed"))
   1674				goto fail;
   1675
   1676			free_token(token);
   1677
   1678			if (read_expected(TEP_EVENT_OP, ":") < 0)
   1679				goto fail_expect;
   1680
   1681			if (read_expect_type(TEP_EVENT_ITEM, &token))
   1682				goto fail;
   1683
   1684			if (strtoul(token, NULL, 0))
   1685				field->flags |= TEP_FIELD_IS_SIGNED;
   1686
   1687			free_token(token);
   1688			if (read_expected(TEP_EVENT_OP, ";") < 0)
   1689				goto fail_expect;
   1690
   1691			if (read_expect_type(TEP_EVENT_NEWLINE, &token))
   1692				goto fail;
   1693		}
   1694
   1695		free_token(token);
   1696
   1697		if (field->flags & TEP_FIELD_IS_ARRAY) {
   1698			if (field->arraylen)
   1699				field->elementsize = field->size / field->arraylen;
   1700			else if (field->flags & TEP_FIELD_IS_DYNAMIC)
   1701				field->elementsize = size_dynamic;
   1702			else if (field->flags & TEP_FIELD_IS_STRING)
   1703				field->elementsize = 1;
   1704			else if (field->flags & TEP_FIELD_IS_LONG)
   1705				field->elementsize = event->tep ?
   1706						     event->tep->long_size :
   1707						     sizeof(long);
   1708		} else
   1709			field->elementsize = field->size;
   1710
   1711		*fields = field;
   1712		fields = &field->next;
   1713
   1714	} while (1);
   1715
   1716	return 0;
   1717
   1718fail:
   1719	free_token(token);
   1720fail_expect:
   1721	if (field) {
   1722		free(field->type);
   1723		free(field->name);
   1724		free(field);
   1725	}
   1726	return -1;
   1727}
   1728
   1729static int event_read_format(struct tep_event *event)
   1730{
   1731	char *token;
   1732	int ret;
   1733
   1734	if (read_expected_item(TEP_EVENT_ITEM, "format") < 0)
   1735		return -1;
   1736
   1737	if (read_expected(TEP_EVENT_OP, ":") < 0)
   1738		return -1;
   1739
   1740	if (read_expect_type(TEP_EVENT_NEWLINE, &token))
   1741		goto fail;
   1742	free_token(token);
   1743
   1744	ret = event_read_fields(event, &event->format.common_fields);
   1745	if (ret < 0)
   1746		return ret;
   1747	event->format.nr_common = ret;
   1748
   1749	ret = event_read_fields(event, &event->format.fields);
   1750	if (ret < 0)
   1751		return ret;
   1752	event->format.nr_fields = ret;
   1753
   1754	return 0;
   1755
   1756 fail:
   1757	free_token(token);
   1758	return -1;
   1759}
   1760
   1761static enum tep_event_type
   1762process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
   1763		  char **tok, enum tep_event_type type);
   1764
   1765static enum tep_event_type
   1766process_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   1767{
   1768	enum tep_event_type type;
   1769	char *token;
   1770
   1771	type = read_token(&token);
   1772	*tok = token;
   1773
   1774	return process_arg_token(event, arg, tok, type);
   1775}
   1776
   1777static enum tep_event_type
   1778process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok);
   1779
   1780/*
   1781 * For __print_symbolic() and __print_flags, we need to completely
   1782 * evaluate the first argument, which defines what to print next.
   1783 */
   1784static enum tep_event_type
   1785process_field_arg(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   1786{
   1787	enum tep_event_type type;
   1788
   1789	type = process_arg(event, arg, tok);
   1790
   1791	while (type == TEP_EVENT_OP) {
   1792		type = process_op(event, arg, tok);
   1793	}
   1794
   1795	return type;
   1796}
   1797
   1798static enum tep_event_type
   1799process_cond(struct tep_event *event, struct tep_print_arg *top, char **tok)
   1800{
   1801	struct tep_print_arg *arg, *left, *right;
   1802	enum tep_event_type type;
   1803	char *token = NULL;
   1804
   1805	arg = alloc_arg();
   1806	left = alloc_arg();
   1807	right = alloc_arg();
   1808
   1809	if (!arg || !left || !right) {
   1810		do_warning_event(event, "%s: not enough memory!", __func__);
   1811		/* arg will be freed at out_free */
   1812		free_arg(left);
   1813		free_arg(right);
   1814		goto out_free;
   1815	}
   1816
   1817	arg->type = TEP_PRINT_OP;
   1818	arg->op.left = left;
   1819	arg->op.right = right;
   1820
   1821	*tok = NULL;
   1822	type = process_arg(event, left, &token);
   1823
   1824 again:
   1825	if (type == TEP_EVENT_ERROR)
   1826		goto out_free;
   1827
   1828	/* Handle other operations in the arguments */
   1829	if (type == TEP_EVENT_OP && strcmp(token, ":") != 0) {
   1830		type = process_op(event, left, &token);
   1831		goto again;
   1832	}
   1833
   1834	if (test_type_token(type, token, TEP_EVENT_OP, ":"))
   1835		goto out_free;
   1836
   1837	arg->op.op = token;
   1838
   1839	type = process_arg(event, right, &token);
   1840
   1841	top->op.right = arg;
   1842
   1843	*tok = token;
   1844	return type;
   1845
   1846out_free:
   1847	/* Top may point to itself */
   1848	top->op.right = NULL;
   1849	free_token(token);
   1850	free_arg(arg);
   1851	return TEP_EVENT_ERROR;
   1852}
   1853
   1854static enum tep_event_type
   1855process_array(struct tep_event *event, struct tep_print_arg *top, char **tok)
   1856{
   1857	struct tep_print_arg *arg;
   1858	enum tep_event_type type;
   1859	char *token = NULL;
   1860
   1861	arg = alloc_arg();
   1862	if (!arg) {
   1863		do_warning_event(event, "%s: not enough memory!", __func__);
   1864		/* '*tok' is set to top->op.op.  No need to free. */
   1865		*tok = NULL;
   1866		return TEP_EVENT_ERROR;
   1867	}
   1868
   1869	*tok = NULL;
   1870	type = process_arg(event, arg, &token);
   1871	if (test_type_token(type, token, TEP_EVENT_OP, "]"))
   1872		goto out_free;
   1873
   1874	top->op.right = arg;
   1875
   1876	free_token(token);
   1877	type = read_token_item(&token);
   1878	*tok = token;
   1879
   1880	return type;
   1881
   1882out_free:
   1883	free_token(token);
   1884	free_arg(arg);
   1885	return TEP_EVENT_ERROR;
   1886}
   1887
   1888static int get_op_prio(char *op)
   1889{
   1890	if (!op[1]) {
   1891		switch (op[0]) {
   1892		case '~':
   1893		case '!':
   1894			return 4;
   1895		case '*':
   1896		case '/':
   1897		case '%':
   1898			return 6;
   1899		case '+':
   1900		case '-':
   1901			return 7;
   1902			/* '>>' and '<<' are 8 */
   1903		case '<':
   1904		case '>':
   1905			return 9;
   1906			/* '==' and '!=' are 10 */
   1907		case '&':
   1908			return 11;
   1909		case '^':
   1910			return 12;
   1911		case '|':
   1912			return 13;
   1913		case '?':
   1914			return 16;
   1915		default:
   1916			do_warning("unknown op '%c'", op[0]);
   1917			return -1;
   1918		}
   1919	} else {
   1920		if (strcmp(op, "++") == 0 ||
   1921		    strcmp(op, "--") == 0) {
   1922			return 3;
   1923		} else if (strcmp(op, ">>") == 0 ||
   1924			   strcmp(op, "<<") == 0) {
   1925			return 8;
   1926		} else if (strcmp(op, ">=") == 0 ||
   1927			   strcmp(op, "<=") == 0) {
   1928			return 9;
   1929		} else if (strcmp(op, "==") == 0 ||
   1930			   strcmp(op, "!=") == 0) {
   1931			return 10;
   1932		} else if (strcmp(op, "&&") == 0) {
   1933			return 14;
   1934		} else if (strcmp(op, "||") == 0) {
   1935			return 15;
   1936		} else {
   1937			do_warning("unknown op '%s'", op);
   1938			return -1;
   1939		}
   1940	}
   1941}
   1942
   1943static int set_op_prio(struct tep_print_arg *arg)
   1944{
   1945
   1946	/* single ops are the greatest */
   1947	if (!arg->op.left || arg->op.left->type == TEP_PRINT_NULL)
   1948		arg->op.prio = 0;
   1949	else
   1950		arg->op.prio = get_op_prio(arg->op.op);
   1951
   1952	return arg->op.prio;
   1953}
   1954
   1955/* Note, *tok does not get freed, but will most likely be saved */
   1956static enum tep_event_type
   1957process_op(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   1958{
   1959	struct tep_print_arg *left, *right = NULL;
   1960	enum tep_event_type type;
   1961	char *token;
   1962
   1963	/* the op is passed in via tok */
   1964	token = *tok;
   1965
   1966	if (arg->type == TEP_PRINT_OP && !arg->op.left) {
   1967		/* handle single op */
   1968		if (token[1]) {
   1969			do_warning_event(event, "bad op token %s", token);
   1970			goto out_free;
   1971		}
   1972		switch (token[0]) {
   1973		case '~':
   1974		case '!':
   1975		case '+':
   1976		case '-':
   1977			break;
   1978		default:
   1979			do_warning_event(event, "bad op token %s", token);
   1980			goto out_free;
   1981
   1982		}
   1983
   1984		/* make an empty left */
   1985		left = alloc_arg();
   1986		if (!left)
   1987			goto out_warn_free;
   1988
   1989		left->type = TEP_PRINT_NULL;
   1990		arg->op.left = left;
   1991
   1992		right = alloc_arg();
   1993		if (!right)
   1994			goto out_warn_free;
   1995
   1996		arg->op.right = right;
   1997
   1998		/* do not free the token, it belongs to an op */
   1999		*tok = NULL;
   2000		type = process_arg(event, right, tok);
   2001
   2002	} else if (strcmp(token, "?") == 0) {
   2003
   2004		left = alloc_arg();
   2005		if (!left)
   2006			goto out_warn_free;
   2007
   2008		/* copy the top arg to the left */
   2009		*left = *arg;
   2010
   2011		arg->type = TEP_PRINT_OP;
   2012		arg->op.op = token;
   2013		arg->op.left = left;
   2014		arg->op.prio = 0;
   2015
   2016		/* it will set arg->op.right */
   2017		type = process_cond(event, arg, tok);
   2018
   2019	} else if (strcmp(token, ">>") == 0 ||
   2020		   strcmp(token, "<<") == 0 ||
   2021		   strcmp(token, "&") == 0 ||
   2022		   strcmp(token, "|") == 0 ||
   2023		   strcmp(token, "&&") == 0 ||
   2024		   strcmp(token, "||") == 0 ||
   2025		   strcmp(token, "-") == 0 ||
   2026		   strcmp(token, "+") == 0 ||
   2027		   strcmp(token, "*") == 0 ||
   2028		   strcmp(token, "^") == 0 ||
   2029		   strcmp(token, "/") == 0 ||
   2030		   strcmp(token, "%") == 0 ||
   2031		   strcmp(token, "<") == 0 ||
   2032		   strcmp(token, ">") == 0 ||
   2033		   strcmp(token, "<=") == 0 ||
   2034		   strcmp(token, ">=") == 0 ||
   2035		   strcmp(token, "==") == 0 ||
   2036		   strcmp(token, "!=") == 0) {
   2037
   2038		left = alloc_arg();
   2039		if (!left)
   2040			goto out_warn_free;
   2041
   2042		/* copy the top arg to the left */
   2043		*left = *arg;
   2044
   2045		arg->type = TEP_PRINT_OP;
   2046		arg->op.op = token;
   2047		arg->op.left = left;
   2048		arg->op.right = NULL;
   2049
   2050		if (set_op_prio(arg) == -1) {
   2051			event->flags |= TEP_EVENT_FL_FAILED;
   2052			/* arg->op.op (= token) will be freed at out_free */
   2053			arg->op.op = NULL;
   2054			goto out_free;
   2055		}
   2056
   2057		type = read_token_item(&token);
   2058		*tok = token;
   2059
   2060		/* could just be a type pointer */
   2061		if ((strcmp(arg->op.op, "*") == 0) &&
   2062		    type == TEP_EVENT_DELIM && (strcmp(token, ")") == 0)) {
   2063			int ret;
   2064
   2065			if (left->type != TEP_PRINT_ATOM) {
   2066				do_warning_event(event, "bad pointer type");
   2067				goto out_free;
   2068			}
   2069			ret = append(&left->atom.atom, " ", "*");
   2070			if (ret < 0)
   2071				goto out_warn_free;
   2072
   2073			free(arg->op.op);
   2074			*arg = *left;
   2075			free(left);
   2076
   2077			return type;
   2078		}
   2079
   2080		right = alloc_arg();
   2081		if (!right)
   2082			goto out_warn_free;
   2083
   2084		type = process_arg_token(event, right, tok, type);
   2085		if (type == TEP_EVENT_ERROR) {
   2086			free_arg(right);
   2087			/* token was freed in process_arg_token() via *tok */
   2088			token = NULL;
   2089			goto out_free;
   2090		}
   2091
   2092		if (right->type == TEP_PRINT_OP &&
   2093		    get_op_prio(arg->op.op) < get_op_prio(right->op.op)) {
   2094			struct tep_print_arg tmp;
   2095
   2096			/* rotate ops according to the priority */
   2097			arg->op.right = right->op.left;
   2098
   2099			tmp = *arg;
   2100			*arg = *right;
   2101			*right = tmp;
   2102
   2103			arg->op.left = right;
   2104		} else {
   2105			arg->op.right = right;
   2106		}
   2107
   2108	} else if (strcmp(token, "[") == 0) {
   2109
   2110		left = alloc_arg();
   2111		if (!left)
   2112			goto out_warn_free;
   2113
   2114		*left = *arg;
   2115
   2116		arg->type = TEP_PRINT_OP;
   2117		arg->op.op = token;
   2118		arg->op.left = left;
   2119
   2120		arg->op.prio = 0;
   2121
   2122		/* it will set arg->op.right */
   2123		type = process_array(event, arg, tok);
   2124
   2125	} else {
   2126		do_warning_event(event, "unknown op '%s'", token);
   2127		event->flags |= TEP_EVENT_FL_FAILED;
   2128		/* the arg is now the left side */
   2129		goto out_free;
   2130	}
   2131
   2132	if (type == TEP_EVENT_OP && strcmp(*tok, ":") != 0) {
   2133		int prio;
   2134
   2135		/* higher prios need to be closer to the root */
   2136		prio = get_op_prio(*tok);
   2137
   2138		if (prio > arg->op.prio)
   2139			return process_op(event, arg, tok);
   2140
   2141		return process_op(event, right, tok);
   2142	}
   2143
   2144	return type;
   2145
   2146out_warn_free:
   2147	do_warning_event(event, "%s: not enough memory!", __func__);
   2148out_free:
   2149	free_token(token);
   2150	*tok = NULL;
   2151	return TEP_EVENT_ERROR;
   2152}
   2153
   2154static enum tep_event_type
   2155process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
   2156	      char **tok)
   2157{
   2158	enum tep_event_type type;
   2159	char *field;
   2160	char *token;
   2161
   2162	if (read_expected(TEP_EVENT_OP, "->") < 0)
   2163		goto out_err;
   2164
   2165	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   2166		goto out_free;
   2167	field = token;
   2168
   2169	arg->type = TEP_PRINT_FIELD;
   2170	arg->field.name = field;
   2171
   2172	if (is_flag_field) {
   2173		arg->field.field = tep_find_any_field(event, arg->field.name);
   2174		arg->field.field->flags |= TEP_FIELD_IS_FLAG;
   2175		is_flag_field = 0;
   2176	} else if (is_symbolic_field) {
   2177		arg->field.field = tep_find_any_field(event, arg->field.name);
   2178		arg->field.field->flags |= TEP_FIELD_IS_SYMBOLIC;
   2179		is_symbolic_field = 0;
   2180	}
   2181
   2182	type = read_token(&token);
   2183	*tok = token;
   2184
   2185	return type;
   2186
   2187 out_free:
   2188	free_token(token);
   2189 out_err:
   2190	*tok = NULL;
   2191	return TEP_EVENT_ERROR;
   2192}
   2193
   2194static int alloc_and_process_delim(struct tep_event *event, char *next_token,
   2195				   struct tep_print_arg **print_arg)
   2196{
   2197	struct tep_print_arg *field;
   2198	enum tep_event_type type;
   2199	char *token;
   2200	int ret = 0;
   2201
   2202	field = alloc_arg();
   2203	if (!field) {
   2204		do_warning_event(event, "%s: not enough memory!", __func__);
   2205		errno = ENOMEM;
   2206		return -1;
   2207	}
   2208
   2209	type = process_arg(event, field, &token);
   2210
   2211	if (test_type_token(type, token, TEP_EVENT_DELIM, next_token)) {
   2212		errno = EINVAL;
   2213		ret = -1;
   2214		free_arg(field);
   2215		goto out_free_token;
   2216	}
   2217
   2218	*print_arg = field;
   2219
   2220out_free_token:
   2221	free_token(token);
   2222
   2223	return ret;
   2224}
   2225
   2226static char *arg_eval (struct tep_print_arg *arg);
   2227
   2228static unsigned long long
   2229eval_type_str(unsigned long long val, const char *type, int pointer)
   2230{
   2231	int sign = 0;
   2232	char *ref;
   2233	int len;
   2234
   2235	len = strlen(type);
   2236
   2237	if (pointer) {
   2238
   2239		if (type[len-1] != '*') {
   2240			do_warning("pointer expected with non pointer type");
   2241			return val;
   2242		}
   2243
   2244		ref = malloc(len);
   2245		if (!ref) {
   2246			do_warning("%s: not enough memory!", __func__);
   2247			return val;
   2248		}
   2249		memcpy(ref, type, len);
   2250
   2251		/* chop off the " *" */
   2252		ref[len - 2] = 0;
   2253
   2254		val = eval_type_str(val, ref, 0);
   2255		free(ref);
   2256		return val;
   2257	}
   2258
   2259	/* check if this is a pointer */
   2260	if (type[len - 1] == '*')
   2261		return val;
   2262
   2263	/* Try to figure out the arg size*/
   2264	if (strncmp(type, "struct", 6) == 0)
   2265		/* all bets off */
   2266		return val;
   2267
   2268	if (strcmp(type, "u8") == 0)
   2269		return val & 0xff;
   2270
   2271	if (strcmp(type, "u16") == 0)
   2272		return val & 0xffff;
   2273
   2274	if (strcmp(type, "u32") == 0)
   2275		return val & 0xffffffff;
   2276
   2277	if (strcmp(type, "u64") == 0 ||
   2278	    strcmp(type, "s64") == 0)
   2279		return val;
   2280
   2281	if (strcmp(type, "s8") == 0)
   2282		return (unsigned long long)(char)val & 0xff;
   2283
   2284	if (strcmp(type, "s16") == 0)
   2285		return (unsigned long long)(short)val & 0xffff;
   2286
   2287	if (strcmp(type, "s32") == 0)
   2288		return (unsigned long long)(int)val & 0xffffffff;
   2289
   2290	if (strncmp(type, "unsigned ", 9) == 0) {
   2291		sign = 0;
   2292		type += 9;
   2293	}
   2294
   2295	if (strcmp(type, "char") == 0) {
   2296		if (sign)
   2297			return (unsigned long long)(char)val & 0xff;
   2298		else
   2299			return val & 0xff;
   2300	}
   2301
   2302	if (strcmp(type, "short") == 0) {
   2303		if (sign)
   2304			return (unsigned long long)(short)val & 0xffff;
   2305		else
   2306			return val & 0xffff;
   2307	}
   2308
   2309	if (strcmp(type, "int") == 0) {
   2310		if (sign)
   2311			return (unsigned long long)(int)val & 0xffffffff;
   2312		else
   2313			return val & 0xffffffff;
   2314	}
   2315
   2316	return val;
   2317}
   2318
   2319/*
   2320 * Try to figure out the type.
   2321 */
   2322static unsigned long long
   2323eval_type(unsigned long long val, struct tep_print_arg *arg, int pointer)
   2324{
   2325	if (arg->type != TEP_PRINT_TYPE) {
   2326		do_warning("expected type argument");
   2327		return 0;
   2328	}
   2329
   2330	return eval_type_str(val, arg->typecast.type, pointer);
   2331}
   2332
   2333static int arg_num_eval(struct tep_print_arg *arg, long long *val)
   2334{
   2335	long long left, right;
   2336	int ret = 1;
   2337
   2338	switch (arg->type) {
   2339	case TEP_PRINT_ATOM:
   2340		*val = strtoll(arg->atom.atom, NULL, 0);
   2341		break;
   2342	case TEP_PRINT_TYPE:
   2343		ret = arg_num_eval(arg->typecast.item, val);
   2344		if (!ret)
   2345			break;
   2346		*val = eval_type(*val, arg, 0);
   2347		break;
   2348	case TEP_PRINT_OP:
   2349		switch (arg->op.op[0]) {
   2350		case '|':
   2351			ret = arg_num_eval(arg->op.left, &left);
   2352			if (!ret)
   2353				break;
   2354			ret = arg_num_eval(arg->op.right, &right);
   2355			if (!ret)
   2356				break;
   2357			if (arg->op.op[1])
   2358				*val = left || right;
   2359			else
   2360				*val = left | right;
   2361			break;
   2362		case '&':
   2363			ret = arg_num_eval(arg->op.left, &left);
   2364			if (!ret)
   2365				break;
   2366			ret = arg_num_eval(arg->op.right, &right);
   2367			if (!ret)
   2368				break;
   2369			if (arg->op.op[1])
   2370				*val = left && right;
   2371			else
   2372				*val = left & right;
   2373			break;
   2374		case '<':
   2375			ret = arg_num_eval(arg->op.left, &left);
   2376			if (!ret)
   2377				break;
   2378			ret = arg_num_eval(arg->op.right, &right);
   2379			if (!ret)
   2380				break;
   2381			switch (arg->op.op[1]) {
   2382			case 0:
   2383				*val = left < right;
   2384				break;
   2385			case '<':
   2386				*val = left << right;
   2387				break;
   2388			case '=':
   2389				*val = left <= right;
   2390				break;
   2391			default:
   2392				do_warning("unknown op '%s'", arg->op.op);
   2393				ret = 0;
   2394			}
   2395			break;
   2396		case '>':
   2397			ret = arg_num_eval(arg->op.left, &left);
   2398			if (!ret)
   2399				break;
   2400			ret = arg_num_eval(arg->op.right, &right);
   2401			if (!ret)
   2402				break;
   2403			switch (arg->op.op[1]) {
   2404			case 0:
   2405				*val = left > right;
   2406				break;
   2407			case '>':
   2408				*val = left >> right;
   2409				break;
   2410			case '=':
   2411				*val = left >= right;
   2412				break;
   2413			default:
   2414				do_warning("unknown op '%s'", arg->op.op);
   2415				ret = 0;
   2416			}
   2417			break;
   2418		case '=':
   2419			ret = arg_num_eval(arg->op.left, &left);
   2420			if (!ret)
   2421				break;
   2422			ret = arg_num_eval(arg->op.right, &right);
   2423			if (!ret)
   2424				break;
   2425
   2426			if (arg->op.op[1] != '=') {
   2427				do_warning("unknown op '%s'", arg->op.op);
   2428				ret = 0;
   2429			} else
   2430				*val = left == right;
   2431			break;
   2432		case '!':
   2433			ret = arg_num_eval(arg->op.left, &left);
   2434			if (!ret)
   2435				break;
   2436			ret = arg_num_eval(arg->op.right, &right);
   2437			if (!ret)
   2438				break;
   2439
   2440			switch (arg->op.op[1]) {
   2441			case '=':
   2442				*val = left != right;
   2443				break;
   2444			default:
   2445				do_warning("unknown op '%s'", arg->op.op);
   2446				ret = 0;
   2447			}
   2448			break;
   2449		case '-':
   2450			/* check for negative */
   2451			if (arg->op.left->type == TEP_PRINT_NULL)
   2452				left = 0;
   2453			else
   2454				ret = arg_num_eval(arg->op.left, &left);
   2455			if (!ret)
   2456				break;
   2457			ret = arg_num_eval(arg->op.right, &right);
   2458			if (!ret)
   2459				break;
   2460			*val = left - right;
   2461			break;
   2462		case '+':
   2463			if (arg->op.left->type == TEP_PRINT_NULL)
   2464				left = 0;
   2465			else
   2466				ret = arg_num_eval(arg->op.left, &left);
   2467			if (!ret)
   2468				break;
   2469			ret = arg_num_eval(arg->op.right, &right);
   2470			if (!ret)
   2471				break;
   2472			*val = left + right;
   2473			break;
   2474		case '~':
   2475			ret = arg_num_eval(arg->op.right, &right);
   2476			if (!ret)
   2477				break;
   2478			*val = ~right;
   2479			break;
   2480		default:
   2481			do_warning("unknown op '%s'", arg->op.op);
   2482			ret = 0;
   2483		}
   2484		break;
   2485
   2486	case TEP_PRINT_NULL:
   2487	case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
   2488	case TEP_PRINT_STRING:
   2489	case TEP_PRINT_BSTRING:
   2490	case TEP_PRINT_BITMASK:
   2491	default:
   2492		do_warning("invalid eval type %d", arg->type);
   2493		ret = 0;
   2494
   2495	}
   2496	return ret;
   2497}
   2498
   2499static char *arg_eval (struct tep_print_arg *arg)
   2500{
   2501	long long val;
   2502	static char buf[24];
   2503
   2504	switch (arg->type) {
   2505	case TEP_PRINT_ATOM:
   2506		return arg->atom.atom;
   2507	case TEP_PRINT_TYPE:
   2508		return arg_eval(arg->typecast.item);
   2509	case TEP_PRINT_OP:
   2510		if (!arg_num_eval(arg, &val))
   2511			break;
   2512		sprintf(buf, "%lld", val);
   2513		return buf;
   2514
   2515	case TEP_PRINT_NULL:
   2516	case TEP_PRINT_FIELD ... TEP_PRINT_SYMBOL:
   2517	case TEP_PRINT_STRING:
   2518	case TEP_PRINT_BSTRING:
   2519	case TEP_PRINT_BITMASK:
   2520	default:
   2521		do_warning("invalid eval type %d", arg->type);
   2522		break;
   2523	}
   2524
   2525	return NULL;
   2526}
   2527
   2528static enum tep_event_type
   2529process_fields(struct tep_event *event, struct tep_print_flag_sym **list, char **tok)
   2530{
   2531	enum tep_event_type type;
   2532	struct tep_print_arg *arg = NULL;
   2533	struct tep_print_flag_sym *field;
   2534	char *token = *tok;
   2535	char *value;
   2536
   2537	do {
   2538		free_token(token);
   2539		type = read_token_item(&token);
   2540		if (test_type_token(type, token, TEP_EVENT_OP, "{"))
   2541			break;
   2542
   2543		arg = alloc_arg();
   2544		if (!arg)
   2545			goto out_free;
   2546
   2547		free_token(token);
   2548		type = process_arg(event, arg, &token);
   2549
   2550		if (type == TEP_EVENT_OP)
   2551			type = process_op(event, arg, &token);
   2552
   2553		if (type == TEP_EVENT_ERROR)
   2554			goto out_free;
   2555
   2556		if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
   2557			goto out_free;
   2558
   2559		field = calloc(1, sizeof(*field));
   2560		if (!field)
   2561			goto out_free;
   2562
   2563		value = arg_eval(arg);
   2564		if (value == NULL)
   2565			goto out_free_field;
   2566		field->value = strdup(value);
   2567		if (field->value == NULL)
   2568			goto out_free_field;
   2569
   2570		free_arg(arg);
   2571		arg = alloc_arg();
   2572		if (!arg)
   2573			goto out_free;
   2574
   2575		free_token(token);
   2576		type = process_arg(event, arg, &token);
   2577		if (test_type_token(type, token, TEP_EVENT_OP, "}"))
   2578			goto out_free_field;
   2579
   2580		value = arg_eval(arg);
   2581		if (value == NULL)
   2582			goto out_free_field;
   2583		field->str = strdup(value);
   2584		if (field->str == NULL)
   2585			goto out_free_field;
   2586		free_arg(arg);
   2587		arg = NULL;
   2588
   2589		*list = field;
   2590		list = &field->next;
   2591
   2592		free_token(token);
   2593		type = read_token_item(&token);
   2594	} while (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0);
   2595
   2596	*tok = token;
   2597	return type;
   2598
   2599out_free_field:
   2600	free_flag_sym(field);
   2601out_free:
   2602	free_arg(arg);
   2603	free_token(token);
   2604	*tok = NULL;
   2605
   2606	return TEP_EVENT_ERROR;
   2607}
   2608
   2609static enum tep_event_type
   2610process_flags(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2611{
   2612	struct tep_print_arg *field;
   2613	enum tep_event_type type;
   2614	char *token = NULL;
   2615
   2616	memset(arg, 0, sizeof(*arg));
   2617	arg->type = TEP_PRINT_FLAGS;
   2618
   2619	field = alloc_arg();
   2620	if (!field) {
   2621		do_warning_event(event, "%s: not enough memory!", __func__);
   2622		goto out_free;
   2623	}
   2624
   2625	type = process_field_arg(event, field, &token);
   2626
   2627	/* Handle operations in the first argument */
   2628	while (type == TEP_EVENT_OP)
   2629		type = process_op(event, field, &token);
   2630
   2631	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
   2632		goto out_free_field;
   2633	free_token(token);
   2634
   2635	arg->flags.field = field;
   2636
   2637	type = read_token_item(&token);
   2638	if (event_item_type(type)) {
   2639		arg->flags.delim = token;
   2640		type = read_token_item(&token);
   2641	}
   2642
   2643	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
   2644		goto out_free;
   2645
   2646	type = process_fields(event, &arg->flags.flags, &token);
   2647	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
   2648		goto out_free;
   2649
   2650	free_token(token);
   2651	type = read_token_item(tok);
   2652	return type;
   2653
   2654out_free_field:
   2655	free_arg(field);
   2656out_free:
   2657	free_token(token);
   2658	*tok = NULL;
   2659	return TEP_EVENT_ERROR;
   2660}
   2661
   2662static enum tep_event_type
   2663process_symbols(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2664{
   2665	struct tep_print_arg *field;
   2666	enum tep_event_type type;
   2667	char *token = NULL;
   2668
   2669	memset(arg, 0, sizeof(*arg));
   2670	arg->type = TEP_PRINT_SYMBOL;
   2671
   2672	field = alloc_arg();
   2673	if (!field) {
   2674		do_warning_event(event, "%s: not enough memory!", __func__);
   2675		goto out_free;
   2676	}
   2677
   2678	type = process_field_arg(event, field, &token);
   2679
   2680	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
   2681		goto out_free_field;
   2682
   2683	arg->symbol.field = field;
   2684
   2685	type = process_fields(event, &arg->symbol.symbols, &token);
   2686	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
   2687		goto out_free;
   2688
   2689	free_token(token);
   2690	type = read_token_item(tok);
   2691	return type;
   2692
   2693out_free_field:
   2694	free_arg(field);
   2695out_free:
   2696	free_token(token);
   2697	*tok = NULL;
   2698	return TEP_EVENT_ERROR;
   2699}
   2700
   2701static enum tep_event_type
   2702process_hex_common(struct tep_event *event, struct tep_print_arg *arg,
   2703		   char **tok, enum tep_print_arg_type type)
   2704{
   2705	memset(arg, 0, sizeof(*arg));
   2706	arg->type = type;
   2707
   2708	if (alloc_and_process_delim(event, ",", &arg->hex.field))
   2709		goto out;
   2710
   2711	if (alloc_and_process_delim(event, ")", &arg->hex.size))
   2712		goto free_field;
   2713
   2714	return read_token_item(tok);
   2715
   2716free_field:
   2717	free_arg(arg->hex.field);
   2718	arg->hex.field = NULL;
   2719out:
   2720	*tok = NULL;
   2721	return TEP_EVENT_ERROR;
   2722}
   2723
   2724static enum tep_event_type
   2725process_hex(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2726{
   2727	return process_hex_common(event, arg, tok, TEP_PRINT_HEX);
   2728}
   2729
   2730static enum tep_event_type
   2731process_hex_str(struct tep_event *event, struct tep_print_arg *arg,
   2732		char **tok)
   2733{
   2734	return process_hex_common(event, arg, tok, TEP_PRINT_HEX_STR);
   2735}
   2736
   2737static enum tep_event_type
   2738process_int_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2739{
   2740	memset(arg, 0, sizeof(*arg));
   2741	arg->type = TEP_PRINT_INT_ARRAY;
   2742
   2743	if (alloc_and_process_delim(event, ",", &arg->int_array.field))
   2744		goto out;
   2745
   2746	if (alloc_and_process_delim(event, ",", &arg->int_array.count))
   2747		goto free_field;
   2748
   2749	if (alloc_and_process_delim(event, ")", &arg->int_array.el_size))
   2750		goto free_size;
   2751
   2752	return read_token_item(tok);
   2753
   2754free_size:
   2755	free_arg(arg->int_array.count);
   2756	arg->int_array.count = NULL;
   2757free_field:
   2758	free_arg(arg->int_array.field);
   2759	arg->int_array.field = NULL;
   2760out:
   2761	*tok = NULL;
   2762	return TEP_EVENT_ERROR;
   2763}
   2764
   2765static enum tep_event_type
   2766process_dynamic_array(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2767{
   2768	struct tep_format_field *field;
   2769	enum tep_event_type type;
   2770	char *token;
   2771
   2772	memset(arg, 0, sizeof(*arg));
   2773	arg->type = TEP_PRINT_DYNAMIC_ARRAY;
   2774
   2775	/*
   2776	 * The item within the parenthesis is another field that holds
   2777	 * the index into where the array starts.
   2778	 */
   2779	type = read_token(&token);
   2780	*tok = token;
   2781	if (type != TEP_EVENT_ITEM)
   2782		goto out_free;
   2783
   2784	/* Find the field */
   2785
   2786	field = tep_find_field(event, token);
   2787	if (!field)
   2788		goto out_free;
   2789
   2790	arg->dynarray.field = field;
   2791	arg->dynarray.index = 0;
   2792
   2793	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
   2794		goto out_free;
   2795
   2796	free_token(token);
   2797	type = read_token_item(&token);
   2798	*tok = token;
   2799	if (type != TEP_EVENT_OP || strcmp(token, "[") != 0)
   2800		return type;
   2801
   2802	free_token(token);
   2803	arg = alloc_arg();
   2804	if (!arg) {
   2805		do_warning_event(event, "%s: not enough memory!", __func__);
   2806		*tok = NULL;
   2807		return TEP_EVENT_ERROR;
   2808	}
   2809
   2810	type = process_arg(event, arg, &token);
   2811	if (type == TEP_EVENT_ERROR)
   2812		goto out_free_arg;
   2813
   2814	if (!test_type_token(type, token, TEP_EVENT_OP, "]"))
   2815		goto out_free_arg;
   2816
   2817	free_token(token);
   2818	type = read_token_item(tok);
   2819	return type;
   2820
   2821 out_free_arg:
   2822	free_arg(arg);
   2823 out_free:
   2824	free_token(token);
   2825	*tok = NULL;
   2826	return TEP_EVENT_ERROR;
   2827}
   2828
   2829static enum tep_event_type
   2830process_dynamic_array_len(struct tep_event *event, struct tep_print_arg *arg,
   2831			  char **tok)
   2832{
   2833	struct tep_format_field *field;
   2834	enum tep_event_type type;
   2835	char *token;
   2836
   2837	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   2838		goto out_free;
   2839
   2840	arg->type = TEP_PRINT_DYNAMIC_ARRAY_LEN;
   2841
   2842	/* Find the field */
   2843	field = tep_find_field(event, token);
   2844	if (!field)
   2845		goto out_free;
   2846
   2847	arg->dynarray.field = field;
   2848	arg->dynarray.index = 0;
   2849
   2850	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
   2851		goto out_err;
   2852
   2853	free_token(token);
   2854	type = read_token(&token);
   2855	*tok = token;
   2856
   2857	return type;
   2858
   2859 out_free:
   2860	free_token(token);
   2861 out_err:
   2862	*tok = NULL;
   2863	return TEP_EVENT_ERROR;
   2864}
   2865
   2866static enum tep_event_type
   2867process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   2868{
   2869	struct tep_print_arg *item_arg;
   2870	enum tep_event_type type;
   2871	char *token;
   2872
   2873	type = process_arg(event, arg, &token);
   2874
   2875	if (type == TEP_EVENT_ERROR)
   2876		goto out_free;
   2877
   2878	if (type == TEP_EVENT_OP)
   2879		type = process_op(event, arg, &token);
   2880
   2881	if (type == TEP_EVENT_ERROR)
   2882		goto out_free;
   2883
   2884	if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
   2885		goto out_free;
   2886
   2887	free_token(token);
   2888	type = read_token_item(&token);
   2889
   2890	/*
   2891	 * If the next token is an item or another open paren, then
   2892	 * this was a typecast.
   2893	 */
   2894	if (event_item_type(type) ||
   2895	    (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0)) {
   2896
   2897		/* make this a typecast and contine */
   2898
   2899		/* prevous must be an atom */
   2900		if (arg->type != TEP_PRINT_ATOM) {
   2901			do_warning_event(event, "previous needed to be TEP_PRINT_ATOM");
   2902			goto out_free;
   2903		}
   2904
   2905		item_arg = alloc_arg();
   2906		if (!item_arg) {
   2907			do_warning_event(event, "%s: not enough memory!",
   2908					 __func__);
   2909			goto out_free;
   2910		}
   2911
   2912		arg->type = TEP_PRINT_TYPE;
   2913		arg->typecast.type = arg->atom.atom;
   2914		arg->typecast.item = item_arg;
   2915		type = process_arg_token(event, item_arg, &token, type);
   2916
   2917	}
   2918
   2919	*tok = token;
   2920	return type;
   2921
   2922 out_free:
   2923	free_token(token);
   2924	*tok = NULL;
   2925	return TEP_EVENT_ERROR;
   2926}
   2927
   2928
   2929static enum tep_event_type
   2930process_str(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
   2931	    char **tok)
   2932{
   2933	enum tep_event_type type;
   2934	char *token;
   2935
   2936	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   2937		goto out_free;
   2938
   2939	arg->type = TEP_PRINT_STRING;
   2940	arg->string.string = token;
   2941	arg->string.field = NULL;
   2942
   2943	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
   2944		goto out_err;
   2945
   2946	type = read_token(&token);
   2947	*tok = token;
   2948
   2949	return type;
   2950
   2951 out_free:
   2952	free_token(token);
   2953 out_err:
   2954	*tok = NULL;
   2955	return TEP_EVENT_ERROR;
   2956}
   2957
   2958static enum tep_event_type
   2959process_bitmask(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
   2960		char **tok)
   2961{
   2962	enum tep_event_type type;
   2963	char *token;
   2964
   2965	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   2966		goto out_free;
   2967
   2968	arg->type = TEP_PRINT_BITMASK;
   2969	arg->bitmask.bitmask = token;
   2970	arg->bitmask.field = NULL;
   2971
   2972	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
   2973		goto out_err;
   2974
   2975	type = read_token(&token);
   2976	*tok = token;
   2977
   2978	return type;
   2979
   2980 out_free:
   2981	free_token(token);
   2982 out_err:
   2983	*tok = NULL;
   2984	return TEP_EVENT_ERROR;
   2985}
   2986
   2987static struct tep_function_handler *
   2988find_func_handler(struct tep_handle *tep, char *func_name)
   2989{
   2990	struct tep_function_handler *func;
   2991
   2992	if (!tep)
   2993		return NULL;
   2994
   2995	for (func = tep->func_handlers; func; func = func->next) {
   2996		if (strcmp(func->name, func_name) == 0)
   2997			break;
   2998	}
   2999
   3000	return func;
   3001}
   3002
   3003static void remove_func_handler(struct tep_handle *tep, char *func_name)
   3004{
   3005	struct tep_function_handler *func;
   3006	struct tep_function_handler **next;
   3007
   3008	next = &tep->func_handlers;
   3009	while ((func = *next)) {
   3010		if (strcmp(func->name, func_name) == 0) {
   3011			*next = func->next;
   3012			free_func_handle(func);
   3013			break;
   3014		}
   3015		next = &func->next;
   3016	}
   3017}
   3018
   3019static enum tep_event_type
   3020process_func_handler(struct tep_event *event, struct tep_function_handler *func,
   3021		     struct tep_print_arg *arg, char **tok)
   3022{
   3023	struct tep_print_arg **next_arg;
   3024	struct tep_print_arg *farg;
   3025	enum tep_event_type type;
   3026	char *token;
   3027	int i;
   3028
   3029	arg->type = TEP_PRINT_FUNC;
   3030	arg->func.func = func;
   3031
   3032	*tok = NULL;
   3033
   3034	next_arg = &(arg->func.args);
   3035	for (i = 0; i < func->nr_args; i++) {
   3036		farg = alloc_arg();
   3037		if (!farg) {
   3038			do_warning_event(event, "%s: not enough memory!",
   3039					 __func__);
   3040			return TEP_EVENT_ERROR;
   3041		}
   3042
   3043		type = process_arg(event, farg, &token);
   3044		if (i < (func->nr_args - 1)) {
   3045			if (type != TEP_EVENT_DELIM || strcmp(token, ",") != 0) {
   3046				do_warning_event(event,
   3047					"Error: function '%s()' expects %d arguments but event %s only uses %d",
   3048					func->name, func->nr_args,
   3049					event->name, i + 1);
   3050				goto err;
   3051			}
   3052		} else {
   3053			if (type != TEP_EVENT_DELIM || strcmp(token, ")") != 0) {
   3054				do_warning_event(event,
   3055					"Error: function '%s()' only expects %d arguments but event %s has more",
   3056					func->name, func->nr_args, event->name);
   3057				goto err;
   3058			}
   3059		}
   3060
   3061		*next_arg = farg;
   3062		next_arg = &(farg->next);
   3063		free_token(token);
   3064	}
   3065
   3066	type = read_token(&token);
   3067	*tok = token;
   3068
   3069	return type;
   3070
   3071err:
   3072	free_arg(farg);
   3073	free_token(token);
   3074	return TEP_EVENT_ERROR;
   3075}
   3076
   3077static enum tep_event_type
   3078process_builtin_expect(struct tep_event *event, struct tep_print_arg *arg, char **tok)
   3079{
   3080	enum tep_event_type type;
   3081	char *token = NULL;
   3082
   3083	/* Handle __builtin_expect( cond, #) */
   3084	type = process_arg(event, arg, &token);
   3085
   3086	if (type != TEP_EVENT_DELIM || token[0] != ',')
   3087		goto out_free;
   3088
   3089	free_token(token);
   3090
   3091	/* We don't care what the second parameter is of the __builtin_expect() */
   3092	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   3093		goto out_free;
   3094
   3095	if (read_expected(TEP_EVENT_DELIM, ")") < 0)
   3096		goto out_free;
   3097
   3098	free_token(token);
   3099	type = read_token_item(tok);
   3100	return type;
   3101
   3102out_free:
   3103	free_token(token);
   3104	*tok = NULL;
   3105	return TEP_EVENT_ERROR;
   3106}
   3107
   3108static enum tep_event_type
   3109process_function(struct tep_event *event, struct tep_print_arg *arg,
   3110		 char *token, char **tok)
   3111{
   3112	struct tep_function_handler *func;
   3113
   3114	if (strcmp(token, "__print_flags") == 0) {
   3115		free_token(token);
   3116		is_flag_field = 1;
   3117		return process_flags(event, arg, tok);
   3118	}
   3119	if (strcmp(token, "__print_symbolic") == 0) {
   3120		free_token(token);
   3121		is_symbolic_field = 1;
   3122		return process_symbols(event, arg, tok);
   3123	}
   3124	if (strcmp(token, "__print_hex") == 0) {
   3125		free_token(token);
   3126		return process_hex(event, arg, tok);
   3127	}
   3128	if (strcmp(token, "__print_hex_str") == 0) {
   3129		free_token(token);
   3130		return process_hex_str(event, arg, tok);
   3131	}
   3132	if (strcmp(token, "__print_array") == 0) {
   3133		free_token(token);
   3134		return process_int_array(event, arg, tok);
   3135	}
   3136	if (strcmp(token, "__get_str") == 0 ||
   3137	    strcmp(token, "__get_rel_str") == 0) {
   3138		free_token(token);
   3139		return process_str(event, arg, tok);
   3140	}
   3141	if (strcmp(token, "__get_bitmask") == 0 ||
   3142	    strcmp(token, "__get_rel_bitmask") == 0) {
   3143		free_token(token);
   3144		return process_bitmask(event, arg, tok);
   3145	}
   3146	if (strcmp(token, "__get_dynamic_array") == 0 ||
   3147	    strcmp(token, "__get_rel_dynamic_array") == 0) {
   3148		free_token(token);
   3149		return process_dynamic_array(event, arg, tok);
   3150	}
   3151	if (strcmp(token, "__get_dynamic_array_len") == 0 ||
   3152	    strcmp(token, "__get_rel_dynamic_array_len") == 0) {
   3153		free_token(token);
   3154		return process_dynamic_array_len(event, arg, tok);
   3155	}
   3156	if (strcmp(token, "__builtin_expect") == 0) {
   3157		free_token(token);
   3158		return process_builtin_expect(event, arg, tok);
   3159	}
   3160
   3161	func = find_func_handler(event->tep, token);
   3162	if (func) {
   3163		free_token(token);
   3164		return process_func_handler(event, func, arg, tok);
   3165	}
   3166
   3167	do_warning_event(event, "function %s not defined", token);
   3168	free_token(token);
   3169	return TEP_EVENT_ERROR;
   3170}
   3171
   3172static enum tep_event_type
   3173process_arg_token(struct tep_event *event, struct tep_print_arg *arg,
   3174		  char **tok, enum tep_event_type type)
   3175{
   3176	char *token;
   3177	char *atom;
   3178
   3179	token = *tok;
   3180
   3181	switch (type) {
   3182	case TEP_EVENT_ITEM:
   3183		if (strcmp(token, "REC") == 0) {
   3184			free_token(token);
   3185			type = process_entry(event, arg, &token);
   3186			break;
   3187		}
   3188		atom = token;
   3189		/* test the next token */
   3190		type = read_token_item(&token);
   3191
   3192		/*
   3193		 * If the next token is a parenthesis, then this
   3194		 * is a function.
   3195		 */
   3196		if (type == TEP_EVENT_DELIM && strcmp(token, "(") == 0) {
   3197			free_token(token);
   3198			token = NULL;
   3199			/* this will free atom. */
   3200			type = process_function(event, arg, atom, &token);
   3201			break;
   3202		}
   3203		/* atoms can be more than one token long */
   3204		while (type == TEP_EVENT_ITEM) {
   3205			int ret;
   3206
   3207			ret = append(&atom, " ", token);
   3208			if (ret < 0) {
   3209				free(atom);
   3210				*tok = NULL;
   3211				free_token(token);
   3212				return TEP_EVENT_ERROR;
   3213			}
   3214			free_token(token);
   3215			type = read_token_item(&token);
   3216		}
   3217
   3218		arg->type = TEP_PRINT_ATOM;
   3219		arg->atom.atom = atom;
   3220		break;
   3221
   3222	case TEP_EVENT_DQUOTE:
   3223	case TEP_EVENT_SQUOTE:
   3224		arg->type = TEP_PRINT_ATOM;
   3225		arg->atom.atom = token;
   3226		type = read_token_item(&token);
   3227		break;
   3228	case TEP_EVENT_DELIM:
   3229		if (strcmp(token, "(") == 0) {
   3230			free_token(token);
   3231			type = process_paren(event, arg, &token);
   3232			break;
   3233		}
   3234	case TEP_EVENT_OP:
   3235		/* handle single ops */
   3236		arg->type = TEP_PRINT_OP;
   3237		arg->op.op = token;
   3238		arg->op.left = NULL;
   3239		type = process_op(event, arg, &token);
   3240
   3241		/* On error, the op is freed */
   3242		if (type == TEP_EVENT_ERROR)
   3243			arg->op.op = NULL;
   3244
   3245		/* return error type if errored */
   3246		break;
   3247
   3248	case TEP_EVENT_ERROR ... TEP_EVENT_NEWLINE:
   3249	default:
   3250		do_warning_event(event, "unexpected type %d", type);
   3251		return TEP_EVENT_ERROR;
   3252	}
   3253	*tok = token;
   3254
   3255	return type;
   3256}
   3257
   3258static int event_read_print_args(struct tep_event *event, struct tep_print_arg **list)
   3259{
   3260	enum tep_event_type type = TEP_EVENT_ERROR;
   3261	struct tep_print_arg *arg;
   3262	char *token;
   3263	int args = 0;
   3264
   3265	do {
   3266		if (type == TEP_EVENT_NEWLINE) {
   3267			type = read_token_item(&token);
   3268			continue;
   3269		}
   3270
   3271		arg = alloc_arg();
   3272		if (!arg) {
   3273			do_warning_event(event, "%s: not enough memory!",
   3274					 __func__);
   3275			return -1;
   3276		}
   3277
   3278		type = process_arg(event, arg, &token);
   3279
   3280		if (type == TEP_EVENT_ERROR) {
   3281			free_token(token);
   3282			free_arg(arg);
   3283			return -1;
   3284		}
   3285
   3286		*list = arg;
   3287		args++;
   3288
   3289		if (type == TEP_EVENT_OP) {
   3290			type = process_op(event, arg, &token);
   3291			free_token(token);
   3292			if (type == TEP_EVENT_ERROR) {
   3293				*list = NULL;
   3294				free_arg(arg);
   3295				return -1;
   3296			}
   3297			list = &arg->next;
   3298			continue;
   3299		}
   3300
   3301		if (type == TEP_EVENT_DELIM && strcmp(token, ",") == 0) {
   3302			free_token(token);
   3303			*list = arg;
   3304			list = &arg->next;
   3305			continue;
   3306		}
   3307		break;
   3308	} while (type != TEP_EVENT_NONE);
   3309
   3310	if (type != TEP_EVENT_NONE && type != TEP_EVENT_ERROR)
   3311		free_token(token);
   3312
   3313	return args;
   3314}
   3315
   3316static int event_read_print(struct tep_event *event)
   3317{
   3318	enum tep_event_type type;
   3319	char *token;
   3320	int ret;
   3321
   3322	if (read_expected_item(TEP_EVENT_ITEM, "print") < 0)
   3323		return -1;
   3324
   3325	if (read_expected(TEP_EVENT_ITEM, "fmt") < 0)
   3326		return -1;
   3327
   3328	if (read_expected(TEP_EVENT_OP, ":") < 0)
   3329		return -1;
   3330
   3331	if (read_expect_type(TEP_EVENT_DQUOTE, &token) < 0)
   3332		goto fail;
   3333
   3334 concat:
   3335	event->print_fmt.format = token;
   3336	event->print_fmt.args = NULL;
   3337
   3338	/* ok to have no arg */
   3339	type = read_token_item(&token);
   3340
   3341	if (type == TEP_EVENT_NONE)
   3342		return 0;
   3343
   3344	/* Handle concatenation of print lines */
   3345	if (type == TEP_EVENT_DQUOTE) {
   3346		char *cat;
   3347
   3348		if (asprintf(&cat, "%s%s", event->print_fmt.format, token) < 0)
   3349			goto fail;
   3350		free_token(token);
   3351		free_token(event->print_fmt.format);
   3352		event->print_fmt.format = NULL;
   3353		token = cat;
   3354		goto concat;
   3355	}
   3356			     
   3357	if (test_type_token(type, token, TEP_EVENT_DELIM, ","))
   3358		goto fail;
   3359
   3360	free_token(token);
   3361
   3362	ret = event_read_print_args(event, &event->print_fmt.args);
   3363	if (ret < 0)
   3364		return -1;
   3365
   3366	return ret;
   3367
   3368 fail:
   3369	free_token(token);
   3370	return -1;
   3371}
   3372
   3373/**
   3374 * tep_find_common_field - return a common field by event
   3375 * @event: handle for the event
   3376 * @name: the name of the common field to return
   3377 *
   3378 * Returns a common field from the event by the given @name.
   3379 * This only searches the common fields and not all field.
   3380 */
   3381struct tep_format_field *
   3382tep_find_common_field(struct tep_event *event, const char *name)
   3383{
   3384	struct tep_format_field *format;
   3385
   3386	for (format = event->format.common_fields;
   3387	     format; format = format->next) {
   3388		if (strcmp(format->name, name) == 0)
   3389			break;
   3390	}
   3391
   3392	return format;
   3393}
   3394
   3395/**
   3396 * tep_find_field - find a non-common field
   3397 * @event: handle for the event
   3398 * @name: the name of the non-common field
   3399 *
   3400 * Returns a non-common field by the given @name.
   3401 * This does not search common fields.
   3402 */
   3403struct tep_format_field *
   3404tep_find_field(struct tep_event *event, const char *name)
   3405{
   3406	struct tep_format_field *format;
   3407
   3408	for (format = event->format.fields;
   3409	     format; format = format->next) {
   3410		if (strcmp(format->name, name) == 0)
   3411			break;
   3412	}
   3413
   3414	return format;
   3415}
   3416
   3417/**
   3418 * tep_find_any_field - find any field by name
   3419 * @event: handle for the event
   3420 * @name: the name of the field
   3421 *
   3422 * Returns a field by the given @name.
   3423 * This searches the common field names first, then
   3424 * the non-common ones if a common one was not found.
   3425 */
   3426struct tep_format_field *
   3427tep_find_any_field(struct tep_event *event, const char *name)
   3428{
   3429	struct tep_format_field *format;
   3430
   3431	format = tep_find_common_field(event, name);
   3432	if (format)
   3433		return format;
   3434	return tep_find_field(event, name);
   3435}
   3436
   3437/**
   3438 * tep_read_number - read a number from data
   3439 * @tep: a handle to the trace event parser context
   3440 * @ptr: the raw data
   3441 * @size: the size of the data that holds the number
   3442 *
   3443 * Returns the number (converted to host) from the
   3444 * raw data.
   3445 */
   3446unsigned long long tep_read_number(struct tep_handle *tep,
   3447				   const void *ptr, int size)
   3448{
   3449	unsigned long long val;
   3450
   3451	switch (size) {
   3452	case 1:
   3453		return *(unsigned char *)ptr;
   3454	case 2:
   3455		return data2host2(tep, *(unsigned short *)ptr);
   3456	case 4:
   3457		return data2host4(tep, *(unsigned int *)ptr);
   3458	case 8:
   3459		memcpy(&val, (ptr), sizeof(unsigned long long));
   3460		return data2host8(tep, val);
   3461	default:
   3462		/* BUG! */
   3463		return 0;
   3464	}
   3465}
   3466
   3467/**
   3468 * tep_read_number_field - read a number from data
   3469 * @field: a handle to the field
   3470 * @data: the raw data to read
   3471 * @value: the value to place the number in
   3472 *
   3473 * Reads raw data according to a field offset and size,
   3474 * and translates it into @value.
   3475 *
   3476 * Returns 0 on success, -1 otherwise.
   3477 */
   3478int tep_read_number_field(struct tep_format_field *field, const void *data,
   3479			  unsigned long long *value)
   3480{
   3481	if (!field)
   3482		return -1;
   3483	switch (field->size) {
   3484	case 1:
   3485	case 2:
   3486	case 4:
   3487	case 8:
   3488		*value = tep_read_number(field->event->tep,
   3489					 data + field->offset, field->size);
   3490		return 0;
   3491	default:
   3492		return -1;
   3493	}
   3494}
   3495
   3496static int get_common_info(struct tep_handle *tep,
   3497			   const char *type, int *offset, int *size)
   3498{
   3499	struct tep_event *event;
   3500	struct tep_format_field *field;
   3501
   3502	/*
   3503	 * All events should have the same common elements.
   3504	 * Pick any event to find where the type is;
   3505	 */
   3506	if (!tep->events) {
   3507		do_warning("no event_list!");
   3508		return -1;
   3509	}
   3510
   3511	event = tep->events[0];
   3512	field = tep_find_common_field(event, type);
   3513	if (!field)
   3514		return -1;
   3515
   3516	*offset = field->offset;
   3517	*size = field->size;
   3518
   3519	return 0;
   3520}
   3521
   3522static int __parse_common(struct tep_handle *tep, void *data,
   3523			  int *size, int *offset, const char *name)
   3524{
   3525	int ret;
   3526
   3527	if (!*size) {
   3528		ret = get_common_info(tep, name, offset, size);
   3529		if (ret < 0)
   3530			return ret;
   3531	}
   3532	return tep_read_number(tep, data + *offset, *size);
   3533}
   3534
   3535static int trace_parse_common_type(struct tep_handle *tep, void *data)
   3536{
   3537	return __parse_common(tep, data,
   3538			      &tep->type_size, &tep->type_offset,
   3539			      "common_type");
   3540}
   3541
   3542static int parse_common_pid(struct tep_handle *tep, void *data)
   3543{
   3544	return __parse_common(tep, data,
   3545			      &tep->pid_size, &tep->pid_offset,
   3546			      "common_pid");
   3547}
   3548
   3549static int parse_common_pc(struct tep_handle *tep, void *data)
   3550{
   3551	return __parse_common(tep, data,
   3552			      &tep->pc_size, &tep->pc_offset,
   3553			      "common_preempt_count");
   3554}
   3555
   3556static int parse_common_flags(struct tep_handle *tep, void *data)
   3557{
   3558	return __parse_common(tep, data,
   3559			      &tep->flags_size, &tep->flags_offset,
   3560			      "common_flags");
   3561}
   3562
   3563static int parse_common_lock_depth(struct tep_handle *tep, void *data)
   3564{
   3565	return __parse_common(tep, data,
   3566			      &tep->ld_size, &tep->ld_offset,
   3567			      "common_lock_depth");
   3568}
   3569
   3570static int parse_common_migrate_disable(struct tep_handle *tep, void *data)
   3571{
   3572	return __parse_common(tep, data,
   3573			      &tep->ld_size, &tep->ld_offset,
   3574			      "common_migrate_disable");
   3575}
   3576
   3577static int events_id_cmp(const void *a, const void *b);
   3578
   3579/**
   3580 * tep_find_event - find an event by given id
   3581 * @tep: a handle to the trace event parser context
   3582 * @id: the id of the event
   3583 *
   3584 * Returns an event that has a given @id.
   3585 */
   3586struct tep_event *tep_find_event(struct tep_handle *tep, int id)
   3587{
   3588	struct tep_event **eventptr;
   3589	struct tep_event key;
   3590	struct tep_event *pkey = &key;
   3591
   3592	/* Check cache first */
   3593	if (tep->last_event && tep->last_event->id == id)
   3594		return tep->last_event;
   3595
   3596	key.id = id;
   3597
   3598	eventptr = bsearch(&pkey, tep->events, tep->nr_events,
   3599			   sizeof(*tep->events), events_id_cmp);
   3600
   3601	if (eventptr) {
   3602		tep->last_event = *eventptr;
   3603		return *eventptr;
   3604	}
   3605
   3606	return NULL;
   3607}
   3608
   3609/**
   3610 * tep_find_event_by_name - find an event by given name
   3611 * @tep: a handle to the trace event parser context
   3612 * @sys: the system name to search for
   3613 * @name: the name of the event to search for
   3614 *
   3615 * This returns an event with a given @name and under the system
   3616 * @sys. If @sys is NULL the first event with @name is returned.
   3617 */
   3618struct tep_event *
   3619tep_find_event_by_name(struct tep_handle *tep,
   3620		       const char *sys, const char *name)
   3621{
   3622	struct tep_event *event = NULL;
   3623	int i;
   3624
   3625	if (tep->last_event &&
   3626	    strcmp(tep->last_event->name, name) == 0 &&
   3627	    (!sys || strcmp(tep->last_event->system, sys) == 0))
   3628		return tep->last_event;
   3629
   3630	for (i = 0; i < tep->nr_events; i++) {
   3631		event = tep->events[i];
   3632		if (strcmp(event->name, name) == 0) {
   3633			if (!sys)
   3634				break;
   3635			if (strcmp(event->system, sys) == 0)
   3636				break;
   3637		}
   3638	}
   3639	if (i == tep->nr_events)
   3640		event = NULL;
   3641
   3642	tep->last_event = event;
   3643	return event;
   3644}
   3645
   3646static unsigned long long
   3647eval_num_arg(void *data, int size, struct tep_event *event, struct tep_print_arg *arg)
   3648{
   3649	struct tep_handle *tep = event->tep;
   3650	unsigned long long val = 0;
   3651	unsigned long long left, right;
   3652	struct tep_print_arg *typearg = NULL;
   3653	struct tep_print_arg *larg;
   3654	unsigned long offset;
   3655	unsigned int field_size;
   3656
   3657	switch (arg->type) {
   3658	case TEP_PRINT_NULL:
   3659		/* ?? */
   3660		return 0;
   3661	case TEP_PRINT_ATOM:
   3662		return strtoull(arg->atom.atom, NULL, 0);
   3663	case TEP_PRINT_FIELD:
   3664		if (!arg->field.field) {
   3665			arg->field.field = tep_find_any_field(event, arg->field.name);
   3666			if (!arg->field.field)
   3667				goto out_warning_field;
   3668			
   3669		}
   3670		/* must be a number */
   3671		val = tep_read_number(tep, data + arg->field.field->offset,
   3672				      arg->field.field->size);
   3673		break;
   3674	case TEP_PRINT_FLAGS:
   3675	case TEP_PRINT_SYMBOL:
   3676	case TEP_PRINT_INT_ARRAY:
   3677	case TEP_PRINT_HEX:
   3678	case TEP_PRINT_HEX_STR:
   3679		break;
   3680	case TEP_PRINT_TYPE:
   3681		val = eval_num_arg(data, size, event, arg->typecast.item);
   3682		return eval_type(val, arg, 0);
   3683	case TEP_PRINT_STRING:
   3684	case TEP_PRINT_BSTRING:
   3685	case TEP_PRINT_BITMASK:
   3686		return 0;
   3687	case TEP_PRINT_FUNC: {
   3688		struct trace_seq s;
   3689		trace_seq_init(&s);
   3690		val = process_defined_func(&s, data, size, event, arg);
   3691		trace_seq_destroy(&s);
   3692		return val;
   3693	}
   3694	case TEP_PRINT_OP:
   3695		if (strcmp(arg->op.op, "[") == 0) {
   3696			/*
   3697			 * Arrays are special, since we don't want
   3698			 * to read the arg as is.
   3699			 */
   3700			right = eval_num_arg(data, size, event, arg->op.right);
   3701
   3702			/* handle typecasts */
   3703			larg = arg->op.left;
   3704			while (larg->type == TEP_PRINT_TYPE) {
   3705				if (!typearg)
   3706					typearg = larg;
   3707				larg = larg->typecast.item;
   3708			}
   3709
   3710			/* Default to long size */
   3711			field_size = tep->long_size;
   3712
   3713			switch (larg->type) {
   3714			case TEP_PRINT_DYNAMIC_ARRAY:
   3715				offset = tep_read_number(tep,
   3716						   data + larg->dynarray.field->offset,
   3717						   larg->dynarray.field->size);
   3718				if (larg->dynarray.field->elementsize)
   3719					field_size = larg->dynarray.field->elementsize;
   3720				/*
   3721				 * The actual length of the dynamic array is stored
   3722				 * in the top half of the field, and the offset
   3723				 * is in the bottom half of the 32 bit field.
   3724				 */
   3725				offset &= 0xffff;
   3726				offset += right;
   3727				break;
   3728			case TEP_PRINT_FIELD:
   3729				if (!larg->field.field) {
   3730					larg->field.field =
   3731						tep_find_any_field(event, larg->field.name);
   3732					if (!larg->field.field) {
   3733						arg = larg;
   3734						goto out_warning_field;
   3735					}
   3736				}
   3737				field_size = larg->field.field->elementsize;
   3738				offset = larg->field.field->offset +
   3739					right * larg->field.field->elementsize;
   3740				break;
   3741			default:
   3742				goto default_op; /* oops, all bets off */
   3743			}
   3744			val = tep_read_number(tep,
   3745					      data + offset, field_size);
   3746			if (typearg)
   3747				val = eval_type(val, typearg, 1);
   3748			break;
   3749		} else if (strcmp(arg->op.op, "?") == 0) {
   3750			left = eval_num_arg(data, size, event, arg->op.left);
   3751			arg = arg->op.right;
   3752			if (left)
   3753				val = eval_num_arg(data, size, event, arg->op.left);
   3754			else
   3755				val = eval_num_arg(data, size, event, arg->op.right);
   3756			break;
   3757		}
   3758 default_op:
   3759		left = eval_num_arg(data, size, event, arg->op.left);
   3760		right = eval_num_arg(data, size, event, arg->op.right);
   3761		switch (arg->op.op[0]) {
   3762		case '!':
   3763			switch (arg->op.op[1]) {
   3764			case 0:
   3765				val = !right;
   3766				break;
   3767			case '=':
   3768				val = left != right;
   3769				break;
   3770			default:
   3771				goto out_warning_op;
   3772			}
   3773			break;
   3774		case '~':
   3775			val = ~right;
   3776			break;
   3777		case '|':
   3778			if (arg->op.op[1])
   3779				val = left || right;
   3780			else
   3781				val = left | right;
   3782			break;
   3783		case '&':
   3784			if (arg->op.op[1])
   3785				val = left && right;
   3786			else
   3787				val = left & right;
   3788			break;
   3789		case '<':
   3790			switch (arg->op.op[1]) {
   3791			case 0:
   3792				val = left < right;
   3793				break;
   3794			case '<':
   3795				val = left << right;
   3796				break;
   3797			case '=':
   3798				val = left <= right;
   3799				break;
   3800			default:
   3801				goto out_warning_op;
   3802			}
   3803			break;
   3804		case '>':
   3805			switch (arg->op.op[1]) {
   3806			case 0:
   3807				val = left > right;
   3808				break;
   3809			case '>':
   3810				val = left >> right;
   3811				break;
   3812			case '=':
   3813				val = left >= right;
   3814				break;
   3815			default:
   3816				goto out_warning_op;
   3817			}
   3818			break;
   3819		case '=':
   3820			if (arg->op.op[1] != '=')
   3821				goto out_warning_op;
   3822
   3823			val = left == right;
   3824			break;
   3825		case '-':
   3826			val = left - right;
   3827			break;
   3828		case '+':
   3829			val = left + right;
   3830			break;
   3831		case '/':
   3832			val = left / right;
   3833			break;
   3834		case '%':
   3835			val = left % right;
   3836			break;
   3837		case '*':
   3838			val = left * right;
   3839			break;
   3840		default:
   3841			goto out_warning_op;
   3842		}
   3843		break;
   3844	case TEP_PRINT_DYNAMIC_ARRAY_LEN:
   3845		offset = tep_read_number(tep,
   3846					 data + arg->dynarray.field->offset,
   3847					 arg->dynarray.field->size);
   3848		/*
   3849		 * The total allocated length of the dynamic array is
   3850		 * stored in the top half of the field, and the offset
   3851		 * is in the bottom half of the 32 bit field.
   3852		 */
   3853		val = (unsigned long long)(offset >> 16);
   3854		break;
   3855	case TEP_PRINT_DYNAMIC_ARRAY:
   3856		/* Without [], we pass the address to the dynamic data */
   3857		offset = tep_read_number(tep,
   3858					 data + arg->dynarray.field->offset,
   3859					 arg->dynarray.field->size);
   3860		/*
   3861		 * The total allocated length of the dynamic array is
   3862		 * stored in the top half of the field, and the offset
   3863		 * is in the bottom half of the 32 bit field.
   3864		 */
   3865		offset &= 0xffff;
   3866		val = (unsigned long long)((unsigned long)data + offset);
   3867		break;
   3868	default: /* not sure what to do there */
   3869		return 0;
   3870	}
   3871	return val;
   3872
   3873out_warning_op:
   3874	do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
   3875	return 0;
   3876
   3877out_warning_field:
   3878	do_warning_event(event, "%s: field %s not found",
   3879			 __func__, arg->field.name);
   3880	return 0;
   3881}
   3882
   3883struct flag {
   3884	const char *name;
   3885	unsigned long long value;
   3886};
   3887
   3888static const struct flag flags[] = {
   3889	{ "HI_SOFTIRQ", 0 },
   3890	{ "TIMER_SOFTIRQ", 1 },
   3891	{ "NET_TX_SOFTIRQ", 2 },
   3892	{ "NET_RX_SOFTIRQ", 3 },
   3893	{ "BLOCK_SOFTIRQ", 4 },
   3894	{ "IRQ_POLL_SOFTIRQ", 5 },
   3895	{ "TASKLET_SOFTIRQ", 6 },
   3896	{ "SCHED_SOFTIRQ", 7 },
   3897	{ "HRTIMER_SOFTIRQ", 8 },
   3898	{ "RCU_SOFTIRQ", 9 },
   3899
   3900	{ "HRTIMER_NORESTART", 0 },
   3901	{ "HRTIMER_RESTART", 1 },
   3902};
   3903
   3904static long long eval_flag(const char *flag)
   3905{
   3906	int i;
   3907
   3908	/*
   3909	 * Some flags in the format files do not get converted.
   3910	 * If the flag is not numeric, see if it is something that
   3911	 * we already know about.
   3912	 */
   3913	if (isdigit(flag[0]))
   3914		return strtoull(flag, NULL, 0);
   3915
   3916	for (i = 0; i < (int)(sizeof(flags)/sizeof(flags[0])); i++)
   3917		if (strcmp(flags[i].name, flag) == 0)
   3918			return flags[i].value;
   3919
   3920	return -1LL;
   3921}
   3922
   3923static void print_str_to_seq(struct trace_seq *s, const char *format,
   3924			     int len_arg, const char *str)
   3925{
   3926	if (len_arg >= 0)
   3927		trace_seq_printf(s, format, len_arg, str);
   3928	else
   3929		trace_seq_printf(s, format, str);
   3930}
   3931
   3932static void print_bitmask_to_seq(struct tep_handle *tep,
   3933				 struct trace_seq *s, const char *format,
   3934				 int len_arg, const void *data, int size)
   3935{
   3936	int nr_bits = size * 8;
   3937	int str_size = (nr_bits + 3) / 4;
   3938	int len = 0;
   3939	char buf[3];
   3940	char *str;
   3941	int index;
   3942	int i;
   3943
   3944	/*
   3945	 * The kernel likes to put in commas every 32 bits, we
   3946	 * can do the same.
   3947	 */
   3948	str_size += (nr_bits - 1) / 32;
   3949
   3950	str = malloc(str_size + 1);
   3951	if (!str) {
   3952		do_warning("%s: not enough memory!", __func__);
   3953		return;
   3954	}
   3955	str[str_size] = 0;
   3956
   3957	/* Start out with -2 for the two chars per byte */
   3958	for (i = str_size - 2; i >= 0; i -= 2) {
   3959		/*
   3960		 * data points to a bit mask of size bytes.
   3961		 * In the kernel, this is an array of long words, thus
   3962		 * endianness is very important.
   3963		 */
   3964		if (tep->file_bigendian)
   3965			index = size - (len + 1);
   3966		else
   3967			index = len;
   3968
   3969		snprintf(buf, 3, "%02x", *((unsigned char *)data + index));
   3970		memcpy(str + i, buf, 2);
   3971		len++;
   3972		if (!(len & 3) && i > 0) {
   3973			i--;
   3974			str[i] = ',';
   3975		}
   3976	}
   3977
   3978	if (len_arg >= 0)
   3979		trace_seq_printf(s, format, len_arg, str);
   3980	else
   3981		trace_seq_printf(s, format, str);
   3982
   3983	free(str);
   3984}
   3985
   3986static void print_str_arg(struct trace_seq *s, void *data, int size,
   3987			  struct tep_event *event, const char *format,
   3988			  int len_arg, struct tep_print_arg *arg)
   3989{
   3990	struct tep_handle *tep = event->tep;
   3991	struct tep_print_flag_sym *flag;
   3992	struct tep_format_field *field;
   3993	struct printk_map *printk;
   3994	long long val, fval;
   3995	unsigned long long addr;
   3996	char *str;
   3997	unsigned char *hex;
   3998	int print;
   3999	int i, len;
   4000
   4001	switch (arg->type) {
   4002	case TEP_PRINT_NULL:
   4003		/* ?? */
   4004		return;
   4005	case TEP_PRINT_ATOM:
   4006		print_str_to_seq(s, format, len_arg, arg->atom.atom);
   4007		return;
   4008	case TEP_PRINT_FIELD:
   4009		field = arg->field.field;
   4010		if (!field) {
   4011			field = tep_find_any_field(event, arg->field.name);
   4012			if (!field) {
   4013				str = arg->field.name;
   4014				goto out_warning_field;
   4015			}
   4016			arg->field.field = field;
   4017		}
   4018		/* Zero sized fields, mean the rest of the data */
   4019		len = field->size ? : size - field->offset;
   4020
   4021		/*
   4022		 * Some events pass in pointers. If this is not an array
   4023		 * and the size is the same as long_size, assume that it
   4024		 * is a pointer.
   4025		 */
   4026		if (!(field->flags & TEP_FIELD_IS_ARRAY) &&
   4027		    field->size == tep->long_size) {
   4028
   4029			/* Handle heterogeneous recording and processing
   4030			 * architectures
   4031			 *
   4032			 * CASE I:
   4033			 * Traces recorded on 32-bit devices (32-bit
   4034			 * addressing) and processed on 64-bit devices:
   4035			 * In this case, only 32 bits should be read.
   4036			 *
   4037			 * CASE II:
   4038			 * Traces recorded on 64 bit devices and processed
   4039			 * on 32-bit devices:
   4040			 * In this case, 64 bits must be read.
   4041			 */
   4042			addr = (tep->long_size == 8) ?
   4043				*(unsigned long long *)(data + field->offset) :
   4044				(unsigned long long)*(unsigned int *)(data + field->offset);
   4045
   4046			/* Check if it matches a print format */
   4047			printk = find_printk(tep, addr);
   4048			if (printk)
   4049				trace_seq_puts(s, printk->printk);
   4050			else
   4051				trace_seq_printf(s, "%llx", addr);
   4052			break;
   4053		}
   4054		str = malloc(len + 1);
   4055		if (!str) {
   4056			do_warning_event(event, "%s: not enough memory!",
   4057					 __func__);
   4058			return;
   4059		}
   4060		memcpy(str, data + field->offset, len);
   4061		str[len] = 0;
   4062		print_str_to_seq(s, format, len_arg, str);
   4063		free(str);
   4064		break;
   4065	case TEP_PRINT_FLAGS:
   4066		val = eval_num_arg(data, size, event, arg->flags.field);
   4067		print = 0;
   4068		for (flag = arg->flags.flags; flag; flag = flag->next) {
   4069			fval = eval_flag(flag->value);
   4070			if (!val && fval < 0) {
   4071				print_str_to_seq(s, format, len_arg, flag->str);
   4072				break;
   4073			}
   4074			if (fval > 0 && (val & fval) == fval) {
   4075				if (print && arg->flags.delim)
   4076					trace_seq_puts(s, arg->flags.delim);
   4077				print_str_to_seq(s, format, len_arg, flag->str);
   4078				print = 1;
   4079				val &= ~fval;
   4080			}
   4081		}
   4082		if (val) {
   4083			if (print && arg->flags.delim)
   4084				trace_seq_puts(s, arg->flags.delim);
   4085			trace_seq_printf(s, "0x%llx", val);
   4086		}
   4087		break;
   4088	case TEP_PRINT_SYMBOL:
   4089		val = eval_num_arg(data, size, event, arg->symbol.field);
   4090		for (flag = arg->symbol.symbols; flag; flag = flag->next) {
   4091			fval = eval_flag(flag->value);
   4092			if (val == fval) {
   4093				print_str_to_seq(s, format, len_arg, flag->str);
   4094				break;
   4095			}
   4096		}
   4097		if (!flag)
   4098			trace_seq_printf(s, "0x%llx", val);
   4099		break;
   4100	case TEP_PRINT_HEX:
   4101	case TEP_PRINT_HEX_STR:
   4102		if (arg->hex.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
   4103			unsigned long offset;
   4104			offset = tep_read_number(tep,
   4105				data + arg->hex.field->dynarray.field->offset,
   4106				arg->hex.field->dynarray.field->size);
   4107			hex = data + (offset & 0xffff);
   4108		} else {
   4109			field = arg->hex.field->field.field;
   4110			if (!field) {
   4111				str = arg->hex.field->field.name;
   4112				field = tep_find_any_field(event, str);
   4113				if (!field)
   4114					goto out_warning_field;
   4115				arg->hex.field->field.field = field;
   4116			}
   4117			hex = data + field->offset;
   4118		}
   4119		len = eval_num_arg(data, size, event, arg->hex.size);
   4120		for (i = 0; i < len; i++) {
   4121			if (i && arg->type == TEP_PRINT_HEX)
   4122				trace_seq_putc(s, ' ');
   4123			trace_seq_printf(s, "%02x", hex[i]);
   4124		}
   4125		break;
   4126
   4127	case TEP_PRINT_INT_ARRAY: {
   4128		void *num;
   4129		int el_size;
   4130
   4131		if (arg->int_array.field->type == TEP_PRINT_DYNAMIC_ARRAY) {
   4132			unsigned long offset;
   4133			struct tep_format_field *field =
   4134				arg->int_array.field->dynarray.field;
   4135			offset = tep_read_number(tep,
   4136						 data + field->offset,
   4137						 field->size);
   4138			num = data + (offset & 0xffff);
   4139		} else {
   4140			field = arg->int_array.field->field.field;
   4141			if (!field) {
   4142				str = arg->int_array.field->field.name;
   4143				field = tep_find_any_field(event, str);
   4144				if (!field)
   4145					goto out_warning_field;
   4146				arg->int_array.field->field.field = field;
   4147			}
   4148			num = data + field->offset;
   4149		}
   4150		len = eval_num_arg(data, size, event, arg->int_array.count);
   4151		el_size = eval_num_arg(data, size, event,
   4152				       arg->int_array.el_size);
   4153		for (i = 0; i < len; i++) {
   4154			if (i)
   4155				trace_seq_putc(s, ' ');
   4156
   4157			if (el_size == 1) {
   4158				trace_seq_printf(s, "%u", *(uint8_t *)num);
   4159			} else if (el_size == 2) {
   4160				trace_seq_printf(s, "%u", *(uint16_t *)num);
   4161			} else if (el_size == 4) {
   4162				trace_seq_printf(s, "%u", *(uint32_t *)num);
   4163			} else if (el_size == 8) {
   4164				trace_seq_printf(s, "%"PRIu64, *(uint64_t *)num);
   4165			} else {
   4166				trace_seq_printf(s, "BAD SIZE:%d 0x%x",
   4167						 el_size, *(uint8_t *)num);
   4168				el_size = 1;
   4169			}
   4170
   4171			num += el_size;
   4172		}
   4173		break;
   4174	}
   4175	case TEP_PRINT_TYPE:
   4176		break;
   4177	case TEP_PRINT_STRING: {
   4178		int str_offset;
   4179
   4180		if (!arg->string.field)
   4181			arg->string.field = tep_find_any_field(event, arg->string.string);
   4182		if (!arg->string.field)
   4183			break;
   4184
   4185		str_offset = data2host4(tep,
   4186				*(unsigned int *)(data + arg->string.field->offset));
   4187		str_offset &= 0xffff;
   4188		if (arg->string.field->flags & TEP_FIELD_IS_RELATIVE)
   4189			str_offset += arg->string.field->offset + arg->string.field->size;
   4190		print_str_to_seq(s, format, len_arg, ((char *)data) + str_offset);
   4191		break;
   4192	}
   4193	case TEP_PRINT_BSTRING:
   4194		print_str_to_seq(s, format, len_arg, arg->string.string);
   4195		break;
   4196	case TEP_PRINT_BITMASK: {
   4197		int bitmask_offset;
   4198		int bitmask_size;
   4199
   4200		if (!arg->bitmask.field)
   4201			arg->bitmask.field = tep_find_any_field(event, arg->bitmask.bitmask);
   4202		if (!arg->bitmask.field)
   4203			break;
   4204		bitmask_offset = data2host4(tep,
   4205				*(unsigned int *)(data + arg->bitmask.field->offset));
   4206		bitmask_size = bitmask_offset >> 16;
   4207		bitmask_offset &= 0xffff;
   4208		if (arg->bitmask.field->flags & TEP_FIELD_IS_RELATIVE)
   4209			bitmask_offset += arg->bitmask.field->offset + arg->bitmask.field->size;
   4210		print_bitmask_to_seq(tep, s, format, len_arg,
   4211				     data + bitmask_offset, bitmask_size);
   4212		break;
   4213	}
   4214	case TEP_PRINT_OP:
   4215		/*
   4216		 * The only op for string should be ? :
   4217		 */
   4218		if (arg->op.op[0] != '?')
   4219			return;
   4220		val = eval_num_arg(data, size, event, arg->op.left);
   4221		if (val)
   4222			print_str_arg(s, data, size, event,
   4223				      format, len_arg, arg->op.right->op.left);
   4224		else
   4225			print_str_arg(s, data, size, event,
   4226				      format, len_arg, arg->op.right->op.right);
   4227		break;
   4228	case TEP_PRINT_FUNC:
   4229		process_defined_func(s, data, size, event, arg);
   4230		break;
   4231	default:
   4232		/* well... */
   4233		break;
   4234	}
   4235
   4236	return;
   4237
   4238out_warning_field:
   4239	do_warning_event(event, "%s: field %s not found",
   4240			 __func__, arg->field.name);
   4241}
   4242
   4243static unsigned long long
   4244process_defined_func(struct trace_seq *s, void *data, int size,
   4245		     struct tep_event *event, struct tep_print_arg *arg)
   4246{
   4247	struct tep_function_handler *func_handle = arg->func.func;
   4248	struct func_params *param;
   4249	unsigned long long *args;
   4250	unsigned long long ret;
   4251	struct tep_print_arg *farg;
   4252	struct trace_seq str;
   4253	struct save_str {
   4254		struct save_str *next;
   4255		char *str;
   4256	} *strings = NULL, *string;
   4257	int i;
   4258
   4259	if (!func_handle->nr_args) {
   4260		ret = (*func_handle->func)(s, NULL);
   4261		goto out;
   4262	}
   4263
   4264	farg = arg->func.args;
   4265	param = func_handle->params;
   4266
   4267	ret = ULLONG_MAX;
   4268	args = malloc(sizeof(*args) * func_handle->nr_args);
   4269	if (!args)
   4270		goto out;
   4271
   4272	for (i = 0; i < func_handle->nr_args; i++) {
   4273		switch (param->type) {
   4274		case TEP_FUNC_ARG_INT:
   4275		case TEP_FUNC_ARG_LONG:
   4276		case TEP_FUNC_ARG_PTR:
   4277			args[i] = eval_num_arg(data, size, event, farg);
   4278			break;
   4279		case TEP_FUNC_ARG_STRING:
   4280			trace_seq_init(&str);
   4281			print_str_arg(&str, data, size, event, "%s", -1, farg);
   4282			trace_seq_terminate(&str);
   4283			string = malloc(sizeof(*string));
   4284			if (!string) {
   4285				do_warning_event(event, "%s(%d): malloc str",
   4286						 __func__, __LINE__);
   4287				goto out_free;
   4288			}
   4289			string->next = strings;
   4290			string->str = strdup(str.buffer);
   4291			if (!string->str) {
   4292				free(string);
   4293				do_warning_event(event, "%s(%d): malloc str",
   4294						 __func__, __LINE__);
   4295				goto out_free;
   4296			}
   4297			args[i] = (uintptr_t)string->str;
   4298			strings = string;
   4299			trace_seq_destroy(&str);
   4300			break;
   4301		default:
   4302			/*
   4303			 * Something went totally wrong, this is not
   4304			 * an input error, something in this code broke.
   4305			 */
   4306			do_warning_event(event, "Unexpected end of arguments\n");
   4307			goto out_free;
   4308		}
   4309		farg = farg->next;
   4310		param = param->next;
   4311	}
   4312
   4313	ret = (*func_handle->func)(s, args);
   4314out_free:
   4315	free(args);
   4316	while (strings) {
   4317		string = strings;
   4318		strings = string->next;
   4319		free(string->str);
   4320		free(string);
   4321	}
   4322
   4323 out:
   4324	/* TBD : handle return type here */
   4325	return ret;
   4326}
   4327
   4328static void free_args(struct tep_print_arg *args)
   4329{
   4330	struct tep_print_arg *next;
   4331
   4332	while (args) {
   4333		next = args->next;
   4334
   4335		free_arg(args);
   4336		args = next;
   4337	}
   4338}
   4339
   4340static struct tep_print_arg *make_bprint_args(char *fmt, void *data, int size, struct tep_event *event)
   4341{
   4342	struct tep_handle *tep = event->tep;
   4343	struct tep_format_field *field, *ip_field;
   4344	struct tep_print_arg *args, *arg, **next;
   4345	unsigned long long ip, val;
   4346	char *ptr;
   4347	void *bptr;
   4348	int vsize = 0;
   4349
   4350	field = tep->bprint_buf_field;
   4351	ip_field = tep->bprint_ip_field;
   4352
   4353	if (!field) {
   4354		field = tep_find_field(event, "buf");
   4355		if (!field) {
   4356			do_warning_event(event, "can't find buffer field for binary printk");
   4357			return NULL;
   4358		}
   4359		ip_field = tep_find_field(event, "ip");
   4360		if (!ip_field) {
   4361			do_warning_event(event, "can't find ip field for binary printk");
   4362			return NULL;
   4363		}
   4364		tep->bprint_buf_field = field;
   4365		tep->bprint_ip_field = ip_field;
   4366	}
   4367
   4368	ip = tep_read_number(tep, data + ip_field->offset, ip_field->size);
   4369
   4370	/*
   4371	 * The first arg is the IP pointer.
   4372	 */
   4373	args = alloc_arg();
   4374	if (!args) {
   4375		do_warning_event(event, "%s(%d): not enough memory!",
   4376				 __func__, __LINE__);
   4377		return NULL;
   4378	}
   4379	arg = args;
   4380	arg->next = NULL;
   4381	next = &arg->next;
   4382
   4383	arg->type = TEP_PRINT_ATOM;
   4384		
   4385	if (asprintf(&arg->atom.atom, "%lld", ip) < 0)
   4386		goto out_free;
   4387
   4388	/* skip the first "%ps: " */
   4389	for (ptr = fmt + 5, bptr = data + field->offset;
   4390	     bptr < data + size && *ptr; ptr++) {
   4391		int ls = 0;
   4392
   4393		if (*ptr == '%') {
   4394 process_again:
   4395			ptr++;
   4396			switch (*ptr) {
   4397			case '%':
   4398				break;
   4399			case 'l':
   4400				ls++;
   4401				goto process_again;
   4402			case 'L':
   4403				ls = 2;
   4404				goto process_again;
   4405			case '0' ... '9':
   4406				goto process_again;
   4407			case '.':
   4408				goto process_again;
   4409			case 'z':
   4410			case 'Z':
   4411				ls = 1;
   4412				goto process_again;
   4413			case 'p':
   4414				ls = 1;
   4415				if (isalnum(ptr[1])) {
   4416					ptr++;
   4417					/* Check for special pointers */
   4418					switch (*ptr) {
   4419					case 's':
   4420					case 'S':
   4421					case 'x':
   4422						break;
   4423					case 'f':
   4424					case 'F':
   4425						/*
   4426						 * Pre-5.5 kernels use %pf and
   4427						 * %pF for printing symbols
   4428						 * while kernels since 5.5 use
   4429						 * %pfw for fwnodes. So check
   4430						 * %p[fF] isn't followed by 'w'.
   4431						 */
   4432						if (ptr[1] != 'w')
   4433							break;
   4434						/* fall through */
   4435					default:
   4436						/*
   4437						 * Older kernels do not process
   4438						 * dereferenced pointers.
   4439						 * Only process if the pointer
   4440						 * value is a printable.
   4441						 */
   4442						if (isprint(*(char *)bptr))
   4443							goto process_string;
   4444					}
   4445				}
   4446				/* fall through */
   4447			case 'd':
   4448			case 'u':
   4449			case 'i':
   4450			case 'x':
   4451			case 'X':
   4452			case 'o':
   4453				switch (ls) {
   4454				case 0:
   4455					vsize = 4;
   4456					break;
   4457				case 1:
   4458					vsize = tep->long_size;
   4459					break;
   4460				case 2:
   4461					vsize = 8;
   4462					break;
   4463				default:
   4464					vsize = ls; /* ? */
   4465					break;
   4466				}
   4467			/* fall through */
   4468			case '*':
   4469				if (*ptr == '*')
   4470					vsize = 4;
   4471
   4472				/* the pointers are always 4 bytes aligned */
   4473				bptr = (void *)(((unsigned long)bptr + 3) &
   4474						~3);
   4475				val = tep_read_number(tep, bptr, vsize);
   4476				bptr += vsize;
   4477				arg = alloc_arg();
   4478				if (!arg) {
   4479					do_warning_event(event, "%s(%d): not enough memory!",
   4480						   __func__, __LINE__);
   4481					goto out_free;
   4482				}
   4483				arg->next = NULL;
   4484				arg->type = TEP_PRINT_ATOM;
   4485				if (asprintf(&arg->atom.atom, "%lld", val) < 0) {
   4486					free(arg);
   4487					goto out_free;
   4488				}
   4489				*next = arg;
   4490				next = &arg->next;
   4491				/*
   4492				 * The '*' case means that an arg is used as the length.
   4493				 * We need to continue to figure out for what.
   4494				 */
   4495				if (*ptr == '*')
   4496					goto process_again;
   4497
   4498				break;
   4499			case 's':
   4500 process_string:
   4501				arg = alloc_arg();
   4502				if (!arg) {
   4503					do_warning_event(event, "%s(%d): not enough memory!",
   4504						   __func__, __LINE__);
   4505					goto out_free;
   4506				}
   4507				arg->next = NULL;
   4508				arg->type = TEP_PRINT_BSTRING;
   4509				arg->string.string = strdup(bptr);
   4510				if (!arg->string.string)
   4511					goto out_free;
   4512				bptr += strlen(bptr) + 1;
   4513				*next = arg;
   4514				next = &arg->next;
   4515			default:
   4516				break;
   4517			}
   4518		}
   4519	}
   4520
   4521	return args;
   4522
   4523out_free:
   4524	free_args(args);
   4525	return NULL;
   4526}
   4527
   4528static char *
   4529get_bprint_format(void *data, int size __maybe_unused,
   4530		  struct tep_event *event)
   4531{
   4532	struct tep_handle *tep = event->tep;
   4533	unsigned long long addr;
   4534	struct tep_format_field *field;
   4535	struct printk_map *printk;
   4536	char *format;
   4537
   4538	field = tep->bprint_fmt_field;
   4539
   4540	if (!field) {
   4541		field = tep_find_field(event, "fmt");
   4542		if (!field) {
   4543			do_warning_event(event, "can't find format field for binary printk");
   4544			return NULL;
   4545		}
   4546		tep->bprint_fmt_field = field;
   4547	}
   4548
   4549	addr = tep_read_number(tep, data + field->offset, field->size);
   4550
   4551	printk = find_printk(tep, addr);
   4552	if (!printk) {
   4553		if (asprintf(&format, "%%ps: (NO FORMAT FOUND at %llx)\n", addr) < 0)
   4554			return NULL;
   4555		return format;
   4556	}
   4557
   4558	if (asprintf(&format, "%s: %s", "%ps", printk->printk) < 0)
   4559		return NULL;
   4560
   4561	return format;
   4562}
   4563
   4564static int print_mac_arg(struct trace_seq *s, const char *format,
   4565			 void *data, int size, struct tep_event *event,
   4566			 struct tep_print_arg *arg)
   4567{
   4568	const char *fmt = "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x";
   4569	bool reverse = false;
   4570	unsigned char *buf;
   4571	int ret = 0;
   4572
   4573	if (arg->type == TEP_PRINT_FUNC) {
   4574		process_defined_func(s, data, size, event, arg);
   4575		return 0;
   4576	}
   4577
   4578	if (arg->type != TEP_PRINT_FIELD) {
   4579		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d",
   4580				 arg->type);
   4581		return 0;
   4582	}
   4583
   4584	if (format[0] == 'm') {
   4585		fmt = "%.2x%.2x%.2x%.2x%.2x%.2x";
   4586	} else if (format[0] == 'M' && format[1] == 'F') {
   4587		fmt = "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x";
   4588		ret++;
   4589	}
   4590	if (format[1] == 'R') {
   4591		reverse = true;
   4592		ret++;
   4593	}
   4594
   4595	if (!arg->field.field) {
   4596		arg->field.field =
   4597			tep_find_any_field(event, arg->field.name);
   4598		if (!arg->field.field) {
   4599			do_warning_event(event, "%s: field %s not found",
   4600					 __func__, arg->field.name);
   4601			return ret;
   4602		}
   4603	}
   4604	if (arg->field.field->size != 6) {
   4605		trace_seq_printf(s, "INVALIDMAC");
   4606		return ret;
   4607	}
   4608
   4609	buf = data + arg->field.field->offset;
   4610	if (reverse)
   4611		trace_seq_printf(s, fmt, buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]);
   4612	else
   4613		trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
   4614
   4615	return ret;
   4616}
   4617
   4618static int parse_ip4_print_args(struct tep_handle *tep,
   4619				const char *ptr, bool *reverse)
   4620{
   4621	int ret = 0;
   4622
   4623	*reverse = false;
   4624
   4625	/* hnbl */
   4626	switch (*ptr) {
   4627	case 'h':
   4628		if (tep->file_bigendian)
   4629			*reverse = false;
   4630		else
   4631			*reverse = true;
   4632		ret++;
   4633		break;
   4634	case 'l':
   4635		*reverse = true;
   4636		ret++;
   4637		break;
   4638	case 'n':
   4639	case 'b':
   4640		ret++;
   4641		/* fall through */
   4642	default:
   4643		*reverse = false;
   4644		break;
   4645	}
   4646
   4647	return ret;
   4648}
   4649
   4650static void print_ip4_addr(struct trace_seq *s, char i, bool reverse, unsigned char *buf)
   4651{
   4652	const char *fmt;
   4653
   4654	if (i == 'i')
   4655		fmt = "%03d.%03d.%03d.%03d";
   4656	else
   4657		fmt = "%d.%d.%d.%d";
   4658
   4659	if (reverse)
   4660		trace_seq_printf(s, fmt, buf[3], buf[2], buf[1], buf[0]);
   4661	else
   4662		trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3]);
   4663
   4664}
   4665
   4666static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
   4667{
   4668	return ((unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
   4669		(unsigned long)(a->s6_addr32[2] ^ htonl(0x0000ffff))) == 0UL;
   4670}
   4671
   4672static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)
   4673{
   4674	return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE);
   4675}
   4676
   4677static void print_ip6c_addr(struct trace_seq *s, unsigned char *addr)
   4678{
   4679	int i, j, range;
   4680	unsigned char zerolength[8];
   4681	int longest = 1;
   4682	int colonpos = -1;
   4683	uint16_t word;
   4684	uint8_t hi, lo;
   4685	bool needcolon = false;
   4686	bool useIPv4;
   4687	struct in6_addr in6;
   4688
   4689	memcpy(&in6, addr, sizeof(struct in6_addr));
   4690
   4691	useIPv4 = ipv6_addr_v4mapped(&in6) || ipv6_addr_is_isatap(&in6);
   4692
   4693	memset(zerolength, 0, sizeof(zerolength));
   4694
   4695	if (useIPv4)
   4696		range = 6;
   4697	else
   4698		range = 8;
   4699
   4700	/* find position of longest 0 run */
   4701	for (i = 0; i < range; i++) {
   4702		for (j = i; j < range; j++) {
   4703			if (in6.s6_addr16[j] != 0)
   4704				break;
   4705			zerolength[i]++;
   4706		}
   4707	}
   4708	for (i = 0; i < range; i++) {
   4709		if (zerolength[i] > longest) {
   4710			longest = zerolength[i];
   4711			colonpos = i;
   4712		}
   4713	}
   4714	if (longest == 1)		/* don't compress a single 0 */
   4715		colonpos = -1;
   4716
   4717	/* emit address */
   4718	for (i = 0; i < range; i++) {
   4719		if (i == colonpos) {
   4720			if (needcolon || i == 0)
   4721				trace_seq_printf(s, ":");
   4722			trace_seq_printf(s, ":");
   4723			needcolon = false;
   4724			i += longest - 1;
   4725			continue;
   4726		}
   4727		if (needcolon) {
   4728			trace_seq_printf(s, ":");
   4729			needcolon = false;
   4730		}
   4731		/* hex u16 without leading 0s */
   4732		word = ntohs(in6.s6_addr16[i]);
   4733		hi = word >> 8;
   4734		lo = word & 0xff;
   4735		if (hi)
   4736			trace_seq_printf(s, "%x%02x", hi, lo);
   4737		else
   4738			trace_seq_printf(s, "%x", lo);
   4739
   4740		needcolon = true;
   4741	}
   4742
   4743	if (useIPv4) {
   4744		if (needcolon)
   4745			trace_seq_printf(s, ":");
   4746		print_ip4_addr(s, 'I', false, &in6.s6_addr[12]);
   4747	}
   4748
   4749	return;
   4750}
   4751
   4752static void print_ip6_addr(struct trace_seq *s, char i, unsigned char *buf)
   4753{
   4754	int j;
   4755
   4756	for (j = 0; j < 16; j += 2) {
   4757		trace_seq_printf(s, "%02x%02x", buf[j], buf[j+1]);
   4758		if (i == 'I' && j < 14)
   4759			trace_seq_printf(s, ":");
   4760	}
   4761}
   4762
   4763/*
   4764 * %pi4   print an IPv4 address with leading zeros
   4765 * %pI4   print an IPv4 address without leading zeros
   4766 * %pi6   print an IPv6 address without colons
   4767 * %pI6   print an IPv6 address with colons
   4768 * %pI6c  print an IPv6 address in compressed form with colons
   4769 * %pISpc print an IP address based on sockaddr; p adds port.
   4770 */
   4771static int print_ipv4_arg(struct trace_seq *s, const char *ptr, char i,
   4772			  void *data, int size, struct tep_event *event,
   4773			  struct tep_print_arg *arg)
   4774{
   4775	bool reverse = false;
   4776	unsigned char *buf;
   4777	int ret;
   4778
   4779	ret = parse_ip4_print_args(event->tep, ptr, &reverse);
   4780
   4781	if (arg->type == TEP_PRINT_FUNC) {
   4782		process_defined_func(s, data, size, event, arg);
   4783		return ret;
   4784	}
   4785
   4786	if (arg->type != TEP_PRINT_FIELD) {
   4787		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
   4788		return ret;
   4789	}
   4790
   4791	if (!arg->field.field) {
   4792		arg->field.field =
   4793			tep_find_any_field(event, arg->field.name);
   4794		if (!arg->field.field) {
   4795			do_warning("%s: field %s not found",
   4796				   __func__, arg->field.name);
   4797			return ret;
   4798		}
   4799	}
   4800
   4801	buf = data + arg->field.field->offset;
   4802
   4803	if (arg->field.field->size != 4) {
   4804		trace_seq_printf(s, "INVALIDIPv4");
   4805		return ret;
   4806	}
   4807
   4808	print_ip4_addr(s, i, reverse, buf);
   4809	return ret;
   4810
   4811}
   4812
   4813static int print_ipv6_arg(struct trace_seq *s, const char *ptr, char i,
   4814			  void *data, int size, struct tep_event *event,
   4815			  struct tep_print_arg *arg)
   4816{
   4817	char have_c = 0;
   4818	unsigned char *buf;
   4819	int rc = 0;
   4820
   4821	/* pI6c */
   4822	if (i == 'I' && *ptr == 'c') {
   4823		have_c = 1;
   4824		ptr++;
   4825		rc++;
   4826	}
   4827
   4828	if (arg->type == TEP_PRINT_FUNC) {
   4829		process_defined_func(s, data, size, event, arg);
   4830		return rc;
   4831	}
   4832
   4833	if (arg->type != TEP_PRINT_FIELD) {
   4834		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
   4835		return rc;
   4836	}
   4837
   4838	if (!arg->field.field) {
   4839		arg->field.field =
   4840			tep_find_any_field(event, arg->field.name);
   4841		if (!arg->field.field) {
   4842			do_warning("%s: field %s not found",
   4843				   __func__, arg->field.name);
   4844			return rc;
   4845		}
   4846	}
   4847
   4848	buf = data + arg->field.field->offset;
   4849
   4850	if (arg->field.field->size != 16) {
   4851		trace_seq_printf(s, "INVALIDIPv6");
   4852		return rc;
   4853	}
   4854
   4855	if (have_c)
   4856		print_ip6c_addr(s, buf);
   4857	else
   4858		print_ip6_addr(s, i, buf);
   4859
   4860	return rc;
   4861}
   4862
   4863static int print_ipsa_arg(struct trace_seq *s, const char *ptr, char i,
   4864			  void *data, int size, struct tep_event *event,
   4865			  struct tep_print_arg *arg)
   4866{
   4867	char have_c = 0, have_p = 0;
   4868	unsigned char *buf;
   4869	struct sockaddr_storage *sa;
   4870	bool reverse = false;
   4871	int rc = 0;
   4872	int ret;
   4873
   4874	/* pISpc */
   4875	if (i == 'I') {
   4876		if (*ptr == 'p') {
   4877			have_p = 1;
   4878			ptr++;
   4879			rc++;
   4880		}
   4881		if (*ptr == 'c') {
   4882			have_c = 1;
   4883			ptr++;
   4884			rc++;
   4885		}
   4886	}
   4887	ret = parse_ip4_print_args(event->tep, ptr, &reverse);
   4888	ptr += ret;
   4889	rc += ret;
   4890
   4891	if (arg->type == TEP_PRINT_FUNC) {
   4892		process_defined_func(s, data, size, event, arg);
   4893		return rc;
   4894	}
   4895
   4896	if (arg->type != TEP_PRINT_FIELD) {
   4897		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
   4898		return rc;
   4899	}
   4900
   4901	if (!arg->field.field) {
   4902		arg->field.field =
   4903			tep_find_any_field(event, arg->field.name);
   4904		if (!arg->field.field) {
   4905			do_warning("%s: field %s not found",
   4906				   __func__, arg->field.name);
   4907			return rc;
   4908		}
   4909	}
   4910
   4911	sa = (struct sockaddr_storage *) (data + arg->field.field->offset);
   4912
   4913	if (sa->ss_family == AF_INET) {
   4914		struct sockaddr_in *sa4 = (struct sockaddr_in *) sa;
   4915
   4916		if (arg->field.field->size < sizeof(struct sockaddr_in)) {
   4917			trace_seq_printf(s, "INVALIDIPv4");
   4918			return rc;
   4919		}
   4920
   4921		print_ip4_addr(s, i, reverse, (unsigned char *) &sa4->sin_addr);
   4922		if (have_p)
   4923			trace_seq_printf(s, ":%d", ntohs(sa4->sin_port));
   4924
   4925
   4926	} else if (sa->ss_family == AF_INET6) {
   4927		struct sockaddr_in6 *sa6 = (struct sockaddr_in6 *) sa;
   4928
   4929		if (arg->field.field->size < sizeof(struct sockaddr_in6)) {
   4930			trace_seq_printf(s, "INVALIDIPv6");
   4931			return rc;
   4932		}
   4933
   4934		if (have_p)
   4935			trace_seq_printf(s, "[");
   4936
   4937		buf = (unsigned char *) &sa6->sin6_addr;
   4938		if (have_c)
   4939			print_ip6c_addr(s, buf);
   4940		else
   4941			print_ip6_addr(s, i, buf);
   4942
   4943		if (have_p)
   4944			trace_seq_printf(s, "]:%d", ntohs(sa6->sin6_port));
   4945	}
   4946
   4947	return rc;
   4948}
   4949
   4950static int print_ip_arg(struct trace_seq *s, const char *ptr,
   4951			void *data, int size, struct tep_event *event,
   4952			struct tep_print_arg *arg)
   4953{
   4954	char i = *ptr;  /* 'i' or 'I' */
   4955	int rc = 1;
   4956
   4957	/* IP version */
   4958	ptr++;
   4959
   4960	switch (*ptr) {
   4961	case '4':
   4962		rc += print_ipv4_arg(s, ptr + 1, i, data, size, event, arg);
   4963		break;
   4964	case '6':
   4965		rc += print_ipv6_arg(s, ptr + 1, i, data, size, event, arg);
   4966		break;
   4967	case 'S':
   4968		rc += print_ipsa_arg(s, ptr + 1, i, data, size, event, arg);
   4969		break;
   4970	default:
   4971		return 0;
   4972	}
   4973
   4974	return rc;
   4975}
   4976
   4977static const int guid_index[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15};
   4978static const int uuid_index[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
   4979
   4980static int print_uuid_arg(struct trace_seq *s, const char *ptr,
   4981			void *data, int size, struct tep_event *event,
   4982			struct tep_print_arg *arg)
   4983{
   4984	const int *index = uuid_index;
   4985	char *format = "%02x";
   4986	int ret = 0;
   4987	char *buf;
   4988	int i;
   4989
   4990	switch (*(ptr + 1)) {
   4991	case 'L':
   4992		format = "%02X";
   4993		/* fall through */
   4994	case 'l':
   4995		index = guid_index;
   4996		ret++;
   4997		break;
   4998	case 'B':
   4999		format = "%02X";
   5000		/* fall through */
   5001	case 'b':
   5002		ret++;
   5003		break;
   5004	}
   5005
   5006	if (arg->type == TEP_PRINT_FUNC) {
   5007		process_defined_func(s, data, size, event, arg);
   5008		return ret;
   5009	}
   5010
   5011	if (arg->type != TEP_PRINT_FIELD) {
   5012		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
   5013		return ret;
   5014	}
   5015
   5016	if (!arg->field.field) {
   5017		arg->field.field =
   5018			tep_find_any_field(event, arg->field.name);
   5019		if (!arg->field.field) {
   5020			do_warning("%s: field %s not found",
   5021				   __func__, arg->field.name);
   5022			return ret;
   5023		}
   5024	}
   5025
   5026	if (arg->field.field->size != 16) {
   5027		trace_seq_printf(s, "INVALIDUUID");
   5028		return ret;
   5029	}
   5030
   5031	buf = data + arg->field.field->offset;
   5032
   5033	for (i = 0; i < 16; i++) {
   5034		trace_seq_printf(s, format, buf[index[i]] & 0xff);
   5035		switch (i) {
   5036		case 3:
   5037		case 5:
   5038		case 7:
   5039		case 9:
   5040			trace_seq_printf(s, "-");
   5041			break;
   5042		}
   5043	}
   5044
   5045	return ret;
   5046}
   5047
   5048static int print_raw_buff_arg(struct trace_seq *s, const char *ptr,
   5049			      void *data, int size, struct tep_event *event,
   5050			      struct tep_print_arg *arg, int print_len)
   5051{
   5052	int plen = print_len;
   5053	char *delim = " ";
   5054	int ret = 0;
   5055	char *buf;
   5056	int i;
   5057	unsigned long offset;
   5058	int arr_len;
   5059
   5060	switch (*(ptr + 1)) {
   5061	case 'C':
   5062		delim = ":";
   5063		ret++;
   5064		break;
   5065	case 'D':
   5066		delim = "-";
   5067		ret++;
   5068		break;
   5069	case 'N':
   5070		delim = "";
   5071		ret++;
   5072		break;
   5073	}
   5074
   5075	if (arg->type == TEP_PRINT_FUNC) {
   5076		process_defined_func(s, data, size, event, arg);
   5077		return ret;
   5078	}
   5079
   5080	if (arg->type != TEP_PRINT_DYNAMIC_ARRAY) {
   5081		trace_seq_printf(s, "ARG TYPE NOT FIELD BUT %d", arg->type);
   5082		return ret;
   5083	}
   5084
   5085	offset = tep_read_number(event->tep,
   5086				 data + arg->dynarray.field->offset,
   5087				 arg->dynarray.field->size);
   5088	arr_len = (unsigned long long)(offset >> 16);
   5089	buf = data + (offset & 0xffff);
   5090
   5091	if (arr_len < plen)
   5092		plen = arr_len;
   5093
   5094	if (plen < 1)
   5095		return ret;
   5096
   5097	trace_seq_printf(s, "%02x", buf[0] & 0xff);
   5098	for (i = 1; i < plen; i++)
   5099		trace_seq_printf(s, "%s%02x", delim, buf[i] & 0xff);
   5100
   5101	return ret;
   5102}
   5103
   5104static int is_printable_array(char *p, unsigned int len)
   5105{
   5106	unsigned int i;
   5107
   5108	for (i = 0; i < len && p[i]; i++)
   5109		if (!isprint(p[i]) && !isspace(p[i]))
   5110		    return 0;
   5111	return 1;
   5112}
   5113
   5114void tep_print_field(struct trace_seq *s, void *data,
   5115		     struct tep_format_field *field)
   5116{
   5117	unsigned long long val;
   5118	unsigned int offset, len, i;
   5119	struct tep_handle *tep = field->event->tep;
   5120
   5121	if (field->flags & TEP_FIELD_IS_ARRAY) {
   5122		offset = field->offset;
   5123		len = field->size;
   5124		if (field->flags & TEP_FIELD_IS_DYNAMIC) {
   5125			val = tep_read_number(tep, data + offset, len);
   5126			offset = val;
   5127			len = offset >> 16;
   5128			offset &= 0xffff;
   5129			if (field->flags & TEP_FIELD_IS_RELATIVE)
   5130				offset += field->offset + field->size;
   5131		}
   5132		if (field->flags & TEP_FIELD_IS_STRING &&
   5133		    is_printable_array(data + offset, len)) {
   5134			trace_seq_printf(s, "%s", (char *)data + offset);
   5135		} else {
   5136			trace_seq_puts(s, "ARRAY[");
   5137			for (i = 0; i < len; i++) {
   5138				if (i)
   5139					trace_seq_puts(s, ", ");
   5140				trace_seq_printf(s, "%02x",
   5141						 *((unsigned char *)data + offset + i));
   5142			}
   5143			trace_seq_putc(s, ']');
   5144			field->flags &= ~TEP_FIELD_IS_STRING;
   5145		}
   5146	} else {
   5147		val = tep_read_number(tep, data + field->offset,
   5148				      field->size);
   5149		if (field->flags & TEP_FIELD_IS_POINTER) {
   5150			trace_seq_printf(s, "0x%llx", val);
   5151		} else if (field->flags & TEP_FIELD_IS_SIGNED) {
   5152			switch (field->size) {
   5153			case 4:
   5154				/*
   5155				 * If field is long then print it in hex.
   5156				 * A long usually stores pointers.
   5157				 */
   5158				if (field->flags & TEP_FIELD_IS_LONG)
   5159					trace_seq_printf(s, "0x%x", (int)val);
   5160				else
   5161					trace_seq_printf(s, "%d", (int)val);
   5162				break;
   5163			case 2:
   5164				trace_seq_printf(s, "%2d", (short)val);
   5165				break;
   5166			case 1:
   5167				trace_seq_printf(s, "%1d", (char)val);
   5168				break;
   5169			default:
   5170				trace_seq_printf(s, "%lld", val);
   5171			}
   5172		} else {
   5173			if (field->flags & TEP_FIELD_IS_LONG)
   5174				trace_seq_printf(s, "0x%llx", val);
   5175			else
   5176				trace_seq_printf(s, "%llu", val);
   5177		}
   5178	}
   5179}
   5180
   5181void tep_print_fields(struct trace_seq *s, void *data,
   5182		      int size __maybe_unused, struct tep_event *event)
   5183{
   5184	struct tep_format_field *field;
   5185
   5186	field = event->format.fields;
   5187	while (field) {
   5188		trace_seq_printf(s, " %s=", field->name);
   5189		tep_print_field(s, data, field);
   5190		field = field->next;
   5191	}
   5192}
   5193
   5194static int print_function(struct trace_seq *s, const char *format,
   5195			  void *data, int size, struct tep_event *event,
   5196			  struct tep_print_arg *arg)
   5197{
   5198	struct func_map *func;
   5199	unsigned long long val;
   5200
   5201	val = eval_num_arg(data, size, event, arg);
   5202	func = find_func(event->tep, val);
   5203	if (func) {
   5204		trace_seq_puts(s, func->func);
   5205		if (*format == 'F' || *format == 'S')
   5206			trace_seq_printf(s, "+0x%llx", val - func->addr);
   5207	} else {
   5208		if (event->tep->long_size == 4)
   5209			trace_seq_printf(s, "0x%lx", (long)val);
   5210		else
   5211			trace_seq_printf(s, "0x%llx", (long long)val);
   5212	}
   5213
   5214	return 0;
   5215}
   5216
   5217static int print_arg_pointer(struct trace_seq *s, const char *format, int plen,
   5218			     void *data, int size,
   5219			     struct tep_event *event, struct tep_print_arg *arg)
   5220{
   5221	unsigned long long val;
   5222	int ret = 1;
   5223
   5224	if (arg->type == TEP_PRINT_BSTRING) {
   5225		trace_seq_puts(s, arg->string.string);
   5226		return 0;
   5227	}
   5228	while (*format) {
   5229		if (*format == 'p') {
   5230			format++;
   5231			break;
   5232		}
   5233		format++;
   5234	}
   5235
   5236	switch (*format) {
   5237	case 'F':
   5238	case 'f':
   5239	case 'S':
   5240	case 's':
   5241		ret += print_function(s, format, data, size, event, arg);
   5242		break;
   5243	case 'M':
   5244	case 'm':
   5245		ret += print_mac_arg(s, format, data, size, event, arg);
   5246		break;
   5247	case 'I':
   5248	case 'i':
   5249		ret += print_ip_arg(s, format, data, size, event, arg);
   5250		break;
   5251	case 'U':
   5252		ret += print_uuid_arg(s, format, data, size, event, arg);
   5253		break;
   5254	case 'h':
   5255		ret += print_raw_buff_arg(s, format, data, size, event, arg, plen);
   5256		break;
   5257	default:
   5258		ret = 0;
   5259		val = eval_num_arg(data, size, event, arg);
   5260		trace_seq_printf(s, "%p", (void *)(intptr_t)val);
   5261		break;
   5262	}
   5263
   5264	return ret;
   5265
   5266}
   5267
   5268static int print_arg_number(struct trace_seq *s, const char *format, int plen,
   5269			    void *data, int size, int ls,
   5270			    struct tep_event *event, struct tep_print_arg *arg)
   5271{
   5272	unsigned long long val;
   5273
   5274	val = eval_num_arg(data, size, event, arg);
   5275
   5276	switch (ls) {
   5277	case -2:
   5278		if (plen >= 0)
   5279			trace_seq_printf(s, format, plen, (char)val);
   5280		else
   5281			trace_seq_printf(s, format, (char)val);
   5282		break;
   5283	case -1:
   5284		if (plen >= 0)
   5285			trace_seq_printf(s, format, plen, (short)val);
   5286		else
   5287			trace_seq_printf(s, format, (short)val);
   5288		break;
   5289	case 0:
   5290		if (plen >= 0)
   5291			trace_seq_printf(s, format, plen, (int)val);
   5292		else
   5293			trace_seq_printf(s, format, (int)val);
   5294		break;
   5295	case 1:
   5296		if (plen >= 0)
   5297			trace_seq_printf(s, format, plen, (long)val);
   5298		else
   5299			trace_seq_printf(s, format, (long)val);
   5300		break;
   5301	case 2:
   5302		if (plen >= 0)
   5303			trace_seq_printf(s, format, plen, (long long)val);
   5304		else
   5305			trace_seq_printf(s, format, (long long)val);
   5306		break;
   5307	default:
   5308		do_warning_event(event, "bad count (%d)", ls);
   5309		event->flags |= TEP_EVENT_FL_FAILED;
   5310	}
   5311	return 0;
   5312}
   5313
   5314
   5315static void print_arg_string(struct trace_seq *s, const char *format, int plen,
   5316			     void *data, int size,
   5317			     struct tep_event *event, struct tep_print_arg *arg)
   5318{
   5319	struct trace_seq p;
   5320
   5321	/* Use helper trace_seq */
   5322	trace_seq_init(&p);
   5323	print_str_arg(&p, data, size, event,
   5324		      format, plen, arg);
   5325	trace_seq_terminate(&p);
   5326	trace_seq_puts(s, p.buffer);
   5327	trace_seq_destroy(&p);
   5328}
   5329
   5330static int parse_arg_format_pointer(const char *format)
   5331{
   5332	int ret = 0;
   5333	int index;
   5334	int loop;
   5335
   5336	switch (*format) {
   5337	case 'F':
   5338	case 'S':
   5339	case 'f':
   5340	case 's':
   5341		ret++;
   5342		break;
   5343	case 'M':
   5344	case 'm':
   5345		/* [mM]R , [mM]F */
   5346		switch (format[1]) {
   5347		case 'R':
   5348		case 'F':
   5349			ret++;
   5350			break;
   5351		}
   5352		ret++;
   5353		break;
   5354	case 'I':
   5355	case 'i':
   5356		index = 2;
   5357		loop = 1;
   5358		switch (format[1]) {
   5359		case 'S':
   5360			/*[S][pfs]*/
   5361			while (loop) {
   5362				switch (format[index]) {
   5363				case 'p':
   5364				case 'f':
   5365				case 's':
   5366					ret++;
   5367					index++;
   5368					break;
   5369				default:
   5370					loop = 0;
   5371					break;
   5372				}
   5373			}
   5374			/* fall through */
   5375		case '4':
   5376			/* [4S][hnbl] */
   5377			switch (format[index]) {
   5378			case 'h':
   5379			case 'n':
   5380			case 'l':
   5381			case 'b':
   5382				ret++;
   5383				index++;
   5384				break;
   5385			}
   5386			if (format[1] == '4') {
   5387				ret++;
   5388				break;
   5389			}
   5390			/* fall through */
   5391		case '6':
   5392			/* [6S]c */
   5393			if (format[index] == 'c')
   5394				ret++;
   5395			ret++;
   5396			break;
   5397		}
   5398		ret++;
   5399		break;
   5400	case 'U':
   5401		switch (format[1]) {
   5402		case 'L':
   5403		case 'l':
   5404		case 'B':
   5405		case 'b':
   5406			ret++;
   5407			break;
   5408		}
   5409		ret++;
   5410		break;
   5411	case 'h':
   5412		switch (format[1]) {
   5413		case 'C':
   5414		case 'D':
   5415		case 'N':
   5416			ret++;
   5417			break;
   5418		}
   5419		ret++;
   5420		break;
   5421	default:
   5422		break;
   5423	}
   5424
   5425	return ret;
   5426}
   5427
   5428static void free_parse_args(struct tep_print_parse *arg)
   5429{
   5430	struct tep_print_parse *del;
   5431
   5432	while (arg) {
   5433		del = arg;
   5434		arg = del->next;
   5435		free(del->format);
   5436		free(del);
   5437	}
   5438}
   5439
   5440static int parse_arg_add(struct tep_print_parse **parse, char *format,
   5441			 enum tep_print_parse_type type,
   5442			 struct tep_print_arg *arg,
   5443			 struct tep_print_arg *len_as_arg,
   5444			 int ls)
   5445{
   5446	struct tep_print_parse *parg = NULL;
   5447
   5448	parg = calloc(1, sizeof(*parg));
   5449	if (!parg)
   5450		goto error;
   5451	parg->format = strdup(format);
   5452	if (!parg->format)
   5453		goto error;
   5454	parg->type = type;
   5455	parg->arg = arg;
   5456	parg->len_as_arg = len_as_arg;
   5457	parg->ls = ls;
   5458	*parse = parg;
   5459	return 0;
   5460error:
   5461	if (parg) {
   5462		free(parg->format);
   5463		free(parg);
   5464	}
   5465	return -1;
   5466}
   5467
   5468static int parse_arg_format(struct tep_print_parse **parse,
   5469			    struct tep_event *event,
   5470			    const char *format, struct tep_print_arg **arg)
   5471{
   5472	struct tep_print_arg *len_arg = NULL;
   5473	char print_format[32];
   5474	const char *start = format;
   5475	int ret = 0;
   5476	int ls = 0;
   5477	int res;
   5478	int len;
   5479
   5480	format++;
   5481	ret++;
   5482	for (; *format; format++) {
   5483		switch (*format) {
   5484		case '#':
   5485			/* FIXME: need to handle properly */
   5486			break;
   5487		case 'h':
   5488			ls--;
   5489			break;
   5490		case 'l':
   5491			ls++;
   5492			break;
   5493		case 'L':
   5494			ls = 2;
   5495			break;
   5496		case '.':
   5497		case 'z':
   5498		case 'Z':
   5499		case '0' ... '9':
   5500		case '-':
   5501			break;
   5502		case '*':
   5503			/* The argument is the length. */
   5504			if (!*arg) {
   5505				do_warning_event(event, "no argument match");
   5506				event->flags |= TEP_EVENT_FL_FAILED;
   5507				goto out_failed;
   5508			}
   5509			if (len_arg) {
   5510				do_warning_event(event, "argument already matched");
   5511				event->flags |= TEP_EVENT_FL_FAILED;
   5512				goto out_failed;
   5513			}
   5514			len_arg = *arg;
   5515			*arg = (*arg)->next;
   5516			break;
   5517		case 'p':
   5518			if (!*arg) {
   5519				do_warning_event(event, "no argument match");
   5520				event->flags |= TEP_EVENT_FL_FAILED;
   5521				goto out_failed;
   5522			}
   5523			res = parse_arg_format_pointer(format + 1);
   5524			if (res > 0) {
   5525				format += res;
   5526				ret += res;
   5527			}
   5528			len = ((unsigned long)format + 1) -
   5529				(unsigned long)start;
   5530			/* should never happen */
   5531			if (len > 31) {
   5532				do_warning_event(event, "bad format!");
   5533				event->flags |= TEP_EVENT_FL_FAILED;
   5534				len = 31;
   5535			}
   5536			memcpy(print_format, start, len);
   5537			print_format[len] = 0;
   5538
   5539			parse_arg_add(parse, print_format,
   5540				      PRINT_FMT_ARG_POINTER, *arg, len_arg, ls);
   5541			*arg = (*arg)->next;
   5542			ret++;
   5543			return ret;
   5544		case 'd':
   5545		case 'u':
   5546		case 'i':
   5547		case 'x':
   5548		case 'X':
   5549		case 'o':
   5550			if (!*arg) {
   5551				do_warning_event(event, "no argument match");
   5552				event->flags |= TEP_EVENT_FL_FAILED;
   5553				goto out_failed;
   5554			}
   5555
   5556			len = ((unsigned long)format + 1) -
   5557				(unsigned long)start;
   5558
   5559			/* should never happen */
   5560			if (len > 30) {
   5561				do_warning_event(event, "bad format!");
   5562				event->flags |= TEP_EVENT_FL_FAILED;
   5563				len = 31;
   5564			}
   5565			memcpy(print_format, start, len);
   5566			print_format[len] = 0;
   5567
   5568			if (event->tep->long_size == 8 && ls == 1 &&
   5569			    sizeof(long) != 8) {
   5570				char *p;
   5571
   5572				/* make %l into %ll */
   5573				if (ls == 1 && (p = strchr(print_format, 'l')))
   5574					memmove(p+1, p, strlen(p)+1);
   5575				ls = 2;
   5576			}
   5577			if (ls < -2 || ls > 2) {
   5578				do_warning_event(event, "bad count (%d)", ls);
   5579				event->flags |= TEP_EVENT_FL_FAILED;
   5580			}
   5581			parse_arg_add(parse, print_format,
   5582				      PRINT_FMT_ARG_DIGIT, *arg, len_arg, ls);
   5583			*arg = (*arg)->next;
   5584			ret++;
   5585			return ret;
   5586		case 's':
   5587			if (!*arg) {
   5588				do_warning_event(event, "no matching argument");
   5589				event->flags |= TEP_EVENT_FL_FAILED;
   5590				goto out_failed;
   5591			}
   5592
   5593			len = ((unsigned long)format + 1) -
   5594				(unsigned long)start;
   5595
   5596			/* should never happen */
   5597			if (len > 31) {
   5598				do_warning_event(event, "bad format!");
   5599				event->flags |= TEP_EVENT_FL_FAILED;
   5600				len = 31;
   5601			}
   5602
   5603			memcpy(print_format, start, len);
   5604			print_format[len] = 0;
   5605
   5606			parse_arg_add(parse, print_format,
   5607					PRINT_FMT_ARG_STRING, *arg, len_arg, 0);
   5608			*arg = (*arg)->next;
   5609			ret++;
   5610			return ret;
   5611		default:
   5612			snprintf(print_format, 32, ">%c<", *format);
   5613			parse_arg_add(parse, print_format,
   5614					PRINT_FMT_STRING, NULL, NULL, 0);
   5615			ret++;
   5616			return ret;
   5617		}
   5618		ret++;
   5619	}
   5620
   5621out_failed:
   5622	return ret;
   5623
   5624}
   5625
   5626static int parse_arg_string(struct tep_print_parse **parse, const char *format)
   5627{
   5628	struct trace_seq s;
   5629	int ret = 0;
   5630
   5631	trace_seq_init(&s);
   5632	for (; *format; format++) {
   5633		if (*format == '\\') {
   5634			format++;
   5635			ret++;
   5636			switch (*format) {
   5637			case 'n':
   5638				trace_seq_putc(&s, '\n');
   5639				break;
   5640			case 't':
   5641				trace_seq_putc(&s, '\t');
   5642				break;
   5643			case 'r':
   5644				trace_seq_putc(&s, '\r');
   5645				break;
   5646			case '\\':
   5647				trace_seq_putc(&s, '\\');
   5648				break;
   5649			default:
   5650				trace_seq_putc(&s, *format);
   5651				break;
   5652			}
   5653		} else if (*format == '%') {
   5654			if (*(format + 1) == '%') {
   5655				trace_seq_putc(&s, '%');
   5656				format++;
   5657				ret++;
   5658			} else
   5659				break;
   5660		} else
   5661			trace_seq_putc(&s, *format);
   5662
   5663		ret++;
   5664	}
   5665	trace_seq_terminate(&s);
   5666	parse_arg_add(parse, s.buffer, PRINT_FMT_STRING, NULL, NULL, 0);
   5667	trace_seq_destroy(&s);
   5668
   5669	return ret;
   5670}
   5671
   5672static struct tep_print_parse *
   5673parse_args(struct tep_event *event, const char *format, struct tep_print_arg *arg)
   5674{
   5675	struct tep_print_parse *parse_ret = NULL;
   5676	struct tep_print_parse **parse = NULL;
   5677	int ret;
   5678	int len;
   5679
   5680	len = strlen(format);
   5681	while (*format) {
   5682		if (!parse_ret)
   5683			parse = &parse_ret;
   5684		if (*format == '%' && *(format + 1) != '%')
   5685			ret = parse_arg_format(parse, event, format, &arg);
   5686		else
   5687			ret = parse_arg_string(parse, format);
   5688		if (*parse)
   5689			parse = &((*parse)->next);
   5690
   5691		len -= ret;
   5692		if (len > 0)
   5693			format += ret;
   5694		else
   5695			break;
   5696	}
   5697	return parse_ret;
   5698}
   5699
   5700static void print_event_cache(struct tep_print_parse *parse, struct trace_seq *s,
   5701			      void *data, int size, struct tep_event *event)
   5702{
   5703	int len_arg;
   5704
   5705	while (parse) {
   5706		if (parse->len_as_arg)
   5707			len_arg = eval_num_arg(data, size, event, parse->len_as_arg);
   5708		switch (parse->type) {
   5709		case PRINT_FMT_ARG_DIGIT:
   5710			print_arg_number(s, parse->format,
   5711					parse->len_as_arg ? len_arg : -1, data,
   5712					 size, parse->ls, event, parse->arg);
   5713			break;
   5714		case PRINT_FMT_ARG_POINTER:
   5715			print_arg_pointer(s, parse->format,
   5716					  parse->len_as_arg ? len_arg : 1,
   5717					  data, size, event, parse->arg);
   5718			break;
   5719		case PRINT_FMT_ARG_STRING:
   5720			print_arg_string(s, parse->format,
   5721					 parse->len_as_arg ? len_arg : -1,
   5722					 data, size, event, parse->arg);
   5723			break;
   5724		case PRINT_FMT_STRING:
   5725		default:
   5726			trace_seq_printf(s, "%s", parse->format);
   5727			break;
   5728		}
   5729		parse = parse->next;
   5730	}
   5731}
   5732
   5733static void pretty_print(struct trace_seq *s, void *data, int size, struct tep_event *event)
   5734{
   5735	struct tep_print_parse *parse = event->print_fmt.print_cache;
   5736	struct tep_print_arg *args = NULL;
   5737	char *bprint_fmt = NULL;
   5738
   5739	if (event->flags & TEP_EVENT_FL_FAILED) {
   5740		trace_seq_printf(s, "[FAILED TO PARSE]");
   5741		tep_print_fields(s, data, size, event);
   5742		return;
   5743	}
   5744
   5745	if (event->flags & TEP_EVENT_FL_ISBPRINT) {
   5746		bprint_fmt = get_bprint_format(data, size, event);
   5747		args = make_bprint_args(bprint_fmt, data, size, event);
   5748		parse = parse_args(event, bprint_fmt, args);
   5749	}
   5750
   5751	print_event_cache(parse, s, data, size, event);
   5752
   5753	if (event->flags & TEP_EVENT_FL_ISBPRINT) {
   5754		free_parse_args(parse);
   5755		free_args(args);
   5756		free(bprint_fmt);
   5757	}
   5758}
   5759
   5760/*
   5761 * This parses out the Latency format (interrupts disabled,
   5762 * need rescheduling, in hard/soft interrupt, preempt count
   5763 * and lock depth) and places it into the trace_seq.
   5764 */
   5765static void data_latency_format(struct tep_handle *tep, struct trace_seq *s,
   5766				char *format, struct tep_record *record)
   5767{
   5768	static int check_lock_depth = 1;
   5769	static int check_migrate_disable = 1;
   5770	static int lock_depth_exists;
   5771	static int migrate_disable_exists;
   5772	unsigned int lat_flags;
   5773	struct trace_seq sq;
   5774	unsigned int pc;
   5775	int lock_depth = 0;
   5776	int migrate_disable = 0;
   5777	int hardirq;
   5778	int softirq;
   5779	void *data = record->data;
   5780
   5781	trace_seq_init(&sq);
   5782	lat_flags = parse_common_flags(tep, data);
   5783	pc = parse_common_pc(tep, data);
   5784	/* lock_depth may not always exist */
   5785	if (lock_depth_exists)
   5786		lock_depth = parse_common_lock_depth(tep, data);
   5787	else if (check_lock_depth) {
   5788		lock_depth = parse_common_lock_depth(tep, data);
   5789		if (lock_depth < 0)
   5790			check_lock_depth = 0;
   5791		else
   5792			lock_depth_exists = 1;
   5793	}
   5794
   5795	/* migrate_disable may not always exist */
   5796	if (migrate_disable_exists)
   5797		migrate_disable = parse_common_migrate_disable(tep, data);
   5798	else if (check_migrate_disable) {
   5799		migrate_disable = parse_common_migrate_disable(tep, data);
   5800		if (migrate_disable < 0)
   5801			check_migrate_disable = 0;
   5802		else
   5803			migrate_disable_exists = 1;
   5804	}
   5805
   5806	hardirq = lat_flags & TRACE_FLAG_HARDIRQ;
   5807	softirq = lat_flags & TRACE_FLAG_SOFTIRQ;
   5808
   5809	trace_seq_printf(&sq, "%c%c%c",
   5810	       (lat_flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
   5811	       (lat_flags & TRACE_FLAG_IRQS_NOSUPPORT) ?
   5812	       'X' : '.',
   5813	       (lat_flags & TRACE_FLAG_NEED_RESCHED) ?
   5814	       'N' : '.',
   5815	       (hardirq && softirq) ? 'H' :
   5816	       hardirq ? 'h' : softirq ? 's' : '.');
   5817
   5818	if (pc)
   5819		trace_seq_printf(&sq, "%x", pc);
   5820	else
   5821		trace_seq_printf(&sq, ".");
   5822
   5823	if (migrate_disable_exists) {
   5824		if (migrate_disable < 0)
   5825			trace_seq_printf(&sq, ".");
   5826		else
   5827			trace_seq_printf(&sq, "%d", migrate_disable);
   5828	}
   5829
   5830	if (lock_depth_exists) {
   5831		if (lock_depth < 0)
   5832			trace_seq_printf(&sq, ".");
   5833		else
   5834			trace_seq_printf(&sq, "%d", lock_depth);
   5835	}
   5836
   5837	if (sq.state == TRACE_SEQ__MEM_ALLOC_FAILED) {
   5838		s->state = TRACE_SEQ__MEM_ALLOC_FAILED;
   5839		return;
   5840	}
   5841
   5842	trace_seq_terminate(&sq);
   5843	trace_seq_puts(s, sq.buffer);
   5844	trace_seq_destroy(&sq);
   5845	trace_seq_terminate(s);
   5846}
   5847
   5848/**
   5849 * tep_data_type - parse out the given event type
   5850 * @tep: a handle to the trace event parser context
   5851 * @rec: the record to read from
   5852 *
   5853 * This returns the event id from the @rec.
   5854 */
   5855int tep_data_type(struct tep_handle *tep, struct tep_record *rec)
   5856{
   5857	return trace_parse_common_type(tep, rec->data);
   5858}
   5859
   5860/**
   5861 * tep_data_pid - parse the PID from record
   5862 * @tep: a handle to the trace event parser context
   5863 * @rec: the record to parse
   5864 *
   5865 * This returns the PID from a record.
   5866 */
   5867int tep_data_pid(struct tep_handle *tep, struct tep_record *rec)
   5868{
   5869	return parse_common_pid(tep, rec->data);
   5870}
   5871
   5872/**
   5873 * tep_data_preempt_count - parse the preempt count from the record
   5874 * @tep: a handle to the trace event parser context
   5875 * @rec: the record to parse
   5876 *
   5877 * This returns the preempt count from a record.
   5878 */
   5879int tep_data_preempt_count(struct tep_handle *tep, struct tep_record *rec)
   5880{
   5881	return parse_common_pc(tep, rec->data);
   5882}
   5883
   5884/**
   5885 * tep_data_flags - parse the latency flags from the record
   5886 * @tep: a handle to the trace event parser context
   5887 * @rec: the record to parse
   5888 *
   5889 * This returns the latency flags from a record.
   5890 *
   5891 *  Use trace_flag_type enum for the flags (see event-parse.h).
   5892 */
   5893int tep_data_flags(struct tep_handle *tep, struct tep_record *rec)
   5894{
   5895	return parse_common_flags(tep, rec->data);
   5896}
   5897
   5898/**
   5899 * tep_data_comm_from_pid - return the command line from PID
   5900 * @tep: a handle to the trace event parser context
   5901 * @pid: the PID of the task to search for
   5902 *
   5903 * This returns a pointer to the command line that has the given
   5904 * @pid.
   5905 */
   5906const char *tep_data_comm_from_pid(struct tep_handle *tep, int pid)
   5907{
   5908	const char *comm;
   5909
   5910	comm = find_cmdline(tep, pid);
   5911	return comm;
   5912}
   5913
   5914static struct tep_cmdline *
   5915pid_from_cmdlist(struct tep_handle *tep, const char *comm, struct tep_cmdline *next)
   5916{
   5917	struct cmdline_list *cmdlist = (struct cmdline_list *)next;
   5918
   5919	if (cmdlist)
   5920		cmdlist = cmdlist->next;
   5921	else
   5922		cmdlist = tep->cmdlist;
   5923
   5924	while (cmdlist && strcmp(cmdlist->comm, comm) != 0)
   5925		cmdlist = cmdlist->next;
   5926
   5927	return (struct tep_cmdline *)cmdlist;
   5928}
   5929
   5930/**
   5931 * tep_data_pid_from_comm - return the pid from a given comm
   5932 * @tep: a handle to the trace event parser context
   5933 * @comm: the cmdline to find the pid from
   5934 * @next: the cmdline structure to find the next comm
   5935 *
   5936 * This returns the cmdline structure that holds a pid for a given
   5937 * comm, or NULL if none found. As there may be more than one pid for
   5938 * a given comm, the result of this call can be passed back into
   5939 * a recurring call in the @next parameter, and then it will find the
   5940 * next pid.
   5941 * Also, it does a linear search, so it may be slow.
   5942 */
   5943struct tep_cmdline *tep_data_pid_from_comm(struct tep_handle *tep, const char *comm,
   5944					   struct tep_cmdline *next)
   5945{
   5946	struct tep_cmdline *cmdline;
   5947
   5948	/*
   5949	 * If the cmdlines have not been converted yet, then use
   5950	 * the list.
   5951	 */
   5952	if (!tep->cmdlines)
   5953		return pid_from_cmdlist(tep, comm, next);
   5954
   5955	if (next) {
   5956		/*
   5957		 * The next pointer could have been still from
   5958		 * a previous call before cmdlines were created
   5959		 */
   5960		if (next < tep->cmdlines ||
   5961		    next >= tep->cmdlines + tep->cmdline_count)
   5962			next = NULL;
   5963		else
   5964			cmdline  = next++;
   5965	}
   5966
   5967	if (!next)
   5968		cmdline = tep->cmdlines;
   5969
   5970	while (cmdline < tep->cmdlines + tep->cmdline_count) {
   5971		if (strcmp(cmdline->comm, comm) == 0)
   5972			return cmdline;
   5973		cmdline++;
   5974	}
   5975	return NULL;
   5976}
   5977
   5978/**
   5979 * tep_cmdline_pid - return the pid associated to a given cmdline
   5980 * @tep: a handle to the trace event parser context
   5981 * @cmdline: The cmdline structure to get the pid from
   5982 *
   5983 * Returns the pid for a give cmdline. If @cmdline is NULL, then
   5984 * -1 is returned.
   5985 */
   5986int tep_cmdline_pid(struct tep_handle *tep, struct tep_cmdline *cmdline)
   5987{
   5988	struct cmdline_list *cmdlist = (struct cmdline_list *)cmdline;
   5989
   5990	if (!cmdline)
   5991		return -1;
   5992
   5993	/*
   5994	 * If cmdlines have not been created yet, or cmdline is
   5995	 * not part of the array, then treat it as a cmdlist instead.
   5996	 */
   5997	if (!tep->cmdlines ||
   5998	    cmdline < tep->cmdlines ||
   5999	    cmdline >= tep->cmdlines + tep->cmdline_count)
   6000		return cmdlist->pid;
   6001
   6002	return cmdline->pid;
   6003}
   6004
   6005/*
   6006 * This parses the raw @data using the given @event information and
   6007 * writes the print format into the trace_seq.
   6008 */
   6009static void print_event_info(struct trace_seq *s, char *format, bool raw,
   6010			     struct tep_event *event, struct tep_record *record)
   6011{
   6012	int print_pretty = 1;
   6013
   6014	if (raw || (event->flags & TEP_EVENT_FL_PRINTRAW))
   6015		tep_print_fields(s, record->data, record->size, event);
   6016	else {
   6017
   6018		if (event->handler && !(event->flags & TEP_EVENT_FL_NOHANDLE))
   6019			print_pretty = event->handler(s, record, event,
   6020						      event->context);
   6021
   6022		if (print_pretty)
   6023			pretty_print(s, record->data, record->size, event);
   6024	}
   6025
   6026	trace_seq_terminate(s);
   6027}
   6028
   6029/**
   6030 * tep_find_event_by_record - return the event from a given record
   6031 * @tep: a handle to the trace event parser context
   6032 * @record: The record to get the event from
   6033 *
   6034 * Returns the associated event for a given record, or NULL if non is
   6035 * is found.
   6036 */
   6037struct tep_event *
   6038tep_find_event_by_record(struct tep_handle *tep, struct tep_record *record)
   6039{
   6040	int type;
   6041
   6042	if (record->size < 0) {
   6043		do_warning("ug! negative record size %d", record->size);
   6044		return NULL;
   6045	}
   6046
   6047	type = trace_parse_common_type(tep, record->data);
   6048
   6049	return tep_find_event(tep, type);
   6050}
   6051
   6052/*
   6053 * Writes the timestamp of the record into @s. Time divisor and precision can be
   6054 * specified as part of printf @format string. Example:
   6055 *	"%3.1000d" - divide the time by 1000 and print the first 3 digits
   6056 *	before the dot. Thus, the timestamp "123456000" will be printed as
   6057 *	"123.456"
   6058 */
   6059static void print_event_time(struct tep_handle *tep, struct trace_seq *s,
   6060				 char *format, struct tep_event *event,
   6061				 struct tep_record *record)
   6062{
   6063	unsigned long long time;
   6064	char *divstr;
   6065	int prec = 0, pr;
   6066	int div = 0;
   6067	int p10 = 1;
   6068
   6069	if (isdigit(*(format + 1)))
   6070		prec = atoi(format + 1);
   6071	divstr = strchr(format, '.');
   6072	if (divstr && isdigit(*(divstr + 1)))
   6073		div = atoi(divstr + 1);
   6074	time = record->ts;
   6075	if (div) {
   6076		time += div / 2;
   6077		time /= div;
   6078	}
   6079	pr = prec;
   6080	while (pr--)
   6081		p10 *= 10;
   6082
   6083	if (p10 > 1 && p10 < time)
   6084		trace_seq_printf(s, "%5llu.%0*llu", time / p10, prec, time % p10);
   6085	else
   6086		trace_seq_printf(s, "%12llu", time);
   6087}
   6088
   6089struct print_event_type {
   6090	enum {
   6091		EVENT_TYPE_INT = 1,
   6092		EVENT_TYPE_STRING,
   6093		EVENT_TYPE_UNKNOWN,
   6094	} type;
   6095	char format[32];
   6096};
   6097
   6098static void print_string(struct tep_handle *tep, struct trace_seq *s,
   6099			 struct tep_record *record, struct tep_event *event,
   6100			 const char *arg, struct print_event_type *type)
   6101{
   6102	const char *comm;
   6103	int pid;
   6104
   6105	if (strncmp(arg, TEP_PRINT_LATENCY, strlen(TEP_PRINT_LATENCY)) == 0) {
   6106		data_latency_format(tep, s, type->format, record);
   6107	} else if (strncmp(arg, TEP_PRINT_COMM, strlen(TEP_PRINT_COMM)) == 0) {
   6108		pid = parse_common_pid(tep, record->data);
   6109		comm = find_cmdline(tep, pid);
   6110		trace_seq_printf(s, type->format, comm);
   6111	} else if (strncmp(arg, TEP_PRINT_INFO_RAW, strlen(TEP_PRINT_INFO_RAW)) == 0) {
   6112		print_event_info(s, type->format, true, event, record);
   6113	} else if (strncmp(arg, TEP_PRINT_INFO, strlen(TEP_PRINT_INFO)) == 0) {
   6114		print_event_info(s, type->format, false, event, record);
   6115	} else if  (strncmp(arg, TEP_PRINT_NAME, strlen(TEP_PRINT_NAME)) == 0) {
   6116		trace_seq_printf(s, type->format, event->name);
   6117	} else {
   6118		trace_seq_printf(s, "[UNKNOWN TEP TYPE %s]", arg);
   6119	}
   6120
   6121}
   6122
   6123static void print_int(struct tep_handle *tep, struct trace_seq *s,
   6124		      struct tep_record *record, struct tep_event *event,
   6125		      int arg, struct print_event_type *type)
   6126{
   6127	int param;
   6128
   6129	switch (arg) {
   6130	case TEP_PRINT_CPU:
   6131		param = record->cpu;
   6132		break;
   6133	case TEP_PRINT_PID:
   6134		param = parse_common_pid(tep, record->data);
   6135		break;
   6136	case TEP_PRINT_TIME:
   6137		return print_event_time(tep, s, type->format, event, record);
   6138	default:
   6139		return;
   6140	}
   6141	trace_seq_printf(s, type->format, param);
   6142}
   6143
   6144static int tep_print_event_param_type(char *format,
   6145				      struct print_event_type *type)
   6146{
   6147	char *str = format + 1;
   6148	int i = 1;
   6149
   6150	type->type = EVENT_TYPE_UNKNOWN;
   6151	while (*str) {
   6152		switch (*str) {
   6153		case 'd':
   6154		case 'u':
   6155		case 'i':
   6156		case 'x':
   6157		case 'X':
   6158		case 'o':
   6159			type->type = EVENT_TYPE_INT;
   6160			break;
   6161		case 's':
   6162			type->type = EVENT_TYPE_STRING;
   6163			break;
   6164		}
   6165		str++;
   6166		i++;
   6167		if (type->type != EVENT_TYPE_UNKNOWN)
   6168			break;
   6169	}
   6170	memset(type->format, 0, 32);
   6171	memcpy(type->format, format, i < 32 ? i : 31);
   6172	return i;
   6173}
   6174
   6175/**
   6176 * tep_print_event - Write various event information
   6177 * @tep: a handle to the trace event parser context
   6178 * @s: the trace_seq to write to
   6179 * @record: The record to get the event from
   6180 * @format: a printf format string. Supported event fileds:
   6181 *	TEP_PRINT_PID, "%d" - event PID
   6182 *	TEP_PRINT_CPU, "%d" - event CPU
   6183 *	TEP_PRINT_COMM, "%s" - event command string
   6184 *	TEP_PRINT_NAME, "%s" - event name
   6185 *	TEP_PRINT_LATENCY, "%s" - event latency
   6186 *	TEP_PRINT_TIME, %d - event time stamp. A divisor and precision
   6187 *			can be specified as part of this format string:
   6188 *			"%precision.divisord". Example:
   6189 *			"%3.1000d" - divide the time by 1000 and print the first
   6190 *			3 digits before the dot. Thus, the time stamp
   6191 *			"123456000" will be printed as "123.456"
   6192 *	TEP_PRINT_INFO, "%s" - event information. If any width is specified in
   6193 *			the format string, the event information will be printed
   6194 *			in raw format.
   6195 * Writes the specified event information into @s.
   6196 */
   6197void tep_print_event(struct tep_handle *tep, struct trace_seq *s,
   6198		     struct tep_record *record, const char *fmt, ...)
   6199{
   6200	struct print_event_type type;
   6201	char *format = strdup(fmt);
   6202	char *current = format;
   6203	char *str = format;
   6204	int offset;
   6205	va_list args;
   6206	struct tep_event *event;
   6207
   6208	if (!format)
   6209		return;
   6210
   6211	event = tep_find_event_by_record(tep, record);
   6212	va_start(args, fmt);
   6213	while (*current) {
   6214		current = strchr(str, '%');
   6215		if (!current) {
   6216			trace_seq_puts(s, str);
   6217			break;
   6218		}
   6219		memset(&type, 0, sizeof(type));
   6220		offset = tep_print_event_param_type(current, &type);
   6221		*current = '\0';
   6222		trace_seq_puts(s, str);
   6223		current += offset;
   6224		switch (type.type) {
   6225		case EVENT_TYPE_STRING:
   6226			print_string(tep, s, record, event,
   6227				     va_arg(args, char*), &type);
   6228			break;
   6229		case EVENT_TYPE_INT:
   6230			print_int(tep, s, record, event,
   6231				  va_arg(args, int), &type);
   6232			break;
   6233		case EVENT_TYPE_UNKNOWN:
   6234		default:
   6235			trace_seq_printf(s, "[UNKNOWN TYPE]");
   6236			break;
   6237		}
   6238		str = current;
   6239
   6240	}
   6241	va_end(args);
   6242	free(format);
   6243}
   6244
   6245static int events_id_cmp(const void *a, const void *b)
   6246{
   6247	struct tep_event * const * ea = a;
   6248	struct tep_event * const * eb = b;
   6249
   6250	if ((*ea)->id < (*eb)->id)
   6251		return -1;
   6252
   6253	if ((*ea)->id > (*eb)->id)
   6254		return 1;
   6255
   6256	return 0;
   6257}
   6258
   6259static int events_name_cmp(const void *a, const void *b)
   6260{
   6261	struct tep_event * const * ea = a;
   6262	struct tep_event * const * eb = b;
   6263	int res;
   6264
   6265	res = strcmp((*ea)->name, (*eb)->name);
   6266	if (res)
   6267		return res;
   6268
   6269	res = strcmp((*ea)->system, (*eb)->system);
   6270	if (res)
   6271		return res;
   6272
   6273	return events_id_cmp(a, b);
   6274}
   6275
   6276static int events_system_cmp(const void *a, const void *b)
   6277{
   6278	struct tep_event * const * ea = a;
   6279	struct tep_event * const * eb = b;
   6280	int res;
   6281
   6282	res = strcmp((*ea)->system, (*eb)->system);
   6283	if (res)
   6284		return res;
   6285
   6286	res = strcmp((*ea)->name, (*eb)->name);
   6287	if (res)
   6288		return res;
   6289
   6290	return events_id_cmp(a, b);
   6291}
   6292
   6293static struct tep_event **list_events_copy(struct tep_handle *tep)
   6294{
   6295	struct tep_event **events;
   6296
   6297	if (!tep)
   6298		return NULL;
   6299
   6300	events = malloc(sizeof(*events) * (tep->nr_events + 1));
   6301	if (!events)
   6302		return NULL;
   6303
   6304	memcpy(events, tep->events, sizeof(*events) * tep->nr_events);
   6305	events[tep->nr_events] = NULL;
   6306	return events;
   6307}
   6308
   6309static void list_events_sort(struct tep_event **events, int nr_events,
   6310			     enum tep_event_sort_type sort_type)
   6311{
   6312	int (*sort)(const void *a, const void *b);
   6313
   6314	switch (sort_type) {
   6315	case TEP_EVENT_SORT_ID:
   6316		sort = events_id_cmp;
   6317		break;
   6318	case TEP_EVENT_SORT_NAME:
   6319		sort = events_name_cmp;
   6320		break;
   6321	case TEP_EVENT_SORT_SYSTEM:
   6322		sort = events_system_cmp;
   6323		break;
   6324	default:
   6325		sort = NULL;
   6326	}
   6327
   6328	if (sort)
   6329		qsort(events, nr_events, sizeof(*events), sort);
   6330}
   6331
   6332/**
   6333 * tep_list_events - Get events, sorted by given criteria.
   6334 * @tep: a handle to the tep context
   6335 * @sort_type: desired sort order of the events in the array
   6336 *
   6337 * Returns an array of pointers to all events, sorted by the given
   6338 * @sort_type criteria. The last element of the array is NULL. The returned
   6339 * memory must not be freed, it is managed by the library.
   6340 * The function is not thread safe.
   6341 */
   6342struct tep_event **tep_list_events(struct tep_handle *tep,
   6343				   enum tep_event_sort_type sort_type)
   6344{
   6345	struct tep_event **events;
   6346
   6347	if (!tep)
   6348		return NULL;
   6349
   6350	events = tep->sort_events;
   6351	if (events && tep->last_type == sort_type)
   6352		return events;
   6353
   6354	if (!events) {
   6355		events = list_events_copy(tep);
   6356		if (!events)
   6357			return NULL;
   6358
   6359		tep->sort_events = events;
   6360
   6361		/* the internal events are sorted by id */
   6362		if (sort_type == TEP_EVENT_SORT_ID) {
   6363			tep->last_type = sort_type;
   6364			return events;
   6365		}
   6366	}
   6367
   6368	list_events_sort(events, tep->nr_events, sort_type);
   6369	tep->last_type = sort_type;
   6370
   6371	return events;
   6372}
   6373
   6374
   6375/**
   6376 * tep_list_events_copy - Thread safe version of tep_list_events()
   6377 * @tep: a handle to the tep context
   6378 * @sort_type: desired sort order of the events in the array
   6379 *
   6380 * Returns an array of pointers to all events, sorted by the given
   6381 * @sort_type criteria. The last element of the array is NULL. The returned
   6382 * array is newly allocated inside the function and must be freed by the caller
   6383 */
   6384struct tep_event **tep_list_events_copy(struct tep_handle *tep,
   6385					enum tep_event_sort_type sort_type)
   6386{
   6387	struct tep_event **events;
   6388
   6389	if (!tep)
   6390		return NULL;
   6391
   6392	events = list_events_copy(tep);
   6393	if (!events)
   6394		return NULL;
   6395
   6396	/* the internal events are sorted by id */
   6397	if (sort_type == TEP_EVENT_SORT_ID)
   6398		return events;
   6399
   6400	list_events_sort(events, tep->nr_events, sort_type);
   6401
   6402	return events;
   6403}
   6404
   6405static struct tep_format_field **
   6406get_event_fields(const char *type, const char *name,
   6407		 int count, struct tep_format_field *list)
   6408{
   6409	struct tep_format_field **fields;
   6410	struct tep_format_field *field;
   6411	int i = 0;
   6412
   6413	fields = malloc(sizeof(*fields) * (count + 1));
   6414	if (!fields)
   6415		return NULL;
   6416
   6417	for (field = list; field; field = field->next) {
   6418		fields[i++] = field;
   6419		if (i == count + 1) {
   6420			do_warning("event %s has more %s fields than specified",
   6421				name, type);
   6422			i--;
   6423			break;
   6424		}
   6425	}
   6426
   6427	if (i != count)
   6428		do_warning("event %s has less %s fields than specified",
   6429			name, type);
   6430
   6431	fields[i] = NULL;
   6432
   6433	return fields;
   6434}
   6435
   6436/**
   6437 * tep_event_common_fields - return a list of common fields for an event
   6438 * @event: the event to return the common fields of.
   6439 *
   6440 * Returns an allocated array of fields. The last item in the array is NULL.
   6441 * The array must be freed with free().
   6442 */
   6443struct tep_format_field **tep_event_common_fields(struct tep_event *event)
   6444{
   6445	return get_event_fields("common", event->name,
   6446				event->format.nr_common,
   6447				event->format.common_fields);
   6448}
   6449
   6450/**
   6451 * tep_event_fields - return a list of event specific fields for an event
   6452 * @event: the event to return the fields of.
   6453 *
   6454 * Returns an allocated array of fields. The last item in the array is NULL.
   6455 * The array must be freed with free().
   6456 */
   6457struct tep_format_field **tep_event_fields(struct tep_event *event)
   6458{
   6459	return get_event_fields("event", event->name,
   6460				event->format.nr_fields,
   6461				event->format.fields);
   6462}
   6463
   6464static void print_fields(struct trace_seq *s, struct tep_print_flag_sym *field)
   6465{
   6466	trace_seq_printf(s, "{ %s, %s }", field->value, field->str);
   6467	if (field->next) {
   6468		trace_seq_puts(s, ", ");
   6469		print_fields(s, field->next);
   6470	}
   6471}
   6472
   6473/* for debugging */
   6474static void print_args(struct tep_print_arg *args)
   6475{
   6476	int print_paren = 1;
   6477	struct trace_seq s;
   6478
   6479	switch (args->type) {
   6480	case TEP_PRINT_NULL:
   6481		printf("null");
   6482		break;
   6483	case TEP_PRINT_ATOM:
   6484		printf("%s", args->atom.atom);
   6485		break;
   6486	case TEP_PRINT_FIELD:
   6487		printf("REC->%s", args->field.name);
   6488		break;
   6489	case TEP_PRINT_FLAGS:
   6490		printf("__print_flags(");
   6491		print_args(args->flags.field);
   6492		printf(", %s, ", args->flags.delim);
   6493		trace_seq_init(&s);
   6494		print_fields(&s, args->flags.flags);
   6495		trace_seq_do_printf(&s);
   6496		trace_seq_destroy(&s);
   6497		printf(")");
   6498		break;
   6499	case TEP_PRINT_SYMBOL:
   6500		printf("__print_symbolic(");
   6501		print_args(args->symbol.field);
   6502		printf(", ");
   6503		trace_seq_init(&s);
   6504		print_fields(&s, args->symbol.symbols);
   6505		trace_seq_do_printf(&s);
   6506		trace_seq_destroy(&s);
   6507		printf(")");
   6508		break;
   6509	case TEP_PRINT_HEX:
   6510		printf("__print_hex(");
   6511		print_args(args->hex.field);
   6512		printf(", ");
   6513		print_args(args->hex.size);
   6514		printf(")");
   6515		break;
   6516	case TEP_PRINT_HEX_STR:
   6517		printf("__print_hex_str(");
   6518		print_args(args->hex.field);
   6519		printf(", ");
   6520		print_args(args->hex.size);
   6521		printf(")");
   6522		break;
   6523	case TEP_PRINT_INT_ARRAY:
   6524		printf("__print_array(");
   6525		print_args(args->int_array.field);
   6526		printf(", ");
   6527		print_args(args->int_array.count);
   6528		printf(", ");
   6529		print_args(args->int_array.el_size);
   6530		printf(")");
   6531		break;
   6532	case TEP_PRINT_STRING:
   6533	case TEP_PRINT_BSTRING:
   6534		printf("__get_str(%s)", args->string.string);
   6535		break;
   6536	case TEP_PRINT_BITMASK:
   6537		printf("__get_bitmask(%s)", args->bitmask.bitmask);
   6538		break;
   6539	case TEP_PRINT_TYPE:
   6540		printf("(%s)", args->typecast.type);
   6541		print_args(args->typecast.item);
   6542		break;
   6543	case TEP_PRINT_OP:
   6544		if (strcmp(args->op.op, ":") == 0)
   6545			print_paren = 0;
   6546		if (print_paren)
   6547			printf("(");
   6548		print_args(args->op.left);
   6549		printf(" %s ", args->op.op);
   6550		print_args(args->op.right);
   6551		if (print_paren)
   6552			printf(")");
   6553		break;
   6554	default:
   6555		/* we should warn... */
   6556		return;
   6557	}
   6558	if (args->next) {
   6559		printf("\n");
   6560		print_args(args->next);
   6561	}
   6562}
   6563
   6564static void parse_header_field(const char *field,
   6565			       int *offset, int *size, int mandatory)
   6566{
   6567	unsigned long long save_input_buf_ptr;
   6568	unsigned long long save_input_buf_siz;
   6569	char *token;
   6570	int type;
   6571
   6572	save_input_buf_ptr = input_buf_ptr;
   6573	save_input_buf_siz = input_buf_siz;
   6574
   6575	if (read_expected(TEP_EVENT_ITEM, "field") < 0)
   6576		return;
   6577	if (read_expected(TEP_EVENT_OP, ":") < 0)
   6578		return;
   6579
   6580	/* type */
   6581	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   6582		goto fail;
   6583	free_token(token);
   6584
   6585	/*
   6586	 * If this is not a mandatory field, then test it first.
   6587	 */
   6588	if (mandatory) {
   6589		if (read_expected(TEP_EVENT_ITEM, field) < 0)
   6590			return;
   6591	} else {
   6592		if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   6593			goto fail;
   6594		if (strcmp(token, field) != 0)
   6595			goto discard;
   6596		free_token(token);
   6597	}
   6598
   6599	if (read_expected(TEP_EVENT_OP, ";") < 0)
   6600		return;
   6601	if (read_expected(TEP_EVENT_ITEM, "offset") < 0)
   6602		return;
   6603	if (read_expected(TEP_EVENT_OP, ":") < 0)
   6604		return;
   6605	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   6606		goto fail;
   6607	*offset = atoi(token);
   6608	free_token(token);
   6609	if (read_expected(TEP_EVENT_OP, ";") < 0)
   6610		return;
   6611	if (read_expected(TEP_EVENT_ITEM, "size") < 0)
   6612		return;
   6613	if (read_expected(TEP_EVENT_OP, ":") < 0)
   6614		return;
   6615	if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
   6616		goto fail;
   6617	*size = atoi(token);
   6618	free_token(token);
   6619	if (read_expected(TEP_EVENT_OP, ";") < 0)
   6620		return;
   6621	type = read_token(&token);
   6622	if (type != TEP_EVENT_NEWLINE) {
   6623		/* newer versions of the kernel have a "signed" type */
   6624		if (type != TEP_EVENT_ITEM)
   6625			goto fail;
   6626
   6627		if (strcmp(token, "signed") != 0)
   6628			goto fail;
   6629
   6630		free_token(token);
   6631
   6632		if (read_expected(TEP_EVENT_OP, ":") < 0)
   6633			return;
   6634
   6635		if (read_expect_type(TEP_EVENT_ITEM, &token))
   6636			goto fail;
   6637
   6638		free_token(token);
   6639		if (read_expected(TEP_EVENT_OP, ";") < 0)
   6640			return;
   6641
   6642		if (read_expect_type(TEP_EVENT_NEWLINE, &token))
   6643			goto fail;
   6644	}
   6645 fail:
   6646	free_token(token);
   6647	return;
   6648
   6649 discard:
   6650	input_buf_ptr = save_input_buf_ptr;
   6651	input_buf_siz = save_input_buf_siz;
   6652	*offset = 0;
   6653	*size = 0;
   6654	free_token(token);
   6655}
   6656
   6657/**
   6658 * tep_parse_header_page - parse the data stored in the header page
   6659 * @tep: a handle to the trace event parser context
   6660 * @buf: the buffer storing the header page format string
   6661 * @size: the size of @buf
   6662 * @long_size: the long size to use if there is no header
   6663 *
   6664 * This parses the header page format for information on the
   6665 * ring buffer used. The @buf should be copied from
   6666 *
   6667 * /sys/kernel/debug/tracing/events/header_page
   6668 */
   6669int tep_parse_header_page(struct tep_handle *tep, char *buf, unsigned long size,
   6670			  int long_size)
   6671{
   6672	int ignore;
   6673
   6674	if (!size) {
   6675		/*
   6676		 * Old kernels did not have header page info.
   6677		 * Sorry but we just use what we find here in user space.
   6678		 */
   6679		tep->header_page_ts_size = sizeof(long long);
   6680		tep->header_page_size_size = long_size;
   6681		tep->header_page_data_offset = sizeof(long long) + long_size;
   6682		tep->old_format = 1;
   6683		return -1;
   6684	}
   6685	init_input_buf(buf, size);
   6686
   6687	parse_header_field("timestamp", &tep->header_page_ts_offset,
   6688			   &tep->header_page_ts_size, 1);
   6689	parse_header_field("commit", &tep->header_page_size_offset,
   6690			   &tep->header_page_size_size, 1);
   6691	parse_header_field("overwrite", &tep->header_page_overwrite,
   6692			   &ignore, 0);
   6693	parse_header_field("data", &tep->header_page_data_offset,
   6694			   &tep->header_page_data_size, 1);
   6695
   6696	return 0;
   6697}
   6698
   6699static int event_matches(struct tep_event *event,
   6700			 int id, const char *sys_name,
   6701			 const char *event_name)
   6702{
   6703	if (id >= 0 && id != event->id)
   6704		return 0;
   6705
   6706	if (event_name && (strcmp(event_name, event->name) != 0))
   6707		return 0;
   6708
   6709	if (sys_name && (strcmp(sys_name, event->system) != 0))
   6710		return 0;
   6711
   6712	return 1;
   6713}
   6714
   6715static void free_handler(struct event_handler *handle)
   6716{
   6717	free((void *)handle->sys_name);
   6718	free((void *)handle->event_name);
   6719	free(handle);
   6720}
   6721
   6722static int find_event_handle(struct tep_handle *tep, struct tep_event *event)
   6723{
   6724	struct event_handler *handle, **next;
   6725
   6726	for (next = &tep->handlers; *next;
   6727	     next = &(*next)->next) {
   6728		handle = *next;
   6729		if (event_matches(event, handle->id,
   6730				  handle->sys_name,
   6731				  handle->event_name))
   6732			break;
   6733	}
   6734
   6735	if (!(*next))
   6736		return 0;
   6737
   6738	pr_stat("overriding event (%d) %s:%s with new print handler",
   6739		event->id, event->system, event->name);
   6740
   6741	event->handler = handle->func;
   6742	event->context = handle->context;
   6743
   6744	*next = handle->next;
   6745	free_handler(handle);
   6746
   6747	return 1;
   6748}
   6749
   6750/**
   6751 * parse_format - parse the event format
   6752 * @buf: the buffer storing the event format string
   6753 * @size: the size of @buf
   6754 * @sys: the system the event belongs to
   6755 *
   6756 * This parses the event format and creates an event structure
   6757 * to quickly parse raw data for a given event.
   6758 *
   6759 * These files currently come from:
   6760 *
   6761 * /sys/kernel/debug/tracing/events/.../.../format
   6762 */
   6763static enum tep_errno parse_format(struct tep_event **eventp,
   6764				   struct tep_handle *tep, const char *buf,
   6765				   unsigned long size, const char *sys)
   6766{
   6767	struct tep_event *event;
   6768	int ret;
   6769
   6770	init_input_buf(buf, size);
   6771
   6772	*eventp = event = alloc_event();
   6773	if (!event)
   6774		return TEP_ERRNO__MEM_ALLOC_FAILED;
   6775
   6776	event->name = event_read_name();
   6777	if (!event->name) {
   6778		/* Bad event? */
   6779		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
   6780		goto event_alloc_failed;
   6781	}
   6782
   6783	if (strcmp(sys, "ftrace") == 0) {
   6784		event->flags |= TEP_EVENT_FL_ISFTRACE;
   6785
   6786		if (strcmp(event->name, "bprint") == 0)
   6787			event->flags |= TEP_EVENT_FL_ISBPRINT;
   6788	}
   6789		
   6790	event->id = event_read_id();
   6791	if (event->id < 0) {
   6792		ret = TEP_ERRNO__READ_ID_FAILED;
   6793		/*
   6794		 * This isn't an allocation error actually.
   6795		 * But as the ID is critical, just bail out.
   6796		 */
   6797		goto event_alloc_failed;
   6798	}
   6799
   6800	event->system = strdup(sys);
   6801	if (!event->system) {
   6802		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
   6803		goto event_alloc_failed;
   6804	}
   6805
   6806	/* Add tep to event so that it can be referenced */
   6807	event->tep = tep;
   6808
   6809	ret = event_read_format(event);
   6810	if (ret < 0) {
   6811		ret = TEP_ERRNO__READ_FORMAT_FAILED;
   6812		goto event_parse_failed;
   6813	}
   6814
   6815	/*
   6816	 * If the event has an override, don't print warnings if the event
   6817	 * print format fails to parse.
   6818	 */
   6819	if (tep && find_event_handle(tep, event))
   6820		show_warning = 0;
   6821
   6822	ret = event_read_print(event);
   6823	show_warning = 1;
   6824
   6825	if (ret < 0) {
   6826		ret = TEP_ERRNO__READ_PRINT_FAILED;
   6827		goto event_parse_failed;
   6828	}
   6829
   6830	if (!ret && (event->flags & TEP_EVENT_FL_ISFTRACE)) {
   6831		struct tep_format_field *field;
   6832		struct tep_print_arg *arg, **list;
   6833
   6834		/* old ftrace had no args */
   6835		list = &event->print_fmt.args;
   6836		for (field = event->format.fields; field; field = field->next) {
   6837			arg = alloc_arg();
   6838			if (!arg) {
   6839				event->flags |= TEP_EVENT_FL_FAILED;
   6840				return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
   6841			}
   6842			arg->type = TEP_PRINT_FIELD;
   6843			arg->field.name = strdup(field->name);
   6844			if (!arg->field.name) {
   6845				event->flags |= TEP_EVENT_FL_FAILED;
   6846				free_arg(arg);
   6847				return TEP_ERRNO__OLD_FTRACE_ARG_FAILED;
   6848			}
   6849			arg->field.field = field;
   6850			*list = arg;
   6851			list = &arg->next;
   6852		}
   6853	}
   6854
   6855	if (!(event->flags & TEP_EVENT_FL_ISBPRINT))
   6856		event->print_fmt.print_cache = parse_args(event,
   6857							  event->print_fmt.format,
   6858							  event->print_fmt.args);
   6859
   6860	return 0;
   6861
   6862 event_parse_failed:
   6863	event->flags |= TEP_EVENT_FL_FAILED;
   6864	return ret;
   6865
   6866 event_alloc_failed:
   6867	free(event->system);
   6868	free(event->name);
   6869	free(event);
   6870	*eventp = NULL;
   6871	return ret;
   6872}
   6873
   6874static enum tep_errno
   6875__parse_event(struct tep_handle *tep,
   6876	      struct tep_event **eventp,
   6877	      const char *buf, unsigned long size,
   6878	      const char *sys)
   6879{
   6880	int ret = parse_format(eventp, tep, buf, size, sys);
   6881	struct tep_event *event = *eventp;
   6882
   6883	if (event == NULL)
   6884		return ret;
   6885
   6886	if (tep && add_event(tep, event)) {
   6887		ret = TEP_ERRNO__MEM_ALLOC_FAILED;
   6888		goto event_add_failed;
   6889	}
   6890
   6891#define PRINT_ARGS 0
   6892	if (PRINT_ARGS && event->print_fmt.args)
   6893		print_args(event->print_fmt.args);
   6894
   6895	return 0;
   6896
   6897event_add_failed:
   6898	free_tep_event(event);
   6899	return ret;
   6900}
   6901
   6902/**
   6903 * tep_parse_format - parse the event format
   6904 * @tep: a handle to the trace event parser context
   6905 * @eventp: returned format
   6906 * @buf: the buffer storing the event format string
   6907 * @size: the size of @buf
   6908 * @sys: the system the event belongs to
   6909 *
   6910 * This parses the event format and creates an event structure
   6911 * to quickly parse raw data for a given event.
   6912 *
   6913 * These files currently come from:
   6914 *
   6915 * /sys/kernel/debug/tracing/events/.../.../format
   6916 */
   6917enum tep_errno tep_parse_format(struct tep_handle *tep,
   6918				struct tep_event **eventp,
   6919				const char *buf,
   6920				unsigned long size, const char *sys)
   6921{
   6922	return __parse_event(tep, eventp, buf, size, sys);
   6923}
   6924
   6925/**
   6926 * tep_parse_event - parse the event format
   6927 * @tep: a handle to the trace event parser context
   6928 * @buf: the buffer storing the event format string
   6929 * @size: the size of @buf
   6930 * @sys: the system the event belongs to
   6931 *
   6932 * This parses the event format and creates an event structure
   6933 * to quickly parse raw data for a given event.
   6934 *
   6935 * These files currently come from:
   6936 *
   6937 * /sys/kernel/debug/tracing/events/.../.../format
   6938 */
   6939enum tep_errno tep_parse_event(struct tep_handle *tep, const char *buf,
   6940			       unsigned long size, const char *sys)
   6941{
   6942	struct tep_event *event = NULL;
   6943	return __parse_event(tep, &event, buf, size, sys);
   6944}
   6945
   6946int get_field_val(struct trace_seq *s, struct tep_format_field *field,
   6947		  const char *name, struct tep_record *record,
   6948		  unsigned long long *val, int err)
   6949{
   6950	if (!field) {
   6951		if (err)
   6952			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
   6953		return -1;
   6954	}
   6955
   6956	if (tep_read_number_field(field, record->data, val)) {
   6957		if (err)
   6958			trace_seq_printf(s, " %s=INVALID", name);
   6959		return -1;
   6960	}
   6961
   6962	return 0;
   6963}
   6964
   6965/**
   6966 * tep_get_field_raw - return the raw pointer into the data field
   6967 * @s: The seq to print to on error
   6968 * @event: the event that the field is for
   6969 * @name: The name of the field
   6970 * @record: The record with the field name.
   6971 * @len: place to store the field length.
   6972 * @err: print default error if failed.
   6973 *
   6974 * Returns a pointer into record->data of the field and places
   6975 * the length of the field in @len.
   6976 *
   6977 * On failure, it returns NULL.
   6978 */
   6979void *tep_get_field_raw(struct trace_seq *s, struct tep_event *event,
   6980			const char *name, struct tep_record *record,
   6981			int *len, int err)
   6982{
   6983	struct tep_format_field *field;
   6984	void *data = record->data;
   6985	unsigned offset;
   6986	int dummy;
   6987
   6988	if (!event)
   6989		return NULL;
   6990
   6991	field = tep_find_field(event, name);
   6992
   6993	if (!field) {
   6994		if (err)
   6995			trace_seq_printf(s, "<CANT FIND FIELD %s>", name);
   6996		return NULL;
   6997	}
   6998
   6999	/* Allow @len to be NULL */
   7000	if (!len)
   7001		len = &dummy;
   7002
   7003	offset = field->offset;
   7004	if (field->flags & TEP_FIELD_IS_DYNAMIC) {
   7005		offset = tep_read_number(event->tep,
   7006					 data + offset, field->size);
   7007		*len = offset >> 16;
   7008		offset &= 0xffff;
   7009		if (field->flags & TEP_FIELD_IS_RELATIVE)
   7010			offset += field->offset + field->size;
   7011	} else
   7012		*len = field->size;
   7013
   7014	return data + offset;
   7015}
   7016
   7017/**
   7018 * tep_get_field_val - find a field and return its value
   7019 * @s: The seq to print to on error
   7020 * @event: the event that the field is for
   7021 * @name: The name of the field
   7022 * @record: The record with the field name.
   7023 * @val: place to store the value of the field.
   7024 * @err: print default error if failed.
   7025 *
   7026 * Returns 0 on success -1 on field not found.
   7027 */
   7028int tep_get_field_val(struct trace_seq *s, struct tep_event *event,
   7029		      const char *name, struct tep_record *record,
   7030		      unsigned long long *val, int err)
   7031{
   7032	struct tep_format_field *field;
   7033
   7034	if (!event)
   7035		return -1;
   7036
   7037	field = tep_find_field(event, name);
   7038
   7039	return get_field_val(s, field, name, record, val, err);
   7040}
   7041
   7042/**
   7043 * tep_get_common_field_val - find a common field and return its value
   7044 * @s: The seq to print to on error
   7045 * @event: the event that the field is for
   7046 * @name: The name of the field
   7047 * @record: The record with the field name.
   7048 * @val: place to store the value of the field.
   7049 * @err: print default error if failed.
   7050 *
   7051 * Returns 0 on success -1 on field not found.
   7052 */
   7053int tep_get_common_field_val(struct trace_seq *s, struct tep_event *event,
   7054			     const char *name, struct tep_record *record,
   7055			     unsigned long long *val, int err)
   7056{
   7057	struct tep_format_field *field;
   7058
   7059	if (!event)
   7060		return -1;
   7061
   7062	field = tep_find_common_field(event, name);
   7063
   7064	return get_field_val(s, field, name, record, val, err);
   7065}
   7066
   7067/**
   7068 * tep_get_any_field_val - find a any field and return its value
   7069 * @s: The seq to print to on error
   7070 * @event: the event that the field is for
   7071 * @name: The name of the field
   7072 * @record: The record with the field name.
   7073 * @val: place to store the value of the field.
   7074 * @err: print default error if failed.
   7075 *
   7076 * Returns 0 on success -1 on field not found.
   7077 */
   7078int tep_get_any_field_val(struct trace_seq *s, struct tep_event *event,
   7079			  const char *name, struct tep_record *record,
   7080			  unsigned long long *val, int err)
   7081{
   7082	struct tep_format_field *field;
   7083
   7084	if (!event)
   7085		return -1;
   7086
   7087	field = tep_find_any_field(event, name);
   7088
   7089	return get_field_val(s, field, name, record, val, err);
   7090}
   7091
   7092/**
   7093 * tep_print_num_field - print a field and a format
   7094 * @s: The seq to print to
   7095 * @fmt: The printf format to print the field with.
   7096 * @event: the event that the field is for
   7097 * @name: The name of the field
   7098 * @record: The record with the field name.
   7099 * @err: print default error if failed.
   7100 *
   7101 * Returns positive value on success, negative in case of an error,
   7102 * or 0 if buffer is full.
   7103 */
   7104int tep_print_num_field(struct trace_seq *s, const char *fmt,
   7105			struct tep_event *event, const char *name,
   7106			struct tep_record *record, int err)
   7107{
   7108	struct tep_format_field *field = tep_find_field(event, name);
   7109	unsigned long long val;
   7110
   7111	if (!field)
   7112		goto failed;
   7113
   7114	if (tep_read_number_field(field, record->data, &val))
   7115		goto failed;
   7116
   7117	return trace_seq_printf(s, fmt, val);
   7118
   7119 failed:
   7120	if (err)
   7121		trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
   7122	return -1;
   7123}
   7124
   7125/**
   7126 * tep_print_func_field - print a field and a format for function pointers
   7127 * @s: The seq to print to
   7128 * @fmt: The printf format to print the field with.
   7129 * @event: the event that the field is for
   7130 * @name: The name of the field
   7131 * @record: The record with the field name.
   7132 * @err: print default error if failed.
   7133 *
   7134 * Returns positive value on success, negative in case of an error,
   7135 * or 0 if buffer is full.
   7136 */
   7137int tep_print_func_field(struct trace_seq *s, const char *fmt,
   7138			 struct tep_event *event, const char *name,
   7139			 struct tep_record *record, int err)
   7140{
   7141	struct tep_format_field *field = tep_find_field(event, name);
   7142	struct tep_handle *tep = event->tep;
   7143	unsigned long long val;
   7144	struct func_map *func;
   7145	char tmp[128];
   7146
   7147	if (!field)
   7148		goto failed;
   7149
   7150	if (tep_read_number_field(field, record->data, &val))
   7151		goto failed;
   7152
   7153	func = find_func(tep, val);
   7154
   7155	if (func)
   7156		snprintf(tmp, 128, "%s/0x%llx", func->func, func->addr - val);
   7157	else
   7158		sprintf(tmp, "0x%08llx", val);
   7159
   7160	return trace_seq_printf(s, fmt, tmp);
   7161
   7162 failed:
   7163	if (err)
   7164		trace_seq_printf(s, "CAN'T FIND FIELD \"%s\"", name);
   7165	return -1;
   7166}
   7167
   7168static void free_func_handle(struct tep_function_handler *func)
   7169{
   7170	struct func_params *params;
   7171
   7172	free(func->name);
   7173
   7174	while (func->params) {
   7175		params = func->params;
   7176		func->params = params->next;
   7177		free(params);
   7178	}
   7179
   7180	free(func);
   7181}
   7182
   7183/**
   7184 * tep_register_print_function - register a helper function
   7185 * @tep: a handle to the trace event parser context
   7186 * @func: the function to process the helper function
   7187 * @ret_type: the return type of the helper function
   7188 * @name: the name of the helper function
   7189 * @parameters: A list of enum tep_func_arg_type
   7190 *
   7191 * Some events may have helper functions in the print format arguments.
   7192 * This allows a plugin to dynamically create a way to process one
   7193 * of these functions.
   7194 *
   7195 * The @parameters is a variable list of tep_func_arg_type enums that
   7196 * must end with TEP_FUNC_ARG_VOID.
   7197 */
   7198int tep_register_print_function(struct tep_handle *tep,
   7199				tep_func_handler func,
   7200				enum tep_func_arg_type ret_type,
   7201				char *name, ...)
   7202{
   7203	struct tep_function_handler *func_handle;
   7204	struct func_params **next_param;
   7205	struct func_params *param;
   7206	enum tep_func_arg_type type;
   7207	va_list ap;
   7208	int ret;
   7209
   7210	func_handle = find_func_handler(tep, name);
   7211	if (func_handle) {
   7212		/*
   7213		 * This is most like caused by the users own
   7214		 * plugins updating the function. This overrides the
   7215		 * system defaults.
   7216		 */
   7217		pr_stat("override of function helper '%s'", name);
   7218		remove_func_handler(tep, name);
   7219	}
   7220
   7221	func_handle = calloc(1, sizeof(*func_handle));
   7222	if (!func_handle) {
   7223		do_warning("Failed to allocate function handler");
   7224		return TEP_ERRNO__MEM_ALLOC_FAILED;
   7225	}
   7226
   7227	func_handle->ret_type = ret_type;
   7228	func_handle->name = strdup(name);
   7229	func_handle->func = func;
   7230	if (!func_handle->name) {
   7231		do_warning("Failed to allocate function name");
   7232		free(func_handle);
   7233		return TEP_ERRNO__MEM_ALLOC_FAILED;
   7234	}
   7235
   7236	next_param = &(func_handle->params);
   7237	va_start(ap, name);
   7238	for (;;) {
   7239		type = va_arg(ap, enum tep_func_arg_type);
   7240		if (type == TEP_FUNC_ARG_VOID)
   7241			break;
   7242
   7243		if (type >= TEP_FUNC_ARG_MAX_TYPES) {
   7244			do_warning("Invalid argument type %d", type);
   7245			ret = TEP_ERRNO__INVALID_ARG_TYPE;
   7246			goto out_free;
   7247		}
   7248
   7249		param = malloc(sizeof(*param));
   7250		if (!param) {
   7251			do_warning("Failed to allocate function param");
   7252			ret = TEP_ERRNO__MEM_ALLOC_FAILED;
   7253			goto out_free;
   7254		}
   7255		param->type = type;
   7256		param->next = NULL;
   7257
   7258		*next_param = param;
   7259		next_param = &(param->next);
   7260
   7261		func_handle->nr_args++;
   7262	}
   7263	va_end(ap);
   7264
   7265	func_handle->next = tep->func_handlers;
   7266	tep->func_handlers = func_handle;
   7267
   7268	return 0;
   7269 out_free:
   7270	va_end(ap);
   7271	free_func_handle(func_handle);
   7272	return ret;
   7273}
   7274
   7275/**
   7276 * tep_unregister_print_function - unregister a helper function
   7277 * @tep: a handle to the trace event parser context
   7278 * @func: the function to process the helper function
   7279 * @name: the name of the helper function
   7280 *
   7281 * This function removes existing print handler for function @name.
   7282 *
   7283 * Returns 0 if the handler was removed successully, -1 otherwise.
   7284 */
   7285int tep_unregister_print_function(struct tep_handle *tep,
   7286				  tep_func_handler func, char *name)
   7287{
   7288	struct tep_function_handler *func_handle;
   7289
   7290	func_handle = find_func_handler(tep, name);
   7291	if (func_handle && func_handle->func == func) {
   7292		remove_func_handler(tep, name);
   7293		return 0;
   7294	}
   7295	return -1;
   7296}
   7297
   7298static struct tep_event *search_event(struct tep_handle *tep, int id,
   7299				      const char *sys_name,
   7300				      const char *event_name)
   7301{
   7302	struct tep_event *event;
   7303
   7304	if (id >= 0) {
   7305		/* search by id */
   7306		event = tep_find_event(tep, id);
   7307		if (!event)
   7308			return NULL;
   7309		if (event_name && (strcmp(event_name, event->name) != 0))
   7310			return NULL;
   7311		if (sys_name && (strcmp(sys_name, event->system) != 0))
   7312			return NULL;
   7313	} else {
   7314		event = tep_find_event_by_name(tep, sys_name, event_name);
   7315		if (!event)
   7316			return NULL;
   7317	}
   7318	return event;
   7319}
   7320
   7321/**
   7322 * tep_register_event_handler - register a way to parse an event
   7323 * @tep: a handle to the trace event parser context
   7324 * @id: the id of the event to register
   7325 * @sys_name: the system name the event belongs to
   7326 * @event_name: the name of the event
   7327 * @func: the function to call to parse the event information
   7328 * @context: the data to be passed to @func
   7329 *
   7330 * This function allows a developer to override the parsing of
   7331 * a given event. If for some reason the default print format
   7332 * is not sufficient, this function will register a function
   7333 * for an event to be used to parse the data instead.
   7334 *
   7335 * If @id is >= 0, then it is used to find the event.
   7336 * else @sys_name and @event_name are used.
   7337 *
   7338 * Returns:
   7339 *  TEP_REGISTER_SUCCESS_OVERWRITE if an existing handler is overwritten
   7340 *  TEP_REGISTER_SUCCESS if a new handler is registered successfully
   7341 *  negative TEP_ERRNO_... in case of an error
   7342 *
   7343 */
   7344int tep_register_event_handler(struct tep_handle *tep, int id,
   7345			       const char *sys_name, const char *event_name,
   7346			       tep_event_handler_func func, void *context)
   7347{
   7348	struct tep_event *event;
   7349	struct event_handler *handle;
   7350
   7351	event = search_event(tep, id, sys_name, event_name);
   7352	if (event == NULL)
   7353		goto not_found;
   7354
   7355	pr_stat("overriding event (%d) %s:%s with new print handler",
   7356		event->id, event->system, event->name);
   7357
   7358	event->handler = func;
   7359	event->context = context;
   7360	return TEP_REGISTER_SUCCESS_OVERWRITE;
   7361
   7362 not_found:
   7363	/* Save for later use. */
   7364	handle = calloc(1, sizeof(*handle));
   7365	if (!handle) {
   7366		do_warning("Failed to allocate event handler");
   7367		return TEP_ERRNO__MEM_ALLOC_FAILED;
   7368	}
   7369
   7370	handle->id = id;
   7371	if (event_name)
   7372		handle->event_name = strdup(event_name);
   7373	if (sys_name)
   7374		handle->sys_name = strdup(sys_name);
   7375
   7376	if ((event_name && !handle->event_name) ||
   7377	    (sys_name && !handle->sys_name)) {
   7378		do_warning("Failed to allocate event/sys name");
   7379		free((void *)handle->event_name);
   7380		free((void *)handle->sys_name);
   7381		free(handle);
   7382		return TEP_ERRNO__MEM_ALLOC_FAILED;
   7383	}
   7384
   7385	handle->func = func;
   7386	handle->next = tep->handlers;
   7387	tep->handlers = handle;
   7388	handle->context = context;
   7389
   7390	return TEP_REGISTER_SUCCESS;
   7391}
   7392
   7393static int handle_matches(struct event_handler *handler, int id,
   7394			  const char *sys_name, const char *event_name,
   7395			  tep_event_handler_func func, void *context)
   7396{
   7397	if (id >= 0 && id != handler->id)
   7398		return 0;
   7399
   7400	if (event_name && (strcmp(event_name, handler->event_name) != 0))
   7401		return 0;
   7402
   7403	if (sys_name && (strcmp(sys_name, handler->sys_name) != 0))
   7404		return 0;
   7405
   7406	if (func != handler->func || context != handler->context)
   7407		return 0;
   7408
   7409	return 1;
   7410}
   7411
   7412/**
   7413 * tep_unregister_event_handler - unregister an existing event handler
   7414 * @tep: a handle to the trace event parser context
   7415 * @id: the id of the event to unregister
   7416 * @sys_name: the system name the handler belongs to
   7417 * @event_name: the name of the event handler
   7418 * @func: the function to call to parse the event information
   7419 * @context: the data to be passed to @func
   7420 *
   7421 * This function removes existing event handler (parser).
   7422 *
   7423 * If @id is >= 0, then it is used to find the event.
   7424 * else @sys_name and @event_name are used.
   7425 *
   7426 * Returns 0 if handler was removed successfully, -1 if event was not found.
   7427 */
   7428int tep_unregister_event_handler(struct tep_handle *tep, int id,
   7429				 const char *sys_name, const char *event_name,
   7430				 tep_event_handler_func func, void *context)
   7431{
   7432	struct tep_event *event;
   7433	struct event_handler *handle;
   7434	struct event_handler **next;
   7435
   7436	event = search_event(tep, id, sys_name, event_name);
   7437	if (event == NULL)
   7438		goto not_found;
   7439
   7440	if (event->handler == func && event->context == context) {
   7441		pr_stat("removing override handler for event (%d) %s:%s. Going back to default handler.",
   7442			event->id, event->system, event->name);
   7443
   7444		event->handler = NULL;
   7445		event->context = NULL;
   7446		return 0;
   7447	}
   7448
   7449not_found:
   7450	for (next = &tep->handlers; *next; next = &(*next)->next) {
   7451		handle = *next;
   7452		if (handle_matches(handle, id, sys_name, event_name,
   7453				   func, context))
   7454			break;
   7455	}
   7456
   7457	if (!(*next))
   7458		return -1;
   7459
   7460	*next = handle->next;
   7461	free_handler(handle);
   7462
   7463	return 0;
   7464}
   7465
   7466/**
   7467 * tep_alloc - create a tep handle
   7468 */
   7469struct tep_handle *tep_alloc(void)
   7470{
   7471	struct tep_handle *tep = calloc(1, sizeof(*tep));
   7472
   7473	if (tep) {
   7474		tep->ref_count = 1;
   7475		tep->host_bigendian = tep_is_bigendian();
   7476	}
   7477
   7478	return tep;
   7479}
   7480
   7481void tep_ref(struct tep_handle *tep)
   7482{
   7483	tep->ref_count++;
   7484}
   7485
   7486int tep_get_ref(struct tep_handle *tep)
   7487{
   7488	if (tep)
   7489		return tep->ref_count;
   7490	return 0;
   7491}
   7492
   7493__hidden void free_tep_format_field(struct tep_format_field *field)
   7494{
   7495	free(field->type);
   7496	if (field->alias != field->name)
   7497		free(field->alias);
   7498	free(field->name);
   7499	free(field);
   7500}
   7501
   7502static void free_format_fields(struct tep_format_field *field)
   7503{
   7504	struct tep_format_field *next;
   7505
   7506	while (field) {
   7507		next = field->next;
   7508		free_tep_format_field(field);
   7509		field = next;
   7510	}
   7511}
   7512
   7513static void free_formats(struct tep_format *format)
   7514{
   7515	free_format_fields(format->common_fields);
   7516	free_format_fields(format->fields);
   7517}
   7518
   7519__hidden void free_tep_event(struct tep_event *event)
   7520{
   7521	free(event->name);
   7522	free(event->system);
   7523
   7524	free_formats(&event->format);
   7525
   7526	free(event->print_fmt.format);
   7527	free_args(event->print_fmt.args);
   7528	free_parse_args(event->print_fmt.print_cache);
   7529	free(event);
   7530}
   7531
   7532/**
   7533 * tep_free - free a tep handle
   7534 * @tep: the tep handle to free
   7535 */
   7536void tep_free(struct tep_handle *tep)
   7537{
   7538	struct cmdline_list *cmdlist, *cmdnext;
   7539	struct func_list *funclist, *funcnext;
   7540	struct printk_list *printklist, *printknext;
   7541	struct tep_function_handler *func_handler;
   7542	struct event_handler *handle;
   7543	int i;
   7544
   7545	if (!tep)
   7546		return;
   7547
   7548	cmdlist = tep->cmdlist;
   7549	funclist = tep->funclist;
   7550	printklist = tep->printklist;
   7551
   7552	tep->ref_count--;
   7553	if (tep->ref_count)
   7554		return;
   7555
   7556	if (tep->cmdlines) {
   7557		for (i = 0; i < tep->cmdline_count; i++)
   7558			free(tep->cmdlines[i].comm);
   7559		free(tep->cmdlines);
   7560	}
   7561
   7562	while (cmdlist) {
   7563		cmdnext = cmdlist->next;
   7564		free(cmdlist->comm);
   7565		free(cmdlist);
   7566		cmdlist = cmdnext;
   7567	}
   7568
   7569	if (tep->func_map) {
   7570		for (i = 0; i < (int)tep->func_count; i++) {
   7571			free(tep->func_map[i].func);
   7572			free(tep->func_map[i].mod);
   7573		}
   7574		free(tep->func_map);
   7575	}
   7576
   7577	while (funclist) {
   7578		funcnext = funclist->next;
   7579		free(funclist->func);
   7580		free(funclist->mod);
   7581		free(funclist);
   7582		funclist = funcnext;
   7583	}
   7584
   7585	while (tep->func_handlers) {
   7586		func_handler = tep->func_handlers;
   7587		tep->func_handlers = func_handler->next;
   7588		free_func_handle(func_handler);
   7589	}
   7590
   7591	if (tep->printk_map) {
   7592		for (i = 0; i < (int)tep->printk_count; i++)
   7593			free(tep->printk_map[i].printk);
   7594		free(tep->printk_map);
   7595	}
   7596
   7597	while (printklist) {
   7598		printknext = printklist->next;
   7599		free(printklist->printk);
   7600		free(printklist);
   7601		printklist = printknext;
   7602	}
   7603
   7604	for (i = 0; i < tep->nr_events; i++)
   7605		free_tep_event(tep->events[i]);
   7606
   7607	while (tep->handlers) {
   7608		handle = tep->handlers;
   7609		tep->handlers = handle->next;
   7610		free_handler(handle);
   7611	}
   7612
   7613	free(tep->events);
   7614	free(tep->sort_events);
   7615	free(tep->func_resolver);
   7616	free_tep_plugin_paths(tep);
   7617
   7618	free(tep);
   7619}
   7620
   7621void tep_unref(struct tep_handle *tep)
   7622{
   7623	tep_free(tep);
   7624}