xref: /openbmc/linux/arch/s390/kvm/trace-s390.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2ade38c31SCornelia Huck #if !defined(_TRACE_KVMS390_H) || defined(TRACE_HEADER_MULTI_READ)
3ade38c31SCornelia Huck #define _TRACE_KVMS390_H
4ade38c31SCornelia Huck 
5ade38c31SCornelia Huck #include <linux/tracepoint.h>
6ade38c31SCornelia Huck 
7ade38c31SCornelia Huck #undef TRACE_SYSTEM
8ade38c31SCornelia Huck #define TRACE_SYSTEM kvm-s390
9ade38c31SCornelia Huck #define TRACE_INCLUDE_PATH .
10ade38c31SCornelia Huck #undef TRACE_INCLUDE_FILE
11ade38c31SCornelia Huck #define TRACE_INCLUDE_FILE trace-s390
12ade38c31SCornelia Huck 
13ade38c31SCornelia Huck /*
14bd412022SSteven Rostedt (Red Hat)  * The TRACE_SYSTEM_VAR defaults to TRACE_SYSTEM, but must be a
15bd412022SSteven Rostedt (Red Hat)  * legitimate C variable. It is not exported to user space.
16bd412022SSteven Rostedt (Red Hat)  */
17bd412022SSteven Rostedt (Red Hat) #undef TRACE_SYSTEM_VAR
18bd412022SSteven Rostedt (Red Hat) #define TRACE_SYSTEM_VAR kvm_s390
19bd412022SSteven Rostedt (Red Hat) 
20bd412022SSteven Rostedt (Red Hat) /*
21ade38c31SCornelia Huck  * Trace point for the creation of the kvm instance.
22ade38c31SCornelia Huck  */
23ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_create_vm,
24ade38c31SCornelia Huck 	    TP_PROTO(unsigned long type),
25ade38c31SCornelia Huck 	    TP_ARGS(type),
26ade38c31SCornelia Huck 
27ade38c31SCornelia Huck 	    TP_STRUCT__entry(
28ade38c31SCornelia Huck 		    __field(unsigned long, type)
29ade38c31SCornelia Huck 		    ),
30ade38c31SCornelia Huck 
31ade38c31SCornelia Huck 	    TP_fast_assign(
32ade38c31SCornelia Huck 		    __entry->type = type;
33ade38c31SCornelia Huck 		    ),
34ade38c31SCornelia Huck 
35ade38c31SCornelia Huck 	    TP_printk("create vm%s",
36ade38c31SCornelia Huck 		      __entry->type & KVM_VM_S390_UCONTROL ? " (UCONTROL)" : "")
37ade38c31SCornelia Huck 	);
38ade38c31SCornelia Huck 
39ade38c31SCornelia Huck /*
40ade38c31SCornelia Huck  * Trace points for creation and destruction of vpcus.
41ade38c31SCornelia Huck  */
42ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_create_vcpu,
43ade38c31SCornelia Huck 	    TP_PROTO(unsigned int id, struct kvm_vcpu *vcpu,
44ade38c31SCornelia Huck 		     struct kvm_s390_sie_block *sie_block),
45ade38c31SCornelia Huck 	    TP_ARGS(id, vcpu, sie_block),
46ade38c31SCornelia Huck 
47ade38c31SCornelia Huck 	    TP_STRUCT__entry(
48ade38c31SCornelia Huck 		    __field(unsigned int, id)
49ade38c31SCornelia Huck 		    __field(struct kvm_vcpu *, vcpu)
50ade38c31SCornelia Huck 		    __field(struct kvm_s390_sie_block *, sie_block)
51ade38c31SCornelia Huck 		    ),
52ade38c31SCornelia Huck 
53ade38c31SCornelia Huck 	    TP_fast_assign(
54ade38c31SCornelia Huck 		    __entry->id = id;
55ade38c31SCornelia Huck 		    __entry->vcpu = vcpu;
56ade38c31SCornelia Huck 		    __entry->sie_block = sie_block;
57ade38c31SCornelia Huck 		    ),
58ade38c31SCornelia Huck 
598335713aSChristian Borntraeger 	    TP_printk("create cpu %d at 0x%pK, sie block at 0x%pK",
608335713aSChristian Borntraeger 		      __entry->id, __entry->vcpu, __entry->sie_block)
61ade38c31SCornelia Huck 	);
62ade38c31SCornelia Huck 
63ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_destroy_vcpu,
64ade38c31SCornelia Huck 	    TP_PROTO(unsigned int id),
65ade38c31SCornelia Huck 	    TP_ARGS(id),
66ade38c31SCornelia Huck 
67ade38c31SCornelia Huck 	    TP_STRUCT__entry(
68ade38c31SCornelia Huck 		    __field(unsigned int, id)
69ade38c31SCornelia Huck 		    ),
70ade38c31SCornelia Huck 
71ade38c31SCornelia Huck 	    TP_fast_assign(
72ade38c31SCornelia Huck 		    __entry->id = id;
73ade38c31SCornelia Huck 		    ),
74ade38c31SCornelia Huck 
75ade38c31SCornelia Huck 	    TP_printk("destroy cpu %d", __entry->id)
76ade38c31SCornelia Huck 	);
77ade38c31SCornelia Huck 
78ade38c31SCornelia Huck /*
796852d7b6SDavid Hildenbrand  * Trace point for start and stop of vpcus.
806852d7b6SDavid Hildenbrand  */
816852d7b6SDavid Hildenbrand TRACE_EVENT(kvm_s390_vcpu_start_stop,
826852d7b6SDavid Hildenbrand 	    TP_PROTO(unsigned int id, int state),
836852d7b6SDavid Hildenbrand 	    TP_ARGS(id, state),
846852d7b6SDavid Hildenbrand 
856852d7b6SDavid Hildenbrand 	    TP_STRUCT__entry(
866852d7b6SDavid Hildenbrand 		    __field(unsigned int, id)
876852d7b6SDavid Hildenbrand 		    __field(int, state)
886852d7b6SDavid Hildenbrand 		    ),
896852d7b6SDavid Hildenbrand 
906852d7b6SDavid Hildenbrand 	    TP_fast_assign(
916852d7b6SDavid Hildenbrand 		    __entry->id = id;
926852d7b6SDavid Hildenbrand 		    __entry->state = state;
936852d7b6SDavid Hildenbrand 		    ),
946852d7b6SDavid Hildenbrand 
956852d7b6SDavid Hildenbrand 	    TP_printk("%s cpu %d", __entry->state ? "starting" : "stopping",
966852d7b6SDavid Hildenbrand 		      __entry->id)
976852d7b6SDavid Hildenbrand 	);
986852d7b6SDavid Hildenbrand 
996852d7b6SDavid Hildenbrand /*
100ade38c31SCornelia Huck  * Trace points for injection of interrupts, either per machine or
101ade38c31SCornelia Huck  * per vcpu.
102ade38c31SCornelia Huck  */
103ade38c31SCornelia Huck 
104ade38c31SCornelia Huck #define kvm_s390_int_type						\
105ade38c31SCornelia Huck 	{KVM_S390_SIGP_STOP, "sigp stop"},				\
106ade38c31SCornelia Huck 	{KVM_S390_PROGRAM_INT, "program interrupt"},			\
107ade38c31SCornelia Huck 	{KVM_S390_SIGP_SET_PREFIX, "sigp set prefix"},			\
108ade38c31SCornelia Huck 	{KVM_S390_RESTART, "sigp restart"},				\
109a37281b6SDavid Hildenbrand 	{KVM_S390_INT_PFAULT_INIT, "pfault init"},			\
110a37281b6SDavid Hildenbrand 	{KVM_S390_INT_PFAULT_DONE, "pfault done"},			\
111a37281b6SDavid Hildenbrand 	{KVM_S390_MCHK, "machine check"},				\
112a37281b6SDavid Hildenbrand 	{KVM_S390_INT_CLOCK_COMP, "clock comparator"},			\
113a37281b6SDavid Hildenbrand 	{KVM_S390_INT_CPU_TIMER, "cpu timer"},				\
114ade38c31SCornelia Huck 	{KVM_S390_INT_VIRTIO, "virtio interrupt"},			\
115ade38c31SCornelia Huck 	{KVM_S390_INT_SERVICE, "sclp interrupt"},			\
116ade38c31SCornelia Huck 	{KVM_S390_INT_EMERGENCY, "sigp emergency"},			\
117ade38c31SCornelia Huck 	{KVM_S390_INT_EXTERNAL_CALL, "sigp ext call"}
118ade38c31SCornelia Huck 
119a37281b6SDavid Hildenbrand #define get_irq_name(__type) \
120a37281b6SDavid Hildenbrand 	(__type > KVM_S390_INT_IO_MAX ? \
121a37281b6SDavid Hildenbrand 	__print_symbolic(__type, kvm_s390_int_type) : \
122a37281b6SDavid Hildenbrand 		(__type & KVM_S390_INT_IO_AI_MASK ? \
123a37281b6SDavid Hildenbrand 		 "adapter I/O interrupt" : "subchannel I/O interrupt"))
124a37281b6SDavid Hildenbrand 
125ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_inject_vm,
126ade38c31SCornelia Huck 	    TP_PROTO(__u64 type, __u32 parm, __u64 parm64, int who),
127ade38c31SCornelia Huck 	    TP_ARGS(type, parm, parm64, who),
128ade38c31SCornelia Huck 
129ade38c31SCornelia Huck 	    TP_STRUCT__entry(
130ade38c31SCornelia Huck 		    __field(__u32, inttype)
131ade38c31SCornelia Huck 		    __field(__u32, parm)
132ade38c31SCornelia Huck 		    __field(__u64, parm64)
133ade38c31SCornelia Huck 		    __field(int, who)
134ade38c31SCornelia Huck 		    ),
135ade38c31SCornelia Huck 
136ade38c31SCornelia Huck 	    TP_fast_assign(
137ade38c31SCornelia Huck 		    __entry->inttype = type & 0x00000000ffffffff;
138ade38c31SCornelia Huck 		    __entry->parm = parm;
139ade38c31SCornelia Huck 		    __entry->parm64 = parm64;
140ade38c31SCornelia Huck 		    __entry->who = who;
141ade38c31SCornelia Huck 		    ),
142ade38c31SCornelia Huck 
143ade38c31SCornelia Huck 	    TP_printk("inject%s: type:%x (%s) parm:%x parm64:%llx",
144ade38c31SCornelia Huck 		      (__entry->who == 1) ? " (from kernel)" :
145ade38c31SCornelia Huck 		      (__entry->who == 2) ? " (from user)" : "",
146a37281b6SDavid Hildenbrand 		      __entry->inttype, get_irq_name(__entry->inttype),
147ade38c31SCornelia Huck 		      __entry->parm, __entry->parm64)
148ade38c31SCornelia Huck 	);
149ade38c31SCornelia Huck 
150ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_inject_vcpu,
151ed2afcfaSDavid Hildenbrand 	    TP_PROTO(unsigned int id, __u64 type, __u32 parm, __u64 parm64),
152ed2afcfaSDavid Hildenbrand 	    TP_ARGS(id, type, parm, parm64),
153ade38c31SCornelia Huck 
154ade38c31SCornelia Huck 	    TP_STRUCT__entry(
155ade38c31SCornelia Huck 		    __field(int, id)
156ade38c31SCornelia Huck 		    __field(__u32, inttype)
157ade38c31SCornelia Huck 		    __field(__u32, parm)
158ade38c31SCornelia Huck 		    __field(__u64, parm64)
159ade38c31SCornelia Huck 		    ),
160ade38c31SCornelia Huck 
161ade38c31SCornelia Huck 	    TP_fast_assign(
162ade38c31SCornelia Huck 		    __entry->id = id;
163ade38c31SCornelia Huck 		    __entry->inttype = type & 0x00000000ffffffff;
164ade38c31SCornelia Huck 		    __entry->parm = parm;
165ade38c31SCornelia Huck 		    __entry->parm64 = parm64;
166ade38c31SCornelia Huck 		    ),
167ade38c31SCornelia Huck 
168ed2afcfaSDavid Hildenbrand 	    TP_printk("inject (vcpu %d): type:%x (%s) parm:%x parm64:%llx",
169ade38c31SCornelia Huck 		      __entry->id, __entry->inttype,
170a37281b6SDavid Hildenbrand 		      get_irq_name(__entry->inttype), __entry->parm,
171a37281b6SDavid Hildenbrand 		      __entry->parm64)
172ade38c31SCornelia Huck 	);
173ade38c31SCornelia Huck 
174ade38c31SCornelia Huck /*
175ade38c31SCornelia Huck  * Trace point for the actual delivery of interrupts.
176ade38c31SCornelia Huck  */
177ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_deliver_interrupt,
17848a3e950SCornelia Huck 	    TP_PROTO(unsigned int id, __u64 type, __u64 data0, __u64 data1),
179ade38c31SCornelia Huck 	    TP_ARGS(id, type, data0, data1),
180ade38c31SCornelia Huck 
181ade38c31SCornelia Huck 	    TP_STRUCT__entry(
182ade38c31SCornelia Huck 		    __field(int, id)
183ade38c31SCornelia Huck 		    __field(__u32, inttype)
18448a3e950SCornelia Huck 		    __field(__u64, data0)
185ade38c31SCornelia Huck 		    __field(__u64, data1)
186ade38c31SCornelia Huck 		    ),
187ade38c31SCornelia Huck 
188ade38c31SCornelia Huck 	    TP_fast_assign(
189ade38c31SCornelia Huck 		    __entry->id = id;
190ade38c31SCornelia Huck 		    __entry->inttype = type & 0x00000000ffffffff;
191ade38c31SCornelia Huck 		    __entry->data0 = data0;
192ade38c31SCornelia Huck 		    __entry->data1 = data1;
193ade38c31SCornelia Huck 		    ),
194ade38c31SCornelia Huck 
195ade38c31SCornelia Huck 	    TP_printk("deliver interrupt (vcpu %d): type:%x (%s) "	\
19648a3e950SCornelia Huck 		      "data:%08llx %016llx",
197ade38c31SCornelia Huck 		      __entry->id, __entry->inttype,
198a37281b6SDavid Hildenbrand 		      get_irq_name(__entry->inttype), __entry->data0,
199a37281b6SDavid Hildenbrand 		      __entry->data1)
200ade38c31SCornelia Huck 	);
201ade38c31SCornelia Huck 
202ade38c31SCornelia Huck /*
203ade38c31SCornelia Huck  * Trace point for resets that may be requested from userspace.
204ade38c31SCornelia Huck  */
205ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_request_resets,
206ade38c31SCornelia Huck 	    TP_PROTO(__u64 resets),
207ade38c31SCornelia Huck 	    TP_ARGS(resets),
208ade38c31SCornelia Huck 
209ade38c31SCornelia Huck 	    TP_STRUCT__entry(
210ade38c31SCornelia Huck 		    __field(__u64, resets)
211ade38c31SCornelia Huck 		    ),
212ade38c31SCornelia Huck 
213ade38c31SCornelia Huck 	    TP_fast_assign(
214ade38c31SCornelia Huck 		    __entry->resets = resets;
215ade38c31SCornelia Huck 		    ),
216ade38c31SCornelia Huck 
217ade38c31SCornelia Huck 	    TP_printk("requesting userspace resets %llx",
218ade38c31SCornelia Huck 		      __entry->resets)
219ade38c31SCornelia Huck 	);
220ade38c31SCornelia Huck 
221ade38c31SCornelia Huck /*
222ade38c31SCornelia Huck  * Trace point for a vcpu's stop requests.
223ade38c31SCornelia Huck  */
224ade38c31SCornelia Huck TRACE_EVENT(kvm_s390_stop_request,
2256cddd432SDavid Hildenbrand 	    TP_PROTO(unsigned char stop_irq, unsigned char flags),
2266cddd432SDavid Hildenbrand 	    TP_ARGS(stop_irq, flags),
227ade38c31SCornelia Huck 
228ade38c31SCornelia Huck 	    TP_STRUCT__entry(
2296cddd432SDavid Hildenbrand 		    __field(unsigned char, stop_irq)
2306cddd432SDavid Hildenbrand 		    __field(unsigned char, flags)
231ade38c31SCornelia Huck 		    ),
232ade38c31SCornelia Huck 
233ade38c31SCornelia Huck 	    TP_fast_assign(
2346cddd432SDavid Hildenbrand 		    __entry->stop_irq = stop_irq;
2356cddd432SDavid Hildenbrand 		    __entry->flags = flags;
236ade38c31SCornelia Huck 		    ),
237ade38c31SCornelia Huck 
2386cddd432SDavid Hildenbrand 	    TP_printk("stop request, stop irq = %u, flags = %08x",
2396cddd432SDavid Hildenbrand 		      __entry->stop_irq, __entry->flags)
240ade38c31SCornelia Huck 	);
241ade38c31SCornelia Huck 
242ade38c31SCornelia Huck 
243fa6b7fe9SCornelia Huck /*
244fa6b7fe9SCornelia Huck  * Trace point for enabling channel I/O instruction support.
245fa6b7fe9SCornelia Huck  */
246fa6b7fe9SCornelia Huck TRACE_EVENT(kvm_s390_enable_css,
247fa6b7fe9SCornelia Huck 	    TP_PROTO(void *kvm),
248fa6b7fe9SCornelia Huck 	    TP_ARGS(kvm),
249fa6b7fe9SCornelia Huck 
250fa6b7fe9SCornelia Huck 	    TP_STRUCT__entry(
251fa6b7fe9SCornelia Huck 		    __field(void *, kvm)
252fa6b7fe9SCornelia Huck 		    ),
253fa6b7fe9SCornelia Huck 
254fa6b7fe9SCornelia Huck 	    TP_fast_assign(
255fa6b7fe9SCornelia Huck 		    __entry->kvm = kvm;
256fa6b7fe9SCornelia Huck 		    ),
257fa6b7fe9SCornelia Huck 
2588335713aSChristian Borntraeger 	    TP_printk("enabling channel I/O support (kvm @ %pK)\n",
259fa6b7fe9SCornelia Huck 		      __entry->kvm)
260fa6b7fe9SCornelia Huck 	);
261fa6b7fe9SCornelia Huck 
2628ad35755SDavid Hildenbrand /*
2638ad35755SDavid Hildenbrand  * Trace point for enabling and disabling interlocking-and-broadcasting
2648ad35755SDavid Hildenbrand  * suppression.
2658ad35755SDavid Hildenbrand  */
2668ad35755SDavid Hildenbrand TRACE_EVENT(kvm_s390_enable_disable_ibs,
2678ad35755SDavid Hildenbrand 	    TP_PROTO(unsigned int id, int state),
2688ad35755SDavid Hildenbrand 	    TP_ARGS(id, state),
2698ad35755SDavid Hildenbrand 
2708ad35755SDavid Hildenbrand 	    TP_STRUCT__entry(
2718ad35755SDavid Hildenbrand 		    __field(unsigned int, id)
2728ad35755SDavid Hildenbrand 		    __field(int, state)
2738ad35755SDavid Hildenbrand 		    ),
2748ad35755SDavid Hildenbrand 
2758ad35755SDavid Hildenbrand 	    TP_fast_assign(
2768ad35755SDavid Hildenbrand 		    __entry->id = id;
2778ad35755SDavid Hildenbrand 		    __entry->state = state;
2788ad35755SDavid Hildenbrand 		    ),
2798ad35755SDavid Hildenbrand 
2808ad35755SDavid Hildenbrand 	    TP_printk("%s ibs on cpu %d",
2818ad35755SDavid Hildenbrand 		      __entry->state ? "enabling" : "disabling", __entry->id)
2828ad35755SDavid Hildenbrand 	);
2838ad35755SDavid Hildenbrand 
28451978393SFei Li /*
28551978393SFei Li  * Trace point for modifying ais mode for a given isc.
28651978393SFei Li  */
28751978393SFei Li TRACE_EVENT(kvm_s390_modify_ais_mode,
28851978393SFei Li 	    TP_PROTO(__u8 isc, __u16 from, __u16 to),
28951978393SFei Li 	    TP_ARGS(isc, from, to),
29051978393SFei Li 
29151978393SFei Li 	    TP_STRUCT__entry(
29251978393SFei Li 		    __field(__u8, isc)
29351978393SFei Li 		    __field(__u16, from)
29451978393SFei Li 		    __field(__u16, to)
29551978393SFei Li 		    ),
29651978393SFei Li 
29751978393SFei Li 	    TP_fast_assign(
29851978393SFei Li 		    __entry->isc = isc;
29951978393SFei Li 		    __entry->from = from;
30051978393SFei Li 		    __entry->to = to;
30151978393SFei Li 		    ),
30251978393SFei Li 
30351978393SFei Li 	    TP_printk("for isc %x, modifying interruption mode from %s to %s",
30451978393SFei Li 		      __entry->isc,
30551978393SFei Li 		      (__entry->from == KVM_S390_AIS_MODE_ALL) ?
30651978393SFei Li 		      "ALL-Interruptions Mode" :
30751978393SFei Li 		      (__entry->from == KVM_S390_AIS_MODE_SINGLE) ?
30851978393SFei Li 		      "Single-Interruption Mode" : "No-Interruptions Mode",
30951978393SFei Li 		      (__entry->to == KVM_S390_AIS_MODE_ALL) ?
31051978393SFei Li 		      "ALL-Interruptions Mode" :
31151978393SFei Li 		      (__entry->to == KVM_S390_AIS_MODE_SINGLE) ?
31251978393SFei Li 		      "Single-Interruption Mode" : "No-Interruptions Mode")
31351978393SFei Li 	);
31451978393SFei Li 
315a8920950SYi Min Zhao /*
316a8920950SYi Min Zhao  * Trace point for suppressed adapter I/O interrupt.
317a8920950SYi Min Zhao  */
318a8920950SYi Min Zhao TRACE_EVENT(kvm_s390_airq_suppressed,
319a8920950SYi Min Zhao 	    TP_PROTO(__u32 id, __u8 isc),
320a8920950SYi Min Zhao 	    TP_ARGS(id, isc),
321a8920950SYi Min Zhao 
322a8920950SYi Min Zhao 	    TP_STRUCT__entry(
323a8920950SYi Min Zhao 		    __field(__u32, id)
324a8920950SYi Min Zhao 		    __field(__u8, isc)
325a8920950SYi Min Zhao 		    ),
326a8920950SYi Min Zhao 
327a8920950SYi Min Zhao 	    TP_fast_assign(
328a8920950SYi Min Zhao 		    __entry->id = id;
329a8920950SYi Min Zhao 		    __entry->isc = isc;
330a8920950SYi Min Zhao 		    ),
331a8920950SYi Min Zhao 
332a8920950SYi Min Zhao 	    TP_printk("adapter I/O interrupt suppressed (id:%x isc:%x)",
333a8920950SYi Min Zhao 		      __entry->id, __entry->isc)
334a8920950SYi Min Zhao 	);
335a8920950SYi Min Zhao 
336fa6b7fe9SCornelia Huck 
337ade38c31SCornelia Huck #endif /* _TRACE_KVMS390_H */
338ade38c31SCornelia Huck 
339ade38c31SCornelia Huck /* This part must be outside protection */
340ade38c31SCornelia Huck #include <trace/define_trace.h>
341