xref: /linux/arch/loongarch/kvm/trace.h (revision 8a7c601e14576a22c2bbf7f67455ccf3f3d2737f)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
4  */
5 
6 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
7 #define _TRACE_KVM_H
8 
9 #include <linux/tracepoint.h>
10 #include <asm/kvm_csr.h>
11 
12 #undef	TRACE_SYSTEM
13 #define TRACE_SYSTEM	kvm
14 
15 /*
16  * Tracepoints for VM enters
17  */
18 DECLARE_EVENT_CLASS(kvm_transition,
19 	TP_PROTO(struct kvm_vcpu *vcpu),
20 	TP_ARGS(vcpu),
21 	TP_STRUCT__entry(
22 		__field(unsigned int, vcpu_id)
23 		__field(unsigned long, pc)
24 	),
25 
26 	TP_fast_assign(
27 		__entry->vcpu_id = vcpu->vcpu_id;
28 		__entry->pc = vcpu->arch.pc;
29 	),
30 
31 	TP_printk("vcpu %u PC: 0x%08lx", __entry->vcpu_id, __entry->pc)
32 );
33 
34 DEFINE_EVENT(kvm_transition, kvm_enter,
35 	     TP_PROTO(struct kvm_vcpu *vcpu),
36 	     TP_ARGS(vcpu));
37 
38 DEFINE_EVENT(kvm_transition, kvm_reenter,
39 	     TP_PROTO(struct kvm_vcpu *vcpu),
40 	     TP_ARGS(vcpu));
41 
42 DEFINE_EVENT(kvm_transition, kvm_out,
43 	     TP_PROTO(struct kvm_vcpu *vcpu),
44 	     TP_ARGS(vcpu));
45 
46 /* Further exit reasons */
47 #define KVM_TRACE_EXIT_IDLE		64
48 #define KVM_TRACE_EXIT_CACHE		65
49 #define KVM_TRACE_EXIT_CPUCFG		66
50 #define KVM_TRACE_EXIT_CSR		67
51 
52 /* Tracepoints for VM exits */
53 #define kvm_trace_symbol_exit_types			\
54 	{ KVM_TRACE_EXIT_IDLE,		"IDLE" },	\
55 	{ KVM_TRACE_EXIT_CACHE,		"CACHE" },	\
56 	{ KVM_TRACE_EXIT_CPUCFG,	"CPUCFG" },	\
57 	{ KVM_TRACE_EXIT_CSR,		"CSR" }
58 
59 DECLARE_EVENT_CLASS(kvm_exit,
60 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
61 	    TP_ARGS(vcpu, reason),
62 	    TP_STRUCT__entry(
63 			__field(unsigned int, vcpu_id)
64 			__field(unsigned long, pc)
65 			__field(unsigned int, reason)
66 	    ),
67 
68 	    TP_fast_assign(
69 			__entry->vcpu_id = vcpu->vcpu_id;
70 			__entry->pc = vcpu->arch.pc;
71 			__entry->reason = reason;
72 	    ),
73 
74 	    TP_printk("vcpu %u [%s] PC: 0x%08lx",
75 			__entry->vcpu_id,
76 			__print_symbolic(__entry->reason,
77 				kvm_trace_symbol_exit_types),
78 			__entry->pc)
79 );
80 
81 DEFINE_EVENT(kvm_exit, kvm_exit_idle,
82 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
83 	     TP_ARGS(vcpu, reason));
84 
85 DEFINE_EVENT(kvm_exit, kvm_exit_cache,
86 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
87 	     TP_ARGS(vcpu, reason));
88 
89 DEFINE_EVENT(kvm_exit, kvm_exit_cpucfg,
90 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
91 	     TP_ARGS(vcpu, reason));
92 
93 DEFINE_EVENT(kvm_exit, kvm_exit_csr,
94 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
95 	     TP_ARGS(vcpu, reason));
96 
97 DEFINE_EVENT(kvm_exit, kvm_exit,
98 	     TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
99 	     TP_ARGS(vcpu, reason));
100 
101 TRACE_EVENT(kvm_exit_gspr,
102 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int inst_word),
103 	    TP_ARGS(vcpu, inst_word),
104 	    TP_STRUCT__entry(
105 			__field(unsigned int, vcpu_id)
106 			__field(unsigned int, inst_word)
107 	    ),
108 
109 	    TP_fast_assign(
110 			__entry->vcpu_id = vcpu->vcpu_id;
111 			__entry->inst_word = inst_word;
112 	    ),
113 
114 	    TP_printk("vcpu %u Inst word: 0x%08x", __entry->vcpu_id,
115 			__entry->inst_word)
116 );
117 
118 #define KVM_TRACE_AUX_SAVE		0
119 #define KVM_TRACE_AUX_RESTORE		1
120 #define KVM_TRACE_AUX_ENABLE		2
121 #define KVM_TRACE_AUX_DISABLE		3
122 #define KVM_TRACE_AUX_DISCARD		4
123 
124 #define KVM_TRACE_AUX_FPU		1
125 #define KVM_TRACE_AUX_LSX		2
126 #define KVM_TRACE_AUX_LASX		3
127 
128 #define kvm_trace_symbol_aux_op				\
129 	{ KVM_TRACE_AUX_SAVE,		"save" },	\
130 	{ KVM_TRACE_AUX_RESTORE,	"restore" },	\
131 	{ KVM_TRACE_AUX_ENABLE,		"enable" },	\
132 	{ KVM_TRACE_AUX_DISABLE,	"disable" },	\
133 	{ KVM_TRACE_AUX_DISCARD,	"discard" }
134 
135 #define kvm_trace_symbol_aux_state			\
136 	{ KVM_TRACE_AUX_FPU,     "FPU" },		\
137 	{ KVM_TRACE_AUX_LSX,     "LSX" },		\
138 	{ KVM_TRACE_AUX_LASX,    "LASX" }
139 
140 TRACE_EVENT(kvm_aux,
141 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int op,
142 		     unsigned int state),
143 	    TP_ARGS(vcpu, op, state),
144 	    TP_STRUCT__entry(
145 			__field(unsigned long, pc)
146 			__field(u8, op)
147 			__field(u8, state)
148 	    ),
149 
150 	    TP_fast_assign(
151 			__entry->pc = vcpu->arch.pc;
152 			__entry->op = op;
153 			__entry->state = state;
154 	    ),
155 
156 	    TP_printk("%s %s PC: 0x%08lx",
157 		      __print_symbolic(__entry->op,
158 				       kvm_trace_symbol_aux_op),
159 		      __print_symbolic(__entry->state,
160 				       kvm_trace_symbol_aux_state),
161 		      __entry->pc)
162 );
163 
164 #define KVM_TRACE_IOCSR_READ_UNSATISFIED 0
165 #define KVM_TRACE_IOCSR_READ 1
166 #define KVM_TRACE_IOCSR_WRITE 2
167 
168 #define kvm_trace_symbol_iocsr \
169 	{ KVM_TRACE_IOCSR_READ_UNSATISFIED, "unsatisfied-read" }, \
170 	{ KVM_TRACE_IOCSR_READ, "read" }, \
171 	{ KVM_TRACE_IOCSR_WRITE, "write" }
172 
173 TRACE_EVENT(kvm_iocsr,
174 	TP_PROTO(int type, int len, u64 gpa, void *val),
175 	TP_ARGS(type, len, gpa, val),
176 
177 	TP_STRUCT__entry(
178 		__field(	u32,	type	)
179 		__field(	u32,	len	)
180 		__field(	u64,	gpa	)
181 		__field(	u64,	val	)
182 	),
183 
184 	TP_fast_assign(
185 		__entry->type		= type;
186 		__entry->len		= len;
187 		__entry->gpa		= gpa;
188 		__entry->val		= 0;
189 		if (val)
190 			memcpy(&__entry->val, val,
191 			       min_t(u32, sizeof(__entry->val), len));
192 	),
193 
194 	TP_printk("iocsr %s len %u gpa 0x%llx val 0x%llx",
195 		  __print_symbolic(__entry->type, kvm_trace_symbol_iocsr),
196 		  __entry->len, __entry->gpa, __entry->val)
197 );
198 
199 TRACE_EVENT(kvm_vpid_change,
200 	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned long vpid),
201 	    TP_ARGS(vcpu, vpid),
202 	    TP_STRUCT__entry(
203 			__field(unsigned long, vpid)
204 	    ),
205 
206 	    TP_fast_assign(
207 			__entry->vpid = vpid;
208 	    ),
209 
210 	    TP_printk("VPID: 0x%08lx", __entry->vpid)
211 );
212 
213 #endif /* _TRACE_KVM_H */
214 
215 #undef TRACE_INCLUDE_PATH
216 #define TRACE_INCLUDE_PATH ../../arch/loongarch/kvm
217 #undef TRACE_INCLUDE_FILE
218 #define TRACE_INCLUDE_FILE trace
219 
220 /* This part must be outside protection */
221 #include <trace/define_trace.h>
222