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_dbg.h (2962B)


      1/* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
      2/*
      3* Copyright(c) 2015 - 2018 Intel Corporation.
      4*/
      5
      6#if !defined(__HFI1_TRACE_EXTRA_H) || defined(TRACE_HEADER_MULTI_READ)
      7#define __HFI1_TRACE_EXTRA_H
      8
      9#include <linux/tracepoint.h>
     10#include <linux/trace_seq.h>
     11
     12#include "hfi.h"
     13
     14/*
     15 * Note:
     16 * This produces a REALLY ugly trace in the console output when the string is
     17 * too long.
     18 */
     19
     20#undef TRACE_SYSTEM
     21#define TRACE_SYSTEM hfi1_dbg
     22
     23#define MAX_MSG_LEN 512
     24
     25DECLARE_EVENT_CLASS(hfi1_trace_template,
     26		    TP_PROTO(const char *function, struct va_format *vaf),
     27		    TP_ARGS(function, vaf),
     28		    TP_STRUCT__entry(__string(function, function)
     29				     __dynamic_array(char, msg, MAX_MSG_LEN)
     30				     ),
     31		    TP_fast_assign(__assign_str(function, function);
     32				   WARN_ON_ONCE(vsnprintf
     33						(__get_dynamic_array(msg),
     34						 MAX_MSG_LEN, vaf->fmt,
     35						 *vaf->va) >=
     36						MAX_MSG_LEN);
     37				   ),
     38		    TP_printk("(%s) %s",
     39			      __get_str(function),
     40			      __get_str(msg))
     41);
     42
     43/*
     44 * It may be nice to macroize the __hfi1_trace but the va_* stuff requires an
     45 * actual function to work and can not be in a macro.
     46 */
     47#define __hfi1_trace_def(lvl) \
     48void __printf(2, 3) __hfi1_trace_##lvl(const char *funct, char *fmt, ...); \
     49									\
     50DEFINE_EVENT(hfi1_trace_template, hfi1_ ##lvl,				\
     51	TP_PROTO(const char *function, struct va_format *vaf),		\
     52	TP_ARGS(function, vaf))
     53
     54#define __hfi1_trace_fn(lvl) \
     55void __printf(2, 3) __hfi1_trace_##lvl(const char *func, char *fmt, ...)\
     56{									\
     57	struct va_format vaf = {					\
     58		.fmt = fmt,						\
     59	};								\
     60	va_list args;							\
     61									\
     62	va_start(args, fmt);						\
     63	vaf.va = &args;							\
     64	trace_hfi1_ ##lvl(func, &vaf);					\
     65	va_end(args);							\
     66	return;								\
     67}
     68
     69/*
     70 * To create a new trace level simply define it below and as a __hfi1_trace_fn
     71 * in trace.c. This will create all the hooks for calling
     72 * hfi1_cdbg(LVL, fmt, ...); as well as take care of all
     73 * the debugfs stuff.
     74 */
     75__hfi1_trace_def(AFFINITY);
     76__hfi1_trace_def(PKT);
     77__hfi1_trace_def(PROC);
     78__hfi1_trace_def(SDMA);
     79__hfi1_trace_def(LINKVERB);
     80__hfi1_trace_def(DEBUG);
     81__hfi1_trace_def(SNOOP);
     82__hfi1_trace_def(CNTR);
     83__hfi1_trace_def(PIO);
     84__hfi1_trace_def(DC8051);
     85__hfi1_trace_def(FIRMWARE);
     86__hfi1_trace_def(RCVCTRL);
     87__hfi1_trace_def(TID);
     88__hfi1_trace_def(MMU);
     89__hfi1_trace_def(IOCTL);
     90
     91#define hfi1_cdbg(which, fmt, ...) \
     92	__hfi1_trace_##which(__func__, fmt, ##__VA_ARGS__)
     93
     94#define hfi1_dbg(fmt, ...) \
     95	hfi1_cdbg(DEBUG, fmt, ##__VA_ARGS__)
     96
     97/*
     98 * Define HFI1_EARLY_DBG at compile time or here to enable early trace
     99 * messages. Do not check in an enablement for this.
    100 */
    101
    102#ifdef HFI1_EARLY_DBG
    103#define hfi1_dbg_early(fmt, ...) \
    104	trace_printk(fmt, ##__VA_ARGS__)
    105#else
    106#define hfi1_dbg_early(fmt, ...)
    107#endif
    108
    109#endif /* __HFI1_TRACE_EXTRA_H */
    110
    111#undef TRACE_INCLUDE_PATH
    112#undef TRACE_INCLUDE_FILE
    113#define TRACE_INCLUDE_PATH .
    114#define TRACE_INCLUDE_FILE trace_dbg
    115#include <trace/define_trace.h>