1 /* SPDX-License-Identifier: GPL-2.0 */
2 #if !defined(_TRACE_ARM_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
3 #define _TRACE_ARM_ARM64_KVM_H
4 
5 #include <kvm/arm_arch_timer.h>
6 #include <linux/tracepoint.h>
7 
8 #undef TRACE_SYSTEM
9 #define TRACE_SYSTEM kvm
10 
11 /*
12  * Tracepoints for entry/exit to guest
13  */
14 TRACE_EVENT(kvm_entry,
15 	TP_PROTO(unsigned long vcpu_pc),
16 	TP_ARGS(vcpu_pc),
17 
18 	TP_STRUCT__entry(
19 		__field(	unsigned long,	vcpu_pc		)
20 	),
21 
22 	TP_fast_assign(
23 		__entry->vcpu_pc		= vcpu_pc;
24 	),
25 
26 	TP_printk("PC: 0x%016lx", __entry->vcpu_pc)
27 );
28 
29 TRACE_EVENT(kvm_exit,
30 	TP_PROTO(int ret, unsigned int esr_ec, unsigned long vcpu_pc),
31 	TP_ARGS(ret, esr_ec, vcpu_pc),
32 
33 	TP_STRUCT__entry(
34 		__field(	int,		ret		)
35 		__field(	unsigned int,	esr_ec		)
36 		__field(	unsigned long,	vcpu_pc		)
37 	),
38 
39 	TP_fast_assign(
40 		__entry->ret			= ARM_EXCEPTION_CODE(ret);
41 		__entry->esr_ec = ARM_EXCEPTION_IS_TRAP(ret) ? esr_ec : 0;
42 		__entry->vcpu_pc		= vcpu_pc;
43 	),
44 
45 	TP_printk("%s: HSR_EC: 0x%04x (%s), PC: 0x%016lx",
46 		  __print_symbolic(__entry->ret, kvm_arm_exception_type),
47 		  __entry->esr_ec,
48 		  __print_symbolic(__entry->esr_ec, kvm_arm_exception_class),
49 		  __entry->vcpu_pc)
50 );
51 
52 TRACE_EVENT(kvm_guest_fault,
53 	TP_PROTO(unsigned long vcpu_pc, unsigned long hsr,
54 		 unsigned long hxfar,
55 		 unsigned long long ipa),
56 	TP_ARGS(vcpu_pc, hsr, hxfar, ipa),
57 
58 	TP_STRUCT__entry(
59 		__field(	unsigned long,	vcpu_pc		)
60 		__field(	unsigned long,	hsr		)
61 		__field(	unsigned long,	hxfar		)
62 		__field(   unsigned long long,	ipa		)
63 	),
64 
65 	TP_fast_assign(
66 		__entry->vcpu_pc		= vcpu_pc;
67 		__entry->hsr			= hsr;
68 		__entry->hxfar			= hxfar;
69 		__entry->ipa			= ipa;
70 	),
71 
72 	TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#016lx",
73 		  __entry->ipa, __entry->hsr,
74 		  __entry->hxfar, __entry->vcpu_pc)
75 );
76 
77 TRACE_EVENT(kvm_access_fault,
78 	TP_PROTO(unsigned long ipa),
79 	TP_ARGS(ipa),
80 
81 	TP_STRUCT__entry(
82 		__field(	unsigned long,	ipa		)
83 	),
84 
85 	TP_fast_assign(
86 		__entry->ipa		= ipa;
87 	),
88 
89 	TP_printk("IPA: %lx", __entry->ipa)
90 );
91 
92 TRACE_EVENT(kvm_irq_line,
93 	TP_PROTO(unsigned int type, int vcpu_idx, int irq_num, int level),
94 	TP_ARGS(type, vcpu_idx, irq_num, level),
95 
96 	TP_STRUCT__entry(
97 		__field(	unsigned int,	type		)
98 		__field(	int,		vcpu_idx	)
99 		__field(	int,		irq_num		)
100 		__field(	int,		level		)
101 	),
102 
103 	TP_fast_assign(
104 		__entry->type		= type;
105 		__entry->vcpu_idx	= vcpu_idx;
106 		__entry->irq_num	= irq_num;
107 		__entry->level		= level;
108 	),
109 
110 	TP_printk("Inject %s interrupt (%d), vcpu->idx: %d, num: %d, level: %d",
111 		  (__entry->type == KVM_ARM_IRQ_TYPE_CPU) ? "CPU" :
112 		  (__entry->type == KVM_ARM_IRQ_TYPE_PPI) ? "VGIC PPI" :
113 		  (__entry->type == KVM_ARM_IRQ_TYPE_SPI) ? "VGIC SPI" : "UNKNOWN",
114 		  __entry->type, __entry->vcpu_idx, __entry->irq_num, __entry->level)
115 );
116 
117 TRACE_EVENT(kvm_mmio_emulate,
118 	TP_PROTO(unsigned long vcpu_pc, unsigned long instr,
119 		 unsigned long cpsr),
120 	TP_ARGS(vcpu_pc, instr, cpsr),
121 
122 	TP_STRUCT__entry(
123 		__field(	unsigned long,	vcpu_pc		)
124 		__field(	unsigned long,	instr		)
125 		__field(	unsigned long,	cpsr		)
126 	),
127 
128 	TP_fast_assign(
129 		__entry->vcpu_pc		= vcpu_pc;
130 		__entry->instr			= instr;
131 		__entry->cpsr			= cpsr;
132 	),
133 
134 	TP_printk("Emulate MMIO at: 0x%016lx (instr: %08lx, cpsr: %08lx)",
135 		  __entry->vcpu_pc, __entry->instr, __entry->cpsr)
136 );
137 
138 TRACE_EVENT(kvm_set_way_flush,
139 	    TP_PROTO(unsigned long vcpu_pc, bool cache),
140 	    TP_ARGS(vcpu_pc, cache),
141 
142 	    TP_STRUCT__entry(
143 		    __field(	unsigned long,	vcpu_pc		)
144 		    __field(	bool,		cache		)
145 	    ),
146 
147 	    TP_fast_assign(
148 		    __entry->vcpu_pc		= vcpu_pc;
149 		    __entry->cache		= cache;
150 	    ),
151 
152 	    TP_printk("S/W flush at 0x%016lx (cache %s)",
153 		      __entry->vcpu_pc, __entry->cache ? "on" : "off")
154 );
155 
156 TRACE_EVENT(kvm_toggle_cache,
157 	    TP_PROTO(unsigned long vcpu_pc, bool was, bool now),
158 	    TP_ARGS(vcpu_pc, was, now),
159 
160 	    TP_STRUCT__entry(
161 		    __field(	unsigned long,	vcpu_pc		)
162 		    __field(	bool,		was		)
163 		    __field(	bool,		now		)
164 	    ),
165 
166 	    TP_fast_assign(
167 		    __entry->vcpu_pc		= vcpu_pc;
168 		    __entry->was		= was;
169 		    __entry->now		= now;
170 	    ),
171 
172 	    TP_printk("VM op at 0x%016lx (cache was %s, now %s)",
173 		      __entry->vcpu_pc, __entry->was ? "on" : "off",
174 		      __entry->now ? "on" : "off")
175 );
176 
177 /*
178  * Tracepoints for arch_timer
179  */
180 TRACE_EVENT(kvm_timer_update_irq,
181 	TP_PROTO(unsigned long vcpu_id, __u32 irq, int level),
182 	TP_ARGS(vcpu_id, irq, level),
183 
184 	TP_STRUCT__entry(
185 		__field(	unsigned long,	vcpu_id	)
186 		__field(	__u32,		irq	)
187 		__field(	int,		level	)
188 	),
189 
190 	TP_fast_assign(
191 		__entry->vcpu_id	= vcpu_id;
192 		__entry->irq		= irq;
193 		__entry->level		= level;
194 	),
195 
196 	TP_printk("VCPU: %ld, IRQ %d, level %d",
197 		  __entry->vcpu_id, __entry->irq, __entry->level)
198 );
199 
200 TRACE_EVENT(kvm_get_timer_map,
201 	TP_PROTO(unsigned long vcpu_id, struct timer_map *map),
202 	TP_ARGS(vcpu_id, map),
203 
204 	TP_STRUCT__entry(
205 		__field(	unsigned long,		vcpu_id	)
206 		__field(	int,			direct_vtimer	)
207 		__field(	int,			direct_ptimer	)
208 		__field(	int,			emul_ptimer	)
209 	),
210 
211 	TP_fast_assign(
212 		__entry->vcpu_id		= vcpu_id;
213 		__entry->direct_vtimer		= arch_timer_ctx_index(map->direct_vtimer);
214 		__entry->direct_ptimer =
215 			(map->direct_ptimer) ? arch_timer_ctx_index(map->direct_ptimer) : -1;
216 		__entry->emul_ptimer =
217 			(map->emul_ptimer) ? arch_timer_ctx_index(map->emul_ptimer) : -1;
218 	),
219 
220 	TP_printk("VCPU: %ld, dv: %d, dp: %d, ep: %d",
221 		  __entry->vcpu_id,
222 		  __entry->direct_vtimer,
223 		  __entry->direct_ptimer,
224 		  __entry->emul_ptimer)
225 );
226 
227 TRACE_EVENT(kvm_timer_save_state,
228 	TP_PROTO(struct arch_timer_context *ctx),
229 	TP_ARGS(ctx),
230 
231 	TP_STRUCT__entry(
232 		__field(	unsigned long,		ctl		)
233 		__field(	unsigned long long,	cval		)
234 		__field(	int,			timer_idx	)
235 	),
236 
237 	TP_fast_assign(
238 		__entry->ctl			= timer_get_ctl(ctx);
239 		__entry->cval			= timer_get_cval(ctx);
240 		__entry->timer_idx		= arch_timer_ctx_index(ctx);
241 	),
242 
243 	TP_printk("   CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d",
244 		  __entry->ctl,
245 		  __entry->cval,
246 		  __entry->timer_idx)
247 );
248 
249 TRACE_EVENT(kvm_timer_restore_state,
250 	TP_PROTO(struct arch_timer_context *ctx),
251 	TP_ARGS(ctx),
252 
253 	TP_STRUCT__entry(
254 		__field(	unsigned long,		ctl		)
255 		__field(	unsigned long long,	cval		)
256 		__field(	int,			timer_idx	)
257 	),
258 
259 	TP_fast_assign(
260 		__entry->ctl			= timer_get_ctl(ctx);
261 		__entry->cval			= timer_get_cval(ctx);
262 		__entry->timer_idx		= arch_timer_ctx_index(ctx);
263 	),
264 
265 	TP_printk("CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d",
266 		  __entry->ctl,
267 		  __entry->cval,
268 		  __entry->timer_idx)
269 );
270 
271 TRACE_EVENT(kvm_timer_hrtimer_expire,
272 	TP_PROTO(struct arch_timer_context *ctx),
273 	TP_ARGS(ctx),
274 
275 	TP_STRUCT__entry(
276 		__field(	int,			timer_idx	)
277 	),
278 
279 	TP_fast_assign(
280 		__entry->timer_idx		= arch_timer_ctx_index(ctx);
281 	),
282 
283 	TP_printk("arch_timer_ctx_index: %d", __entry->timer_idx)
284 );
285 
286 TRACE_EVENT(kvm_timer_emulate,
287 	TP_PROTO(struct arch_timer_context *ctx, bool should_fire),
288 	TP_ARGS(ctx, should_fire),
289 
290 	TP_STRUCT__entry(
291 		__field(	int,			timer_idx	)
292 		__field(	bool,			should_fire	)
293 	),
294 
295 	TP_fast_assign(
296 		__entry->timer_idx		= arch_timer_ctx_index(ctx);
297 		__entry->should_fire		= should_fire;
298 	),
299 
300 	TP_printk("arch_timer_ctx_index: %d (should_fire: %d)",
301 		  __entry->timer_idx, __entry->should_fire)
302 );
303 
304 #endif /* _TRACE_ARM_ARM64_KVM_H */
305 
306 #undef TRACE_INCLUDE_PATH
307 #define TRACE_INCLUDE_PATH .
308 #undef TRACE_INCLUDE_FILE
309 #define TRACE_INCLUDE_FILE trace_arm
310 
311 /* This part must be outside protection */
312 #include <trace/define_trace.h>
313