1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #if !defined(_TRACE_KVM_BOOKE_H) || defined(TRACE_HEADER_MULTI_READ) 3*4882a593Smuzhiyun #define _TRACE_KVM_BOOKE_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/tracepoint.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #undef TRACE_SYSTEM 8*4882a593Smuzhiyun #define TRACE_SYSTEM kvm_booke 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define kvm_trace_symbol_exit \ 11*4882a593Smuzhiyun {0, "CRITICAL"}, \ 12*4882a593Smuzhiyun {1, "MACHINE_CHECK"}, \ 13*4882a593Smuzhiyun {2, "DATA_STORAGE"}, \ 14*4882a593Smuzhiyun {3, "INST_STORAGE"}, \ 15*4882a593Smuzhiyun {4, "EXTERNAL"}, \ 16*4882a593Smuzhiyun {5, "ALIGNMENT"}, \ 17*4882a593Smuzhiyun {6, "PROGRAM"}, \ 18*4882a593Smuzhiyun {7, "FP_UNAVAIL"}, \ 19*4882a593Smuzhiyun {8, "SYSCALL"}, \ 20*4882a593Smuzhiyun {9, "AP_UNAVAIL"}, \ 21*4882a593Smuzhiyun {10, "DECREMENTER"}, \ 22*4882a593Smuzhiyun {11, "FIT"}, \ 23*4882a593Smuzhiyun {12, "WATCHDOG"}, \ 24*4882a593Smuzhiyun {13, "DTLB_MISS"}, \ 25*4882a593Smuzhiyun {14, "ITLB_MISS"}, \ 26*4882a593Smuzhiyun {15, "DEBUG"}, \ 27*4882a593Smuzhiyun {32, "SPE_UNAVAIL"}, \ 28*4882a593Smuzhiyun {33, "SPE_FP_DATA"}, \ 29*4882a593Smuzhiyun {34, "SPE_FP_ROUND"}, \ 30*4882a593Smuzhiyun {35, "PERFORMANCE_MONITOR"}, \ 31*4882a593Smuzhiyun {36, "DOORBELL"}, \ 32*4882a593Smuzhiyun {37, "DOORBELL_CRITICAL"}, \ 33*4882a593Smuzhiyun {38, "GUEST_DBELL"}, \ 34*4882a593Smuzhiyun {39, "GUEST_DBELL_CRIT"}, \ 35*4882a593Smuzhiyun {40, "HV_SYSCALL"}, \ 36*4882a593Smuzhiyun {41, "HV_PRIV"} 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun TRACE_EVENT(kvm_exit, 39*4882a593Smuzhiyun TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu), 40*4882a593Smuzhiyun TP_ARGS(exit_nr, vcpu), 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun TP_STRUCT__entry( 43*4882a593Smuzhiyun __field( unsigned int, exit_nr ) 44*4882a593Smuzhiyun __field( unsigned long, pc ) 45*4882a593Smuzhiyun __field( unsigned long, msr ) 46*4882a593Smuzhiyun __field( unsigned long, dar ) 47*4882a593Smuzhiyun __field( unsigned long, last_inst ) 48*4882a593Smuzhiyun ), 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun TP_fast_assign( 51*4882a593Smuzhiyun __entry->exit_nr = exit_nr; 52*4882a593Smuzhiyun __entry->pc = kvmppc_get_pc(vcpu); 53*4882a593Smuzhiyun __entry->dar = kvmppc_get_fault_dar(vcpu); 54*4882a593Smuzhiyun __entry->msr = vcpu->arch.shared->msr; 55*4882a593Smuzhiyun __entry->last_inst = vcpu->arch.last_inst; 56*4882a593Smuzhiyun ), 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TP_printk("exit=%s" 59*4882a593Smuzhiyun " | pc=0x%lx" 60*4882a593Smuzhiyun " | msr=0x%lx" 61*4882a593Smuzhiyun " | dar=0x%lx" 62*4882a593Smuzhiyun " | last_inst=0x%lx" 63*4882a593Smuzhiyun , 64*4882a593Smuzhiyun __print_symbolic(__entry->exit_nr, kvm_trace_symbol_exit), 65*4882a593Smuzhiyun __entry->pc, 66*4882a593Smuzhiyun __entry->msr, 67*4882a593Smuzhiyun __entry->dar, 68*4882a593Smuzhiyun __entry->last_inst 69*4882a593Smuzhiyun ) 70*4882a593Smuzhiyun ); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun TRACE_EVENT(kvm_unmap_hva, 73*4882a593Smuzhiyun TP_PROTO(unsigned long hva), 74*4882a593Smuzhiyun TP_ARGS(hva), 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun TP_STRUCT__entry( 77*4882a593Smuzhiyun __field( unsigned long, hva ) 78*4882a593Smuzhiyun ), 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun TP_fast_assign( 81*4882a593Smuzhiyun __entry->hva = hva; 82*4882a593Smuzhiyun ), 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun TP_printk("unmap hva 0x%lx\n", __entry->hva) 85*4882a593Smuzhiyun ); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun TRACE_EVENT(kvm_booke206_stlb_write, 88*4882a593Smuzhiyun TP_PROTO(__u32 mas0, __u32 mas8, __u32 mas1, __u64 mas2, __u64 mas7_3), 89*4882a593Smuzhiyun TP_ARGS(mas0, mas8, mas1, mas2, mas7_3), 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun TP_STRUCT__entry( 92*4882a593Smuzhiyun __field( __u32, mas0 ) 93*4882a593Smuzhiyun __field( __u32, mas8 ) 94*4882a593Smuzhiyun __field( __u32, mas1 ) 95*4882a593Smuzhiyun __field( __u64, mas2 ) 96*4882a593Smuzhiyun __field( __u64, mas7_3 ) 97*4882a593Smuzhiyun ), 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun TP_fast_assign( 100*4882a593Smuzhiyun __entry->mas0 = mas0; 101*4882a593Smuzhiyun __entry->mas8 = mas8; 102*4882a593Smuzhiyun __entry->mas1 = mas1; 103*4882a593Smuzhiyun __entry->mas2 = mas2; 104*4882a593Smuzhiyun __entry->mas7_3 = mas7_3; 105*4882a593Smuzhiyun ), 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun TP_printk("mas0=%x mas8=%x mas1=%x mas2=%llx mas7_3=%llx", 108*4882a593Smuzhiyun __entry->mas0, __entry->mas8, __entry->mas1, 109*4882a593Smuzhiyun __entry->mas2, __entry->mas7_3) 110*4882a593Smuzhiyun ); 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun TRACE_EVENT(kvm_booke206_gtlb_write, 113*4882a593Smuzhiyun TP_PROTO(__u32 mas0, __u32 mas1, __u64 mas2, __u64 mas7_3), 114*4882a593Smuzhiyun TP_ARGS(mas0, mas1, mas2, mas7_3), 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun TP_STRUCT__entry( 117*4882a593Smuzhiyun __field( __u32, mas0 ) 118*4882a593Smuzhiyun __field( __u32, mas1 ) 119*4882a593Smuzhiyun __field( __u64, mas2 ) 120*4882a593Smuzhiyun __field( __u64, mas7_3 ) 121*4882a593Smuzhiyun ), 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun TP_fast_assign( 124*4882a593Smuzhiyun __entry->mas0 = mas0; 125*4882a593Smuzhiyun __entry->mas1 = mas1; 126*4882a593Smuzhiyun __entry->mas2 = mas2; 127*4882a593Smuzhiyun __entry->mas7_3 = mas7_3; 128*4882a593Smuzhiyun ), 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun TP_printk("mas0=%x mas1=%x mas2=%llx mas7_3=%llx", 131*4882a593Smuzhiyun __entry->mas0, __entry->mas1, 132*4882a593Smuzhiyun __entry->mas2, __entry->mas7_3) 133*4882a593Smuzhiyun ); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun TRACE_EVENT(kvm_booke206_ref_release, 136*4882a593Smuzhiyun TP_PROTO(__u64 pfn, __u32 flags), 137*4882a593Smuzhiyun TP_ARGS(pfn, flags), 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun TP_STRUCT__entry( 140*4882a593Smuzhiyun __field( __u64, pfn ) 141*4882a593Smuzhiyun __field( __u32, flags ) 142*4882a593Smuzhiyun ), 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun TP_fast_assign( 145*4882a593Smuzhiyun __entry->pfn = pfn; 146*4882a593Smuzhiyun __entry->flags = flags; 147*4882a593Smuzhiyun ), 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun TP_printk("pfn=%llx flags=%x", 150*4882a593Smuzhiyun __entry->pfn, __entry->flags) 151*4882a593Smuzhiyun ); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #ifdef CONFIG_SPE_POSSIBLE 154*4882a593Smuzhiyun #define kvm_trace_symbol_irqprio_spe \ 155*4882a593Smuzhiyun {BOOKE_IRQPRIO_SPE_UNAVAIL, "SPE_UNAVAIL"}, \ 156*4882a593Smuzhiyun {BOOKE_IRQPRIO_SPE_FP_DATA, "SPE_FP_DATA"}, \ 157*4882a593Smuzhiyun {BOOKE_IRQPRIO_SPE_FP_ROUND, "SPE_FP_ROUND"}, 158*4882a593Smuzhiyun #else 159*4882a593Smuzhiyun #define kvm_trace_symbol_irqprio_spe 160*4882a593Smuzhiyun #endif 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #ifdef CONFIG_PPC_E500MC 163*4882a593Smuzhiyun #define kvm_trace_symbol_irqprio_e500mc \ 164*4882a593Smuzhiyun {BOOKE_IRQPRIO_ALTIVEC_UNAVAIL, "ALTIVEC_UNAVAIL"}, \ 165*4882a593Smuzhiyun {BOOKE_IRQPRIO_ALTIVEC_ASSIST, "ALTIVEC_ASSIST"}, 166*4882a593Smuzhiyun #else 167*4882a593Smuzhiyun #define kvm_trace_symbol_irqprio_e500mc 168*4882a593Smuzhiyun #endif 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define kvm_trace_symbol_irqprio \ 171*4882a593Smuzhiyun kvm_trace_symbol_irqprio_spe \ 172*4882a593Smuzhiyun kvm_trace_symbol_irqprio_e500mc \ 173*4882a593Smuzhiyun {BOOKE_IRQPRIO_DATA_STORAGE, "DATA_STORAGE"}, \ 174*4882a593Smuzhiyun {BOOKE_IRQPRIO_INST_STORAGE, "INST_STORAGE"}, \ 175*4882a593Smuzhiyun {BOOKE_IRQPRIO_ALIGNMENT, "ALIGNMENT"}, \ 176*4882a593Smuzhiyun {BOOKE_IRQPRIO_PROGRAM, "PROGRAM"}, \ 177*4882a593Smuzhiyun {BOOKE_IRQPRIO_FP_UNAVAIL, "FP_UNAVAIL"}, \ 178*4882a593Smuzhiyun {BOOKE_IRQPRIO_SYSCALL, "SYSCALL"}, \ 179*4882a593Smuzhiyun {BOOKE_IRQPRIO_AP_UNAVAIL, "AP_UNAVAIL"}, \ 180*4882a593Smuzhiyun {BOOKE_IRQPRIO_DTLB_MISS, "DTLB_MISS"}, \ 181*4882a593Smuzhiyun {BOOKE_IRQPRIO_ITLB_MISS, "ITLB_MISS"}, \ 182*4882a593Smuzhiyun {BOOKE_IRQPRIO_MACHINE_CHECK, "MACHINE_CHECK"}, \ 183*4882a593Smuzhiyun {BOOKE_IRQPRIO_DEBUG, "DEBUG"}, \ 184*4882a593Smuzhiyun {BOOKE_IRQPRIO_CRITICAL, "CRITICAL"}, \ 185*4882a593Smuzhiyun {BOOKE_IRQPRIO_WATCHDOG, "WATCHDOG"}, \ 186*4882a593Smuzhiyun {BOOKE_IRQPRIO_EXTERNAL, "EXTERNAL"}, \ 187*4882a593Smuzhiyun {BOOKE_IRQPRIO_FIT, "FIT"}, \ 188*4882a593Smuzhiyun {BOOKE_IRQPRIO_DECREMENTER, "DECREMENTER"}, \ 189*4882a593Smuzhiyun {BOOKE_IRQPRIO_PERFORMANCE_MONITOR, "PERFORMANCE_MONITOR"}, \ 190*4882a593Smuzhiyun {BOOKE_IRQPRIO_EXTERNAL_LEVEL, "EXTERNAL_LEVEL"}, \ 191*4882a593Smuzhiyun {BOOKE_IRQPRIO_DBELL, "DBELL"}, \ 192*4882a593Smuzhiyun {BOOKE_IRQPRIO_DBELL_CRIT, "DBELL_CRIT"} \ 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun TRACE_EVENT(kvm_booke_queue_irqprio, 195*4882a593Smuzhiyun TP_PROTO(struct kvm_vcpu *vcpu, unsigned int priority), 196*4882a593Smuzhiyun TP_ARGS(vcpu, priority), 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun TP_STRUCT__entry( 199*4882a593Smuzhiyun __field( __u32, cpu_nr ) 200*4882a593Smuzhiyun __field( __u32, priority ) 201*4882a593Smuzhiyun __field( unsigned long, pending ) 202*4882a593Smuzhiyun ), 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun TP_fast_assign( 205*4882a593Smuzhiyun __entry->cpu_nr = vcpu->vcpu_id; 206*4882a593Smuzhiyun __entry->priority = priority; 207*4882a593Smuzhiyun __entry->pending = vcpu->arch.pending_exceptions; 208*4882a593Smuzhiyun ), 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun TP_printk("vcpu=%x prio=%s pending=%lx", 211*4882a593Smuzhiyun __entry->cpu_nr, 212*4882a593Smuzhiyun __print_symbolic(__entry->priority, kvm_trace_symbol_irqprio), 213*4882a593Smuzhiyun __entry->pending) 214*4882a593Smuzhiyun ); 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun #endif 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun /* This part must be outside protection */ 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 221*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 224*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace_booke 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #include <trace/define_trace.h> 227