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

tracepoint-defs.h (2395B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef TRACEPOINT_DEFS_H
      3#define TRACEPOINT_DEFS_H 1
      4
      5/*
      6 * File can be included directly by headers who only want to access
      7 * tracepoint->key to guard out of line trace calls, or the definition of
      8 * trace_print_flags{_u64}. Otherwise linux/tracepoint.h should be used.
      9 */
     10
     11#include <linux/atomic.h>
     12#include <linux/static_key.h>
     13
     14struct static_call_key;
     15
     16struct trace_print_flags {
     17	unsigned long		mask;
     18	const char		*name;
     19};
     20
     21struct trace_print_flags_u64 {
     22	unsigned long long	mask;
     23	const char		*name;
     24};
     25
     26struct tracepoint_func {
     27	void *func;
     28	void *data;
     29	int prio;
     30};
     31
     32struct tracepoint {
     33	const char *name;		/* Tracepoint name */
     34	struct static_key key;
     35	struct static_call_key *static_call_key;
     36	void *static_call_tramp;
     37	void *iterator;
     38	int (*regfunc)(void);
     39	void (*unregfunc)(void);
     40	struct tracepoint_func __rcu *funcs;
     41};
     42
     43#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
     44typedef const int tracepoint_ptr_t;
     45#else
     46typedef struct tracepoint * const tracepoint_ptr_t;
     47#endif
     48
     49struct bpf_raw_event_map {
     50	struct tracepoint	*tp;
     51	void			*bpf_func;
     52	u32			num_args;
     53	u32			writable_size;
     54} __aligned(32);
     55
     56/*
     57 * If a tracepoint needs to be called from a header file, it is not
     58 * recommended to call it directly, as tracepoints in header files
     59 * may cause side-effects and bloat the kernel. Instead, use
     60 * tracepoint_enabled() to test if the tracepoint is enabled, then if
     61 * it is, call a wrapper function defined in a C file that will then
     62 * call the tracepoint.
     63 *
     64 * For "trace_foo_bar()", you would need to create a wrapper function
     65 * in a C file to call trace_foo_bar():
     66 *   void do_trace_foo_bar(args) { trace_foo_bar(args); }
     67 * Then in the header file, declare the tracepoint:
     68 *   DECLARE_TRACEPOINT(foo_bar);
     69 * And call your wrapper:
     70 *   static inline void some_inlined_function() {
     71 *            [..]
     72 *            if (tracepoint_enabled(foo_bar))
     73 *                    do_trace_foo_bar(args);
     74 *            [..]
     75 *   }
     76 *
     77 * Note: tracepoint_enabled(foo_bar) is equivalent to trace_foo_bar_enabled()
     78 *   but is safe to have in headers, where trace_foo_bar_enabled() is not.
     79 */
     80#define DECLARE_TRACEPOINT(tp) \
     81	extern struct tracepoint __tracepoint_##tp
     82
     83#ifdef CONFIG_TRACEPOINTS
     84# define tracepoint_enabled(tp) \
     85	static_key_false(&(__tracepoint_##tp).key)
     86#else
     87# define tracepoint_enabled(tracepoint) false
     88#endif
     89
     90#endif