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