Merge tag 'vfs-6.10.rw' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[sfrench/cifs-2.6.git] / arch / s390 / kvm / trace.h
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>