xref: /OK3568_Linux_fs/kernel/arch/s390/kvm/trace-s390.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #if !defined(_TRACE_KVMS390_H) || defined(TRACE_HEADER_MULTI_READ)
3*4882a593Smuzhiyun #define _TRACE_KVMS390_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/tracepoint.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #undef TRACE_SYSTEM
8*4882a593Smuzhiyun #define TRACE_SYSTEM kvm-s390
9*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH .
10*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE
11*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace-s390
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
15*4882a593Smuzhiyun  * legitimate C variable. It is not exported to user space.
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun #undef TRACE_SYSTEM_VAR
18*4882a593Smuzhiyun #define TRACE_SYSTEM_VAR kvm_s390
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * Trace point for the creation of the kvm instance.
22*4882a593Smuzhiyun  */
23*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_create_vm,
24*4882a593Smuzhiyun 	    TP_PROTO(unsigned long type),
25*4882a593Smuzhiyun 	    TP_ARGS(type),
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	    TP_STRUCT__entry(
28*4882a593Smuzhiyun 		    __field(unsigned long, type)
29*4882a593Smuzhiyun 		    ),
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	    TP_fast_assign(
32*4882a593Smuzhiyun 		    __entry->type = type;
33*4882a593Smuzhiyun 		    ),
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	    TP_printk("create vm%s",
36*4882a593Smuzhiyun 		      __entry->type & KVM_VM_S390_UCONTROL ? " (UCONTROL)" : "")
37*4882a593Smuzhiyun 	);
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /*
40*4882a593Smuzhiyun  * Trace points for creation and destruction of vpcus.
41*4882a593Smuzhiyun  */
42*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_create_vcpu,
43*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id, struct kvm_vcpu *vcpu,
44*4882a593Smuzhiyun 		     struct kvm_s390_sie_block *sie_block),
45*4882a593Smuzhiyun 	    TP_ARGS(id, vcpu, sie_block),
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	    TP_STRUCT__entry(
48*4882a593Smuzhiyun 		    __field(unsigned int, id)
49*4882a593Smuzhiyun 		    __field(struct kvm_vcpu *, vcpu)
50*4882a593Smuzhiyun 		    __field(struct kvm_s390_sie_block *, sie_block)
51*4882a593Smuzhiyun 		    ),
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	    TP_fast_assign(
54*4882a593Smuzhiyun 		    __entry->id = id;
55*4882a593Smuzhiyun 		    __entry->vcpu = vcpu;
56*4882a593Smuzhiyun 		    __entry->sie_block = sie_block;
57*4882a593Smuzhiyun 		    ),
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	    TP_printk("create cpu %d at 0x%pK, sie block at 0x%pK",
60*4882a593Smuzhiyun 		      __entry->id, __entry->vcpu, __entry->sie_block)
61*4882a593Smuzhiyun 	);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_destroy_vcpu,
64*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id),
65*4882a593Smuzhiyun 	    TP_ARGS(id),
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	    TP_STRUCT__entry(
68*4882a593Smuzhiyun 		    __field(unsigned int, id)
69*4882a593Smuzhiyun 		    ),
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	    TP_fast_assign(
72*4882a593Smuzhiyun 		    __entry->id = id;
73*4882a593Smuzhiyun 		    ),
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	    TP_printk("destroy cpu %d", __entry->id)
76*4882a593Smuzhiyun 	);
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /*
79*4882a593Smuzhiyun  * Trace point for start and stop of vpcus.
80*4882a593Smuzhiyun  */
81*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_vcpu_start_stop,
82*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id, int state),
83*4882a593Smuzhiyun 	    TP_ARGS(id, state),
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	    TP_STRUCT__entry(
86*4882a593Smuzhiyun 		    __field(unsigned int, id)
87*4882a593Smuzhiyun 		    __field(int, state)
88*4882a593Smuzhiyun 		    ),
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	    TP_fast_assign(
91*4882a593Smuzhiyun 		    __entry->id = id;
92*4882a593Smuzhiyun 		    __entry->state = state;
93*4882a593Smuzhiyun 		    ),
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	    TP_printk("%s cpu %d", __entry->state ? "starting" : "stopping",
96*4882a593Smuzhiyun 		      __entry->id)
97*4882a593Smuzhiyun 	);
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /*
100*4882a593Smuzhiyun  * Trace points for injection of interrupts, either per machine or
101*4882a593Smuzhiyun  * per vcpu.
102*4882a593Smuzhiyun  */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #define kvm_s390_int_type						\
105*4882a593Smuzhiyun 	{KVM_S390_SIGP_STOP, "sigp stop"},				\
106*4882a593Smuzhiyun 	{KVM_S390_PROGRAM_INT, "program interrupt"},			\
107*4882a593Smuzhiyun 	{KVM_S390_SIGP_SET_PREFIX, "sigp set prefix"},			\
108*4882a593Smuzhiyun 	{KVM_S390_RESTART, "sigp restart"},				\
109*4882a593Smuzhiyun 	{KVM_S390_INT_PFAULT_INIT, "pfault init"},			\
110*4882a593Smuzhiyun 	{KVM_S390_INT_PFAULT_DONE, "pfault done"},			\
111*4882a593Smuzhiyun 	{KVM_S390_MCHK, "machine check"},				\
112*4882a593Smuzhiyun 	{KVM_S390_INT_CLOCK_COMP, "clock comparator"},			\
113*4882a593Smuzhiyun 	{KVM_S390_INT_CPU_TIMER, "cpu timer"},				\
114*4882a593Smuzhiyun 	{KVM_S390_INT_VIRTIO, "virtio interrupt"},			\
115*4882a593Smuzhiyun 	{KVM_S390_INT_SERVICE, "sclp interrupt"},			\
116*4882a593Smuzhiyun 	{KVM_S390_INT_EMERGENCY, "sigp emergency"},			\
117*4882a593Smuzhiyun 	{KVM_S390_INT_EXTERNAL_CALL, "sigp ext call"}
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #define get_irq_name(__type) \
120*4882a593Smuzhiyun 	(__type > KVM_S390_INT_IO_MAX ? \
121*4882a593Smuzhiyun 	__print_symbolic(__type, kvm_s390_int_type) : \
122*4882a593Smuzhiyun 		(__type & KVM_S390_INT_IO_AI_MASK ? \
123*4882a593Smuzhiyun 		 "adapter I/O interrupt" : "subchannel I/O interrupt"))
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_inject_vm,
126*4882a593Smuzhiyun 	    TP_PROTO(__u64 type, __u32 parm, __u64 parm64, int who),
127*4882a593Smuzhiyun 	    TP_ARGS(type, parm, parm64, who),
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	    TP_STRUCT__entry(
130*4882a593Smuzhiyun 		    __field(__u32, inttype)
131*4882a593Smuzhiyun 		    __field(__u32, parm)
132*4882a593Smuzhiyun 		    __field(__u64, parm64)
133*4882a593Smuzhiyun 		    __field(int, who)
134*4882a593Smuzhiyun 		    ),
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	    TP_fast_assign(
137*4882a593Smuzhiyun 		    __entry->inttype = type & 0x00000000ffffffff;
138*4882a593Smuzhiyun 		    __entry->parm = parm;
139*4882a593Smuzhiyun 		    __entry->parm64 = parm64;
140*4882a593Smuzhiyun 		    __entry->who = who;
141*4882a593Smuzhiyun 		    ),
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	    TP_printk("inject%s: type:%x (%s) parm:%x parm64:%llx",
144*4882a593Smuzhiyun 		      (__entry->who == 1) ? " (from kernel)" :
145*4882a593Smuzhiyun 		      (__entry->who == 2) ? " (from user)" : "",
146*4882a593Smuzhiyun 		      __entry->inttype, get_irq_name(__entry->inttype),
147*4882a593Smuzhiyun 		      __entry->parm, __entry->parm64)
148*4882a593Smuzhiyun 	);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_inject_vcpu,
151*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id, __u64 type, __u32 parm, __u64 parm64),
152*4882a593Smuzhiyun 	    TP_ARGS(id, type, parm, parm64),
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	    TP_STRUCT__entry(
155*4882a593Smuzhiyun 		    __field(int, id)
156*4882a593Smuzhiyun 		    __field(__u32, inttype)
157*4882a593Smuzhiyun 		    __field(__u32, parm)
158*4882a593Smuzhiyun 		    __field(__u64, parm64)
159*4882a593Smuzhiyun 		    ),
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	    TP_fast_assign(
162*4882a593Smuzhiyun 		    __entry->id = id;
163*4882a593Smuzhiyun 		    __entry->inttype = type & 0x00000000ffffffff;
164*4882a593Smuzhiyun 		    __entry->parm = parm;
165*4882a593Smuzhiyun 		    __entry->parm64 = parm64;
166*4882a593Smuzhiyun 		    ),
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	    TP_printk("inject (vcpu %d): type:%x (%s) parm:%x parm64:%llx",
169*4882a593Smuzhiyun 		      __entry->id, __entry->inttype,
170*4882a593Smuzhiyun 		      get_irq_name(__entry->inttype), __entry->parm,
171*4882a593Smuzhiyun 		      __entry->parm64)
172*4882a593Smuzhiyun 	);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /*
175*4882a593Smuzhiyun  * Trace point for the actual delivery of interrupts.
176*4882a593Smuzhiyun  */
177*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_deliver_interrupt,
178*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id, __u64 type, __u64 data0, __u64 data1),
179*4882a593Smuzhiyun 	    TP_ARGS(id, type, data0, data1),
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	    TP_STRUCT__entry(
182*4882a593Smuzhiyun 		    __field(int, id)
183*4882a593Smuzhiyun 		    __field(__u32, inttype)
184*4882a593Smuzhiyun 		    __field(__u64, data0)
185*4882a593Smuzhiyun 		    __field(__u64, data1)
186*4882a593Smuzhiyun 		    ),
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	    TP_fast_assign(
189*4882a593Smuzhiyun 		    __entry->id = id;
190*4882a593Smuzhiyun 		    __entry->inttype = type & 0x00000000ffffffff;
191*4882a593Smuzhiyun 		    __entry->data0 = data0;
192*4882a593Smuzhiyun 		    __entry->data1 = data1;
193*4882a593Smuzhiyun 		    ),
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	    TP_printk("deliver interrupt (vcpu %d): type:%x (%s) "	\
196*4882a593Smuzhiyun 		      "data:%08llx %016llx",
197*4882a593Smuzhiyun 		      __entry->id, __entry->inttype,
198*4882a593Smuzhiyun 		      get_irq_name(__entry->inttype), __entry->data0,
199*4882a593Smuzhiyun 		      __entry->data1)
200*4882a593Smuzhiyun 	);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /*
203*4882a593Smuzhiyun  * Trace point for resets that may be requested from userspace.
204*4882a593Smuzhiyun  */
205*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_request_resets,
206*4882a593Smuzhiyun 	    TP_PROTO(__u64 resets),
207*4882a593Smuzhiyun 	    TP_ARGS(resets),
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	    TP_STRUCT__entry(
210*4882a593Smuzhiyun 		    __field(__u64, resets)
211*4882a593Smuzhiyun 		    ),
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	    TP_fast_assign(
214*4882a593Smuzhiyun 		    __entry->resets = resets;
215*4882a593Smuzhiyun 		    ),
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	    TP_printk("requesting userspace resets %llx",
218*4882a593Smuzhiyun 		      __entry->resets)
219*4882a593Smuzhiyun 	);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /*
222*4882a593Smuzhiyun  * Trace point for a vcpu's stop requests.
223*4882a593Smuzhiyun  */
224*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_stop_request,
225*4882a593Smuzhiyun 	    TP_PROTO(unsigned char stop_irq, unsigned char flags),
226*4882a593Smuzhiyun 	    TP_ARGS(stop_irq, flags),
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	    TP_STRUCT__entry(
229*4882a593Smuzhiyun 		    __field(unsigned char, stop_irq)
230*4882a593Smuzhiyun 		    __field(unsigned char, flags)
231*4882a593Smuzhiyun 		    ),
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	    TP_fast_assign(
234*4882a593Smuzhiyun 		    __entry->stop_irq = stop_irq;
235*4882a593Smuzhiyun 		    __entry->flags = flags;
236*4882a593Smuzhiyun 		    ),
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	    TP_printk("stop request, stop irq = %u, flags = %08x",
239*4882a593Smuzhiyun 		      __entry->stop_irq, __entry->flags)
240*4882a593Smuzhiyun 	);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun /*
244*4882a593Smuzhiyun  * Trace point for enabling channel I/O instruction support.
245*4882a593Smuzhiyun  */
246*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_enable_css,
247*4882a593Smuzhiyun 	    TP_PROTO(void *kvm),
248*4882a593Smuzhiyun 	    TP_ARGS(kvm),
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	    TP_STRUCT__entry(
251*4882a593Smuzhiyun 		    __field(void *, kvm)
252*4882a593Smuzhiyun 		    ),
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	    TP_fast_assign(
255*4882a593Smuzhiyun 		    __entry->kvm = kvm;
256*4882a593Smuzhiyun 		    ),
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	    TP_printk("enabling channel I/O support (kvm @ %pK)\n",
259*4882a593Smuzhiyun 		      __entry->kvm)
260*4882a593Smuzhiyun 	);
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun /*
263*4882a593Smuzhiyun  * Trace point for enabling and disabling interlocking-and-broadcasting
264*4882a593Smuzhiyun  * suppression.
265*4882a593Smuzhiyun  */
266*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_enable_disable_ibs,
267*4882a593Smuzhiyun 	    TP_PROTO(unsigned int id, int state),
268*4882a593Smuzhiyun 	    TP_ARGS(id, state),
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	    TP_STRUCT__entry(
271*4882a593Smuzhiyun 		    __field(unsigned int, id)
272*4882a593Smuzhiyun 		    __field(int, state)
273*4882a593Smuzhiyun 		    ),
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun 	    TP_fast_assign(
276*4882a593Smuzhiyun 		    __entry->id = id;
277*4882a593Smuzhiyun 		    __entry->state = state;
278*4882a593Smuzhiyun 		    ),
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	    TP_printk("%s ibs on cpu %d",
281*4882a593Smuzhiyun 		      __entry->state ? "enabling" : "disabling", __entry->id)
282*4882a593Smuzhiyun 	);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun /*
285*4882a593Smuzhiyun  * Trace point for modifying ais mode for a given isc.
286*4882a593Smuzhiyun  */
287*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_modify_ais_mode,
288*4882a593Smuzhiyun 	    TP_PROTO(__u8 isc, __u16 from, __u16 to),
289*4882a593Smuzhiyun 	    TP_ARGS(isc, from, to),
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	    TP_STRUCT__entry(
292*4882a593Smuzhiyun 		    __field(__u8, isc)
293*4882a593Smuzhiyun 		    __field(__u16, from)
294*4882a593Smuzhiyun 		    __field(__u16, to)
295*4882a593Smuzhiyun 		    ),
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	    TP_fast_assign(
298*4882a593Smuzhiyun 		    __entry->isc = isc;
299*4882a593Smuzhiyun 		    __entry->from = from;
300*4882a593Smuzhiyun 		    __entry->to = to;
301*4882a593Smuzhiyun 		    ),
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	    TP_printk("for isc %x, modifying interruption mode from %s to %s",
304*4882a593Smuzhiyun 		      __entry->isc,
305*4882a593Smuzhiyun 		      (__entry->from == KVM_S390_AIS_MODE_ALL) ?
306*4882a593Smuzhiyun 		      "ALL-Interruptions Mode" :
307*4882a593Smuzhiyun 		      (__entry->from == KVM_S390_AIS_MODE_SINGLE) ?
308*4882a593Smuzhiyun 		      "Single-Interruption Mode" : "No-Interruptions Mode",
309*4882a593Smuzhiyun 		      (__entry->to == KVM_S390_AIS_MODE_ALL) ?
310*4882a593Smuzhiyun 		      "ALL-Interruptions Mode" :
311*4882a593Smuzhiyun 		      (__entry->to == KVM_S390_AIS_MODE_SINGLE) ?
312*4882a593Smuzhiyun 		      "Single-Interruption Mode" : "No-Interruptions Mode")
313*4882a593Smuzhiyun 	);
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun /*
316*4882a593Smuzhiyun  * Trace point for suppressed adapter I/O interrupt.
317*4882a593Smuzhiyun  */
318*4882a593Smuzhiyun TRACE_EVENT(kvm_s390_airq_suppressed,
319*4882a593Smuzhiyun 	    TP_PROTO(__u32 id, __u8 isc),
320*4882a593Smuzhiyun 	    TP_ARGS(id, isc),
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	    TP_STRUCT__entry(
323*4882a593Smuzhiyun 		    __field(__u32, id)
324*4882a593Smuzhiyun 		    __field(__u8, isc)
325*4882a593Smuzhiyun 		    ),
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	    TP_fast_assign(
328*4882a593Smuzhiyun 		    __entry->id = id;
329*4882a593Smuzhiyun 		    __entry->isc = isc;
330*4882a593Smuzhiyun 		    ),
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	    TP_printk("adapter I/O interrupt suppressed (id:%x isc:%x)",
333*4882a593Smuzhiyun 		      __entry->id, __entry->isc)
334*4882a593Smuzhiyun 	);
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun #endif /* _TRACE_KVMS390_H */
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /* This part must be outside protection */
340*4882a593Smuzhiyun #include <trace/define_trace.h>
341