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 #endif /* _TRACE_KVMS390_H */ 338 339 /* This part must be outside protection */ 340 #include <trace/define_trace.h> 341