1
  1   %ˆl–ß=¿J	µ2ÛR‚ œP,Üd˜´oË708_�uÐb&=LyZof¯ÇÎ Ä    %‹     mSmkÛ0þýŠ#û°b5/cmKÛ¬5¤I°�ÒBa(ò9¨’‘ä6aì¿ïì¬kÅo²uÏÝó<wþøØ…À8Ý/mµwj[èÉ>\¸ÚX¸j£ÎËöù]jå+.­ñÜºí·ÖBÓÕÕ}4W�Ç(ÎÑU(t§p½šGc>Œ¬‹´èþ!,Ð¡‘è¡IWë€ùi»p½XÃV«�ŒÆàmí$RLŽ LOÂÔBÿ\Vh®�­«�Re¶Ät½ˆïÁW(‰€AYeÕéÉÉËËov#¿÷ŸZ'Öhe�—áI¨e7 ˆÐóO©­G˜Àx8žDÃI4Bw®L½k(D•ØóÏ|ø‰0é,¦·3v|Œ G¡µ%HK/�ª‚uPÐ%Ká„$;Àchô?£óDµM5�/’iòÀÒ@z…ËáÈ'Üžñ$†^ó&¡;€.Ñú-*}X,Wiœ2n
Æ/àƒ2R×dÚyËŠ—Ô¬ÕŠvbè*ŽEöë@	eý3ÆÕæ¼š¥—I¼Êâå‚e%8ùÏœ^Ÿµ‘­Éob=ˆ#IGÒ�© «>+[{½‡WHµ§ö°ÔYèMú¼%’Ì²u²€»é|=cK¾–48~ð#‡¡vÆÃðl(Ñ½(�P^7£Q;Id½o(¡sÆ²`A™\µÝ"XóÕºCõi–%ñÅ:›¥ì5OÀ]¥…9L—-Úxjæ“'¤Eú¢<h­Ðâà�Á©MÝXÔûÒH9ÐØ™’Æ.edÆÆîÎ˜Þì@oèdèà,6”¼;Ó×�;¡kdÙ¯÷È~w²Ò!%÷¢À°ïÜfQJ+ª2c¼Ü7u÷Œ““MWÓä*e«eßóQ4¿¤ßÄi¶¤YlÿFó?‚ÒÙ¦ótùÆ¥éÜà�n²?¦µ2�m    9   'ˆl–Ým_J*j"Tâ�Á;q±)‹FÿÍƒh¹a–Ým_J*j"Tâ�Á?q¦TÅ£Ð      '0
     )ˆÏÎ„ÀÿÍ¾Ð ?÷     )/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _LINUX_TRACE_EVENT_H
#define _LINUX_TRACE_EVENT_H

#include <linux/ring_buffer.h>
#include <linux/trace_seq.h>
#include <linux/percpu.h>
#include <linux/hardirq.h>
#include <linux/perf_event.h>
#include <linux/tracepoint.h>

struct trace_array;
struct array_buffer;
struct tracer;
struct dentry;
struct bpf_prog;
union bpf_attr;

const char *trace_print_flags_seq(struct trace_seq *p, const char *delim,
				  unsigned long flags,
				  const struct trace_print_flags *flag_array);

const char *trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
				    const struct trace_print_flags *symbol_array);

#if BITS_PER_LONG == 32
const char *trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
		      unsigned long long flags,
		      const struct trace_print_flags_u64 *flag_array);

const char *trace_print_symbols_seq_u64(struct trace_seq *p,
					unsigned long long val,
					const struct trace_print_flags_u64
								 *symbol_array);
#endif

const char *trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
				    unsigned int bitmask_size);

const char *trace_print_hex_seq(struct trace_seq *p,
				const unsigned char *buf, int len,
				bool concatenate);

const char *trace_print_array_seq(struct trace_seq *p,
				   const void *buf, int count,
				   size_t el_size);

const char *
trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
			 int prefix_type, int rowsize, int groupsize,
			 const void *buf, size_t len, bool ascii);

struct trace_iterator;
struct trace_event;

int trace_raw_output_prep(struct trace_iterator *iter,
			  struct trace_event *event);
extern __printf(2, 3)
void trace_event_printf(struct trace_iterator *iter, const char *fmt, ...);

/*
 * The trace entry - the most basic unit of tracing. This is what
 * is printed in the end as a single line in the trace output, such as:
 *
 *     bash-15816 [01]   235.197585: idle_cpu <- irq_enter
 */
struct trace_entry {
	unsigned short		type;
	unsigned char		flags;
	unsigned char		preempt_count;
	int			pid;
	unsigned char		preempt_lazy_count;
};

#define TRACE_EVENT_TYPE_MAX						\
	((1 << (sizeof(((struct trace_entry *)0)->type) * 8)) - 1)

/*
 * Trace iterator - used by printout routines who present trace
 * results to users and which routines might sleep, etc:
 */
struct trace_iterator {
	struct trace_array	*tr;
	struct tracer		*trace;
	struct array_buffer	*array_buffer;
	void			*private;
	int			cpu_file;
	struct mutex		mutex;
	struct ring_buffer_iter	**buffer_iter;
	unsigned long		iter_flags;
	void			*temp;	/* temp holder */
	unsigned int		temp_size;
	char			*fmt;	/* modified format holder */
	unsigned int		fmt_size;

	/* trace_seq for __print_flags() and __print_symbolic() etc. */
	struct trace_seq	tmp_seq;

	cpumask_var_t		started;

	/* it's true when current open file is snapshot */
	bool			snapshot;

	/* The below is zeroed out in pipe_read */
	struct trace_seq	seq;
	struct trace_entry	*ent;
	unsigned long		lost_events;
	int			leftover;
	int			ent_size;
	int			cpu;
	u64			ts;

	loff_t			pos;
	long			idx;

	/* All new field here will be zeroed out in pipe_read */
};

enum trace_iter_flags {
	TRACE_F