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