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