1 /*
2  * Copyright (c) 2018 Google, Inc.
3  *
4  * SPDX-License-Identifier: GPL-2.0-or-later
5  */
6 
7 #ifndef _LTP_TRACE_PARSE_H_
8 #define _LTP_TRACE_PARSE_H_
9 
10 enum {
11 	TRACE_RECORD_OTHER = 0,
12 	TRACE_RECORD_SCHED_PROCESS_EXIT,
13 	TRACE_RECORD_SCHED_PROCESS_FORK,
14 	TRACE_RECORD_SCHED_SWITCH,
15 	TRACE_RECORD_SCHED_WAKEUP,
16 	TRACE_RECORD_SUGOV_UTIL_UPDATE,
17 	TRACE_RECORD_SUGOV_NEXT_FREQ,
18 	TRACE_RECORD_CPU_FREQUENCY,
19 	TRACE_RECORD_TRACING_MARK_WRITE,
20 };
21 
22 #define IRQ_CONTEXT_NORMAL '.'
23 #define IRQ_CONTEXT_SOFT 's'
24 #define IRQ_CONTEXT_HARD 'h'
25 #define IRQ_CONTEXT_HARD_IN_SOFT 'H'
26 #define IRQ_CONTEXT_NMI 'z'
27 #define IRQ_CONTEXT_NMI_IN_HARD 'Z'
28 
29 struct timestamp {
30 	unsigned int sec;
31 	unsigned int usec;
32 };
33 
34 struct trace_cpu_frequency {
35 	unsigned int state;
36 	unsigned short cpu;
37 };
38 
39 struct trace_sched_switch {
40 	char prev_comm[17];
41 	unsigned short prev_pid;
42 	unsigned short prev_prio;
43 	char prev_state;
44 	char next_comm[17];
45 	unsigned short next_pid;
46 	unsigned short next_prio;
47 };
48 
49 struct trace_sched_wakeup {
50 	char comm[17];
51 	unsigned short pid;
52 	unsigned short prio;
53 	unsigned short cpu;
54 };
55 
56 struct trace_sugov_util_update {
57 	int cpu;
58 	int util;
59 	int avg_cap;
60 	int max_cap;
61 };
62 
63 struct trace_sugov_next_freq {
64 	int cpu;
65 	int util;
66 	int max;
67 	int freq;
68 };
69 
70 struct trace_record {
71 	char task[17];
72 	unsigned short pid;
73 	unsigned short cpu;
74 
75 #define TRACE_RECORD_IRQS_OFF 0x1
76 #define TRACE_RECORD_TIF_NEED_RESCHED 0x2
77 #define TRACE_RECORD_PREEMPT_NEED_RESCHED 0x4
78 	unsigned short flags;
79 	unsigned char irq_context;
80 	unsigned short preempt_depth;
81 
82 	struct timestamp ts;
83 
84 	unsigned int event_type;
85 	void *event_data;
86 };
87 
88 extern int num_trace_records;
89 extern struct trace_record *trace;
90 extern char *ftrace_root_dir;
91 
92 void tracefs_write(const char *file_name, const char *value);
93 void trace_setup(void);
94 void trace_cleanup(void);
95 void print_trace_record(struct trace_record *tr);
96 struct trace_record *load_trace(void);
97 
98 #define LOAD_TRACE() \
99 	if (!load_trace()) \
100 		tst_brk(TBROK, "Failed to load trace.\n");
101 
102 #endif /* _LTP_TRACE_PARSE_H_ */
103