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 | |