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

trace-event.c (2565B)


      1// SPDX-License-Identifier: GPL-2.0
      2
      3#include <stdio.h>
      4#include <unistd.h>
      5#include <stdlib.h>
      6#include <errno.h>
      7#include <sys/types.h>
      8#include <sys/stat.h>
      9#include <fcntl.h>
     10#include <linux/kernel.h>
     11#include <linux/err.h>
     12#include <traceevent/event-parse.h>
     13#include <api/fs/tracing_path.h>
     14#include <api/fs/fs.h>
     15#include "trace-event.h"
     16#include "machine.h"
     17
     18/*
     19 * global trace_event object used by trace_event__tp_format
     20 *
     21 * TODO There's no cleanup call for this. Add some sort of
     22 * __exit function support and call trace_event__cleanup
     23 * there.
     24 */
     25static struct trace_event tevent;
     26static bool tevent_initialized;
     27
     28int trace_event__init(struct trace_event *t)
     29{
     30	struct tep_handle *pevent = tep_alloc();
     31
     32	if (pevent) {
     33		t->plugin_list = tep_load_plugins(pevent);
     34		t->pevent  = pevent;
     35	}
     36
     37	return pevent ? 0 : -1;
     38}
     39
     40static int trace_event__init2(void)
     41{
     42	int be = tep_is_bigendian();
     43	struct tep_handle *pevent;
     44
     45	if (trace_event__init(&tevent))
     46		return -1;
     47
     48	pevent = tevent.pevent;
     49	tep_set_flag(pevent, TEP_NSEC_OUTPUT);
     50	tep_set_file_bigendian(pevent, be);
     51	tep_set_local_bigendian(pevent, be);
     52	tevent_initialized = true;
     53	return 0;
     54}
     55
     56int trace_event__register_resolver(struct machine *machine,
     57				   tep_func_resolver_t *func)
     58{
     59	if (!tevent_initialized && trace_event__init2())
     60		return -1;
     61
     62	return tep_set_function_resolver(tevent.pevent, func, machine);
     63}
     64
     65void trace_event__cleanup(struct trace_event *t)
     66{
     67	tep_unload_plugins(t->plugin_list, t->pevent);
     68	tep_free(t->pevent);
     69}
     70
     71/*
     72 * Returns pointer with encoded error via <linux/err.h> interface.
     73 */
     74static struct tep_event*
     75tp_format(const char *sys, const char *name)
     76{
     77	char *tp_dir = get_events_file(sys);
     78	struct tep_handle *pevent = tevent.pevent;
     79	struct tep_event *event = NULL;
     80	char path[PATH_MAX];
     81	size_t size;
     82	char *data;
     83	int err;
     84
     85	if (!tp_dir)
     86		return ERR_PTR(-errno);
     87
     88	scnprintf(path, PATH_MAX, "%s/%s/format", tp_dir, name);
     89	put_events_file(tp_dir);
     90
     91	err = filename__read_str(path, &data, &size);
     92	if (err)
     93		return ERR_PTR(err);
     94
     95	tep_parse_format(pevent, &event, data, size, sys);
     96
     97	free(data);
     98	return event;
     99}
    100
    101/*
    102 * Returns pointer with encoded error via <linux/err.h> interface.
    103 */
    104struct tep_event*
    105trace_event__tp_format(const char *sys, const char *name)
    106{
    107	if (!tevent_initialized && trace_event__init2())
    108		return ERR_PTR(-ENOMEM);
    109
    110	return tp_format(sys, name);
    111}
    112
    113struct tep_event *trace_event__tp_format_id(int id)
    114{
    115	if (!tevent_initialized && trace_event__init2())
    116		return ERR_PTR(-ENOMEM);
    117
    118	return tep_find_event(tevent.pevent, id);
    119}