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