xref: /linux/arch/s390/kvm/trace.h (revision 87c9c16317882dd6dbbc07e349bc3223e14f3244)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
3 #define _TRACE_KVM_H
4 
5 #include <linux/tracepoint.h>
6 #include <asm/sie.h>
7 #include <asm/debug.h>
8 #include <asm/dis.h>
9 
10 #undef TRACE_SYSTEM
11 #define TRACE_SYSTEM kvm
12 #define TRACE_INCLUDE_PATH .
13 #undef TRACE_INCLUDE_FILE
14 #define TRACE_INCLUDE_FILE trace
15 
16 /*
17  * Helpers for vcpu-specific tracepoints containing the same information
18  * as s390dbf VCPU_EVENTs.
19  */
20 #define VCPU_PROTO_COMMON struct kvm_vcpu *vcpu
21 #define VCPU_ARGS_COMMON vcpu
22 #define VCPU_FIELD_COMMON __field(int, id)			\
23 	__field(unsigned long, pswmask)				\
24 	__field(unsigned long, pswaddr)
25 #define VCPU_ASSIGN_COMMON do {						\
26 	__entry->id = vcpu->vcpu_id;					\
27 	__entry->pswmask = vcpu->arch.sie_block->gpsw.mask;		\
28 	__entry->pswaddr = vcpu->arch.sie_block->gpsw.addr;		\
29 	} while (0);
30 #define VCPU_TP_PRINTK(p_str, p_args...)				\
31 	TP_printk("%02d[%016lx-%016lx]: " p_str, __entry->id,		\
32 		  __entry->pswmask, __entry->pswaddr, p_args)
33 
34 TRACE_EVENT(kvm_s390_skey_related_inst,
35 	    TP_PROTO(VCPU_PROTO_COMMON),
36 	    TP_ARGS(VCPU_ARGS_COMMON),
37 
38 	    TP_STRUCT__entry(
39 		    VCPU_FIELD_COMMON
40 		    ),
41 
42 	    TP_fast_assign(
43 		    VCPU_ASSIGN_COMMON
44 		    ),
45 	    VCPU_TP_PRINTK("%s", "storage key related instruction")
46 	);
47 
48 TRACE_EVENT(kvm_s390_major_guest_pfault,
49 	    TP_PROTO(VCPU_PROTO_COMMON),
50 	    TP_ARGS(VCPU_ARGS_COMMON),
51 
52 	    TP_STRUCT__entry(
53 		    VCPU_FIELD_COMMON
54 		    ),
55 
56 	    TP_fast_assign(
57 		    VCPU_ASSIGN_COMMON
58 		    ),
59 	    VCPU_TP_PRINTK("%s", "major fault, maybe applicable for pfault")
60 	);
61 
62 TRACE_EVENT(kvm_s390_pfault_init,
63 	    TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
64 	    TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
65 
66 	    TP_STRUCT__entry(
67 		    VCPU_FIELD_COMMON
68 		    __field(long, pfault_token)
69 		    ),
70 
71 	    TP_fast_assign(
72 		    VCPU_ASSIGN_COMMON
73 		    __entry->pfault_token = pfault_token;
74 		    ),
75 	    VCPU_TP_PRINTK("init pfault token %ld", __entry->pfault_token)
76 	);
77 
78 TRACE_EVENT(kvm_s390_pfault_done,
79 	    TP_PROTO(VCPU_PROTO_COMMON, long pfault_token),
80 	    TP_ARGS(VCPU_ARGS_COMMON, pfault_token),
81 
82 	    TP_STRUCT__entry(
83 		    VCPU_FIELD_COMMON
84 		    __field(long, pfault_token)
85 		    ),
86 
87 	    TP_fast_assign(
88 		    VCPU_ASSIGN_COMMON
89 		    __entry->pfault_token = pfault_token;
90 		    ),
91 	    VCPU_TP_PRINTK("done pfault token %ld", __entry->pfault_token)
92 	);
93 
94 /*
95  * Tracepoints for SIE entry and exit.
96  */
97 TRACE_EVENT(kvm_s390_sie_enter,
98 	    TP_PROTO(VCPU_PROTO_COMMON, int cpuflags),
99 	    TP_ARGS(VCPU_ARGS_COMMON, cpuflags),
100 
101 	    TP_STRUCT__entry(
102 		    VCPU_FIELD_COMMON
103 		    __field(int, cpuflags)
104 		    ),
105 
106 	    TP_fast_assign(
107 		    VCPU_ASSIGN_COMMON
108 		    __entry->cpuflags = cpuflags;
109 		    ),
110 
111 	    VCPU_TP_PRINTK("entering sie flags %x", __entry->cpuflags)
112 	);
113 
114 TRACE_EVENT(kvm_s390_sie_fault,
115 	    TP_PROTO(VCPU_PROTO_COMMON),
116 	    TP_ARGS(VCPU_ARGS_COMMON),
117 
118 	    TP_STRUCT__entry(
119 		    VCPU_FIELD_COMMON
120 		    ),
121 
122 	    TP_fast_assign(
123 		    VCPU_ASSIGN_COMMON
124 		    ),
125 
126 	    VCPU_TP_PRINTK("%s", "fault in sie instruction")
127 	);
128 
129 TRACE_EVENT(kvm_s390_sie_exit,
130 	    TP_PROTO(VCPU_PROTO_COMMON, u8 icptcode),
131 	    TP_ARGS(VCPU_ARGS_COMMON, icptcode),
132 
133 	    TP_STRUCT__entry(
134 		    VCPU_FIELD_COMMON
135 		    __field(u8, icptcode)
136 		    ),
137 
138 	    TP_fast_assign(
139 		    VCPU_ASSIGN_COMMON
140 		    __entry->icptcode = icptcode;
141 		    ),
142 
143 	    VCPU_TP_PRINTK("exit sie icptcode %d (%s)", __entry->icptcode,
144 			   __print_symbolic(__entry->icptcode,
145 					    sie_intercept_code))
146 	);
147 
148 /*
149  * Trace point for intercepted instructions.
150  */
151 TRACE_EVENT(kvm_s390_intercept_instruction,
152 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
153 	    TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
154 
155 	    TP_STRUCT__entry(
156 		    VCPU_FIELD_COMMON
157 		    __field(__u64, instruction)
158 		    ),
159 
160 	    TP_fast_assign(
161 		    VCPU_ASSIGN_COMMON
162 		    __entry->instruction = ((__u64)ipa << 48) |
163 		    ((__u64)ipb << 16);
164 		    ),
165 
166 	    VCPU_TP_PRINTK("intercepted instruction %016llx (%s)",
167 			   __entry->instruction,
168 			   __print_symbolic(icpt_insn_decoder(__entry->instruction),
169 					    icpt_insn_codes))
170 	);
171 
172 /*
173  * Trace point for intercepted program interruptions.
174  */
175 TRACE_EVENT(kvm_s390_intercept_prog,
176 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
177 	    TP_ARGS(VCPU_ARGS_COMMON, code),
178 
179 	    TP_STRUCT__entry(
180 		    VCPU_FIELD_COMMON
181 		    __field(__u16, code)
182 		    ),
183 
184 	    TP_fast_assign(
185 		    VCPU_ASSIGN_COMMON
186 		    __entry->code = code;
187 		    ),
188 
189 	    VCPU_TP_PRINTK("intercepted program interruption %04x (%s)",
190 			   __entry->code,
191 			   __print_symbolic(__entry->code,
192 					    icpt_prog_codes))
193 	);
194 
195 /*
196  * Trace point for validity intercepts.
197  */
198 TRACE_EVENT(kvm_s390_intercept_validity,
199 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 viwhy),
200 	    TP_ARGS(VCPU_ARGS_COMMON, viwhy),
201 
202 	    TP_STRUCT__entry(
203 		    VCPU_FIELD_COMMON
204 		    __field(__u16, viwhy)
205 		    ),
206 
207 	    TP_fast_assign(
208 		    VCPU_ASSIGN_COMMON
209 		    __entry->viwhy = viwhy;
210 		    ),
211 
212 	    VCPU_TP_PRINTK("got validity intercept %04x", __entry->viwhy)
213 	);
214 
215 /*
216  * Trace points for instructions that are of special interest.
217  */
218 
219 TRACE_EVENT(kvm_s390_handle_sigp,
220 	    TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr, \
221 		     __u32 parameter),
222 	    TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr, parameter),
223 
224 	    TP_STRUCT__entry(
225 		    VCPU_FIELD_COMMON
226 		    __field(__u8, order_code)
227 		    __field(__u16, cpu_addr)
228 		    __field(__u32, parameter)
229 		    ),
230 
231 	    TP_fast_assign(
232 		    VCPU_ASSIGN_COMMON
233 		    __entry->order_code = order_code;
234 		    __entry->cpu_addr = cpu_addr;
235 		    __entry->parameter = parameter;
236 		    ),
237 
238 	    VCPU_TP_PRINTK("handle sigp order %02x (%s), cpu address %04x, " \
239 			   "parameter %08x", __entry->order_code,
240 			   __print_symbolic(__entry->order_code,
241 					    sigp_order_codes),
242 			   __entry->cpu_addr, __entry->parameter)
243 	);
244 
245 TRACE_EVENT(kvm_s390_handle_sigp_pei,
246 	    TP_PROTO(VCPU_PROTO_COMMON, __u8 order_code, __u16 cpu_addr),
247 	    TP_ARGS(VCPU_ARGS_COMMON, order_code, cpu_addr),
248 
249 	    TP_STRUCT__entry(
250 		    VCPU_FIELD_COMMON
251 		    __field(__u8, order_code)
252 		    __field(__u16, cpu_addr)
253 		    ),
254 
255 	    TP_fast_assign(
256 		    VCPU_ASSIGN_COMMON
257 		    __entry->order_code = order_code;
258 		    __entry->cpu_addr = cpu_addr;
259 		    ),
260 
261 	    VCPU_TP_PRINTK("handle sigp pei order %02x (%s), cpu address %04x",
262 			   __entry->order_code,
263 			   __print_symbolic(__entry->order_code,
264 					    sigp_order_codes),
265 			   __entry->cpu_addr)
266 	);
267 
268 TRACE_EVENT(kvm_s390_handle_diag,
269 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 code),
270 	    TP_ARGS(VCPU_ARGS_COMMON, code),
271 
272 	    TP_STRUCT__entry(
273 		    VCPU_FIELD_COMMON
274 		    __field(__u16, code)
275 		    ),
276 
277 	    TP_fast_assign(
278 		    VCPU_ASSIGN_COMMON
279 		    __entry->code = code;
280 		    ),
281 
282 	    VCPU_TP_PRINTK("handle diagnose call %04x (%s)", __entry->code,
283 			   __print_symbolic(__entry->code, diagnose_codes))
284 	);
285 
286 TRACE_EVENT(kvm_s390_handle_lctl,
287 	    TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
288 	    TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
289 
290 	    TP_STRUCT__entry(
291 		    VCPU_FIELD_COMMON
292 		    __field(int, g)
293 		    __field(int, reg1)
294 		    __field(int, reg3)
295 		    __field(u64, addr)
296 		    ),
297 
298 	    TP_fast_assign(
299 		    VCPU_ASSIGN_COMMON
300 		    __entry->g = g;
301 		    __entry->reg1 = reg1;
302 		    __entry->reg3 = reg3;
303 		    __entry->addr = addr;
304 		    ),
305 
306 	    VCPU_TP_PRINTK("%s: loading cr %x-%x from %016llx",
307 			   __entry->g ? "lctlg" : "lctl",
308 			   __entry->reg1, __entry->reg3, __entry->addr)
309 	);
310 
311 TRACE_EVENT(kvm_s390_handle_stctl,
312 	    TP_PROTO(VCPU_PROTO_COMMON, int g, int reg1, int reg3, u64 addr),
313 	    TP_ARGS(VCPU_ARGS_COMMON, g, reg1, reg3, addr),
314 
315 	    TP_STRUCT__entry(
316 		    VCPU_FIELD_COMMON
317 		    __field(int, g)
318 		    __field(int, reg1)
319 		    __field(int, reg3)
320 		    __field(u64, addr)
321 		    ),
322 
323 	    TP_fast_assign(
324 		    VCPU_ASSIGN_COMMON
325 		    __entry->g = g;
326 		    __entry->reg1 = reg1;
327 		    __entry->reg3 = reg3;
328 		    __entry->addr = addr;
329 		    ),
330 
331 	    VCPU_TP_PRINTK("%s: storing cr %x-%x to %016llx",
332 			   __entry->g ? "stctg" : "stctl",
333 			   __entry->reg1, __entry->reg3, __entry->addr)
334 	);
335 
336 TRACE_EVENT(kvm_s390_handle_prefix,
337 	    TP_PROTO(VCPU_PROTO_COMMON, int set, u32 address),
338 	    TP_ARGS(VCPU_ARGS_COMMON, set, address),
339 
340 	    TP_STRUCT__entry(
341 		    VCPU_FIELD_COMMON
342 		    __field(int, set)
343 		    __field(u32, address)
344 		    ),
345 
346 	    TP_fast_assign(
347 		    VCPU_ASSIGN_COMMON
348 		    __entry->set = set;
349 		    __entry->address = address;
350 		    ),
351 
352 	    VCPU_TP_PRINTK("%s prefix to %08x",
353 			   __entry->set ? "setting" : "storing",
354 			   __entry->address)
355 	);
356 
357 TRACE_EVENT(kvm_s390_handle_stap,
358 	    TP_PROTO(VCPU_PROTO_COMMON, u64 address),
359 	    TP_ARGS(VCPU_ARGS_COMMON, address),
360 
361 	    TP_STRUCT__entry(
362 		    VCPU_FIELD_COMMON
363 		    __field(u64, address)
364 		    ),
365 
366 	    TP_fast_assign(
367 		    VCPU_ASSIGN_COMMON
368 		    __entry->address = address;
369 		    ),
370 
371 	    VCPU_TP_PRINTK("storing cpu address to %016llx",
372 			   __entry->address)
373 	);
374 
375 TRACE_EVENT(kvm_s390_handle_stfl,
376 	    TP_PROTO(VCPU_PROTO_COMMON, unsigned int facility_list),
377 	    TP_ARGS(VCPU_ARGS_COMMON, facility_list),
378 
379 	    TP_STRUCT__entry(
380 		    VCPU_FIELD_COMMON
381 		    __field(unsigned int, facility_list)
382 		    ),
383 
384 	    TP_fast_assign(
385 		    VCPU_ASSIGN_COMMON
386 		    __entry->facility_list = facility_list;
387 		    ),
388 
389 	    VCPU_TP_PRINTK("store facility list value %08x",
390 			   __entry->facility_list)
391 	);
392 
393 TRACE_EVENT(kvm_s390_handle_stsi,
394 	    TP_PROTO(VCPU_PROTO_COMMON, int fc, int sel1, int sel2, u64 addr),
395 	    TP_ARGS(VCPU_ARGS_COMMON, fc, sel1, sel2, addr),
396 
397 	    TP_STRUCT__entry(
398 		    VCPU_FIELD_COMMON
399 		    __field(int, fc)
400 		    __field(int, sel1)
401 		    __field(int, sel2)
402 		    __field(u64, addr)
403 		    ),
404 
405 	    TP_fast_assign(
406 		    VCPU_ASSIGN_COMMON
407 		    __entry->fc = fc;
408 		    __entry->sel1 = sel1;
409 		    __entry->sel2 = sel2;
410 		    __entry->addr = addr;
411 		    ),
412 
413 	    VCPU_TP_PRINTK("STSI %d.%d.%d information stored to %016llx",
414 			   __entry->fc, __entry->sel1, __entry->sel2,
415 			   __entry->addr)
416 	);
417 
418 TRACE_EVENT(kvm_s390_handle_operexc,
419 	    TP_PROTO(VCPU_PROTO_COMMON, __u16 ipa, __u32 ipb),
420 	    TP_ARGS(VCPU_ARGS_COMMON, ipa, ipb),
421 
422 	    TP_STRUCT__entry(
423 		    VCPU_FIELD_COMMON
424 		    __field(__u64, instruction)
425 		    ),
426 
427 	    TP_fast_assign(
428 		    VCPU_ASSIGN_COMMON
429 		    __entry->instruction = ((__u64)ipa << 48) |
430 		    ((__u64)ipb << 16);
431 		    ),
432 
433 	    VCPU_TP_PRINTK("operation exception on instruction %016llx (%s)",
434 			   __entry->instruction,
435 			   __print_symbolic(icpt_insn_decoder(__entry->instruction),
436 					    icpt_insn_codes))
437 	);
438 
439 TRACE_EVENT(kvm_s390_handle_sthyi,
440 	    TP_PROTO(VCPU_PROTO_COMMON, u64 code, u64 addr),
441 	    TP_ARGS(VCPU_ARGS_COMMON, code, addr),
442 
443 	    TP_STRUCT__entry(
444 		    VCPU_FIELD_COMMON
445 		    __field(u64, code)
446 		    __field(u64, addr)
447 		    ),
448 
449 	    TP_fast_assign(
450 		    VCPU_ASSIGN_COMMON
451 		    __entry->code = code;
452 		    __entry->addr = addr;
453 		    ),
454 
455 	    VCPU_TP_PRINTK("STHYI fc: %llu addr: %016llx",
456 			   __entry->code, __entry->addr)
457 	);
458 
459 #endif /* _TRACE_KVM_H */
460 
461 /* This part must be outside protection */
462 #include <trace/define_trace.h>
463