1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #if !defined(_TRACE_ARM_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ) 3*4882a593Smuzhiyun #define _TRACE_ARM_ARM64_KVM_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <kvm/arm_arch_timer.h> 6*4882a593Smuzhiyun #include <linux/tracepoint.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #undef TRACE_SYSTEM 9*4882a593Smuzhiyun #define TRACE_SYSTEM kvm 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* 12*4882a593Smuzhiyun * Tracepoints for entry/exit to guest 13*4882a593Smuzhiyun */ 14*4882a593Smuzhiyun TRACE_EVENT(kvm_entry, 15*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_pc), 16*4882a593Smuzhiyun TP_ARGS(vcpu_pc), 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun TP_STRUCT__entry( 19*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 20*4882a593Smuzhiyun ), 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun TP_fast_assign( 23*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 24*4882a593Smuzhiyun ), 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun TP_printk("PC: 0x%016lx", __entry->vcpu_pc) 27*4882a593Smuzhiyun ); 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun TRACE_EVENT(kvm_exit, 30*4882a593Smuzhiyun TP_PROTO(int ret, unsigned int esr_ec, unsigned long vcpu_pc), 31*4882a593Smuzhiyun TP_ARGS(ret, esr_ec, vcpu_pc), 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun TP_STRUCT__entry( 34*4882a593Smuzhiyun __field( int, ret ) 35*4882a593Smuzhiyun __field( unsigned int, esr_ec ) 36*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 37*4882a593Smuzhiyun ), 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun TP_fast_assign( 40*4882a593Smuzhiyun __entry->ret = ARM_EXCEPTION_CODE(ret); 41*4882a593Smuzhiyun __entry->esr_ec = ARM_EXCEPTION_IS_TRAP(ret) ? esr_ec : 0; 42*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 43*4882a593Smuzhiyun ), 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun TP_printk("%s: HSR_EC: 0x%04x (%s), PC: 0x%016lx", 46*4882a593Smuzhiyun __print_symbolic(__entry->ret, kvm_arm_exception_type), 47*4882a593Smuzhiyun __entry->esr_ec, 48*4882a593Smuzhiyun __print_symbolic(__entry->esr_ec, kvm_arm_exception_class), 49*4882a593Smuzhiyun __entry->vcpu_pc) 50*4882a593Smuzhiyun ); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun TRACE_EVENT(kvm_guest_fault, 53*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_pc, unsigned long hsr, 54*4882a593Smuzhiyun unsigned long hxfar, 55*4882a593Smuzhiyun unsigned long long ipa), 56*4882a593Smuzhiyun TP_ARGS(vcpu_pc, hsr, hxfar, ipa), 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun TP_STRUCT__entry( 59*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 60*4882a593Smuzhiyun __field( unsigned long, hsr ) 61*4882a593Smuzhiyun __field( unsigned long, hxfar ) 62*4882a593Smuzhiyun __field( unsigned long long, ipa ) 63*4882a593Smuzhiyun ), 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun TP_fast_assign( 66*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 67*4882a593Smuzhiyun __entry->hsr = hsr; 68*4882a593Smuzhiyun __entry->hxfar = hxfar; 69*4882a593Smuzhiyun __entry->ipa = ipa; 70*4882a593Smuzhiyun ), 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#016lx", 73*4882a593Smuzhiyun __entry->ipa, __entry->hsr, 74*4882a593Smuzhiyun __entry->hxfar, __entry->vcpu_pc) 75*4882a593Smuzhiyun ); 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun TRACE_EVENT(kvm_access_fault, 78*4882a593Smuzhiyun TP_PROTO(unsigned long ipa), 79*4882a593Smuzhiyun TP_ARGS(ipa), 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun TP_STRUCT__entry( 82*4882a593Smuzhiyun __field( unsigned long, ipa ) 83*4882a593Smuzhiyun ), 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun TP_fast_assign( 86*4882a593Smuzhiyun __entry->ipa = ipa; 87*4882a593Smuzhiyun ), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun TP_printk("IPA: %lx", __entry->ipa) 90*4882a593Smuzhiyun ); 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun TRACE_EVENT(kvm_irq_line, 93*4882a593Smuzhiyun TP_PROTO(unsigned int type, int vcpu_idx, int irq_num, int level), 94*4882a593Smuzhiyun TP_ARGS(type, vcpu_idx, irq_num, level), 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun TP_STRUCT__entry( 97*4882a593Smuzhiyun __field( unsigned int, type ) 98*4882a593Smuzhiyun __field( int, vcpu_idx ) 99*4882a593Smuzhiyun __field( int, irq_num ) 100*4882a593Smuzhiyun __field( int, level ) 101*4882a593Smuzhiyun ), 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun TP_fast_assign( 104*4882a593Smuzhiyun __entry->type = type; 105*4882a593Smuzhiyun __entry->vcpu_idx = vcpu_idx; 106*4882a593Smuzhiyun __entry->irq_num = irq_num; 107*4882a593Smuzhiyun __entry->level = level; 108*4882a593Smuzhiyun ), 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun TP_printk("Inject %s interrupt (%d), vcpu->idx: %d, num: %d, level: %d", 111*4882a593Smuzhiyun (__entry->type == KVM_ARM_IRQ_TYPE_CPU) ? "CPU" : 112*4882a593Smuzhiyun (__entry->type == KVM_ARM_IRQ_TYPE_PPI) ? "VGIC PPI" : 113*4882a593Smuzhiyun (__entry->type == KVM_ARM_IRQ_TYPE_SPI) ? "VGIC SPI" : "UNKNOWN", 114*4882a593Smuzhiyun __entry->type, __entry->vcpu_idx, __entry->irq_num, __entry->level) 115*4882a593Smuzhiyun ); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun TRACE_EVENT(kvm_mmio_emulate, 118*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_pc, unsigned long instr, 119*4882a593Smuzhiyun unsigned long cpsr), 120*4882a593Smuzhiyun TP_ARGS(vcpu_pc, instr, cpsr), 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun TP_STRUCT__entry( 123*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 124*4882a593Smuzhiyun __field( unsigned long, instr ) 125*4882a593Smuzhiyun __field( unsigned long, cpsr ) 126*4882a593Smuzhiyun ), 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun TP_fast_assign( 129*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 130*4882a593Smuzhiyun __entry->instr = instr; 131*4882a593Smuzhiyun __entry->cpsr = cpsr; 132*4882a593Smuzhiyun ), 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun TP_printk("Emulate MMIO at: 0x%016lx (instr: %08lx, cpsr: %08lx)", 135*4882a593Smuzhiyun __entry->vcpu_pc, __entry->instr, __entry->cpsr) 136*4882a593Smuzhiyun ); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun TRACE_EVENT(kvm_unmap_hva_range, 139*4882a593Smuzhiyun TP_PROTO(unsigned long start, unsigned long end), 140*4882a593Smuzhiyun TP_ARGS(start, end), 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun TP_STRUCT__entry( 143*4882a593Smuzhiyun __field( unsigned long, start ) 144*4882a593Smuzhiyun __field( unsigned long, end ) 145*4882a593Smuzhiyun ), 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun TP_fast_assign( 148*4882a593Smuzhiyun __entry->start = start; 149*4882a593Smuzhiyun __entry->end = end; 150*4882a593Smuzhiyun ), 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun TP_printk("mmu notifier unmap range: %#016lx -- %#016lx", 153*4882a593Smuzhiyun __entry->start, __entry->end) 154*4882a593Smuzhiyun ); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun TRACE_EVENT(kvm_set_spte_hva, 157*4882a593Smuzhiyun TP_PROTO(unsigned long hva), 158*4882a593Smuzhiyun TP_ARGS(hva), 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun TP_STRUCT__entry( 161*4882a593Smuzhiyun __field( unsigned long, hva ) 162*4882a593Smuzhiyun ), 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun TP_fast_assign( 165*4882a593Smuzhiyun __entry->hva = hva; 166*4882a593Smuzhiyun ), 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun TP_printk("mmu notifier set pte hva: %#016lx", __entry->hva) 169*4882a593Smuzhiyun ); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun TRACE_EVENT(kvm_age_hva, 172*4882a593Smuzhiyun TP_PROTO(unsigned long start, unsigned long end), 173*4882a593Smuzhiyun TP_ARGS(start, end), 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun TP_STRUCT__entry( 176*4882a593Smuzhiyun __field( unsigned long, start ) 177*4882a593Smuzhiyun __field( unsigned long, end ) 178*4882a593Smuzhiyun ), 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun TP_fast_assign( 181*4882a593Smuzhiyun __entry->start = start; 182*4882a593Smuzhiyun __entry->end = end; 183*4882a593Smuzhiyun ), 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun TP_printk("mmu notifier age hva: %#016lx -- %#016lx", 186*4882a593Smuzhiyun __entry->start, __entry->end) 187*4882a593Smuzhiyun ); 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun TRACE_EVENT(kvm_test_age_hva, 190*4882a593Smuzhiyun TP_PROTO(unsigned long hva), 191*4882a593Smuzhiyun TP_ARGS(hva), 192*4882a593Smuzhiyun 193*4882a593Smuzhiyun TP_STRUCT__entry( 194*4882a593Smuzhiyun __field( unsigned long, hva ) 195*4882a593Smuzhiyun ), 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun TP_fast_assign( 198*4882a593Smuzhiyun __entry->hva = hva; 199*4882a593Smuzhiyun ), 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun TP_printk("mmu notifier test age hva: %#016lx", __entry->hva) 202*4882a593Smuzhiyun ); 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun TRACE_EVENT(kvm_set_way_flush, 205*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_pc, bool cache), 206*4882a593Smuzhiyun TP_ARGS(vcpu_pc, cache), 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun TP_STRUCT__entry( 209*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 210*4882a593Smuzhiyun __field( bool, cache ) 211*4882a593Smuzhiyun ), 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun TP_fast_assign( 214*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 215*4882a593Smuzhiyun __entry->cache = cache; 216*4882a593Smuzhiyun ), 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun TP_printk("S/W flush at 0x%016lx (cache %s)", 219*4882a593Smuzhiyun __entry->vcpu_pc, __entry->cache ? "on" : "off") 220*4882a593Smuzhiyun ); 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun TRACE_EVENT(kvm_toggle_cache, 223*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_pc, bool was, bool now), 224*4882a593Smuzhiyun TP_ARGS(vcpu_pc, was, now), 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun TP_STRUCT__entry( 227*4882a593Smuzhiyun __field( unsigned long, vcpu_pc ) 228*4882a593Smuzhiyun __field( bool, was ) 229*4882a593Smuzhiyun __field( bool, now ) 230*4882a593Smuzhiyun ), 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun TP_fast_assign( 233*4882a593Smuzhiyun __entry->vcpu_pc = vcpu_pc; 234*4882a593Smuzhiyun __entry->was = was; 235*4882a593Smuzhiyun __entry->now = now; 236*4882a593Smuzhiyun ), 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun TP_printk("VM op at 0x%016lx (cache was %s, now %s)", 239*4882a593Smuzhiyun __entry->vcpu_pc, __entry->was ? "on" : "off", 240*4882a593Smuzhiyun __entry->now ? "on" : "off") 241*4882a593Smuzhiyun ); 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* 244*4882a593Smuzhiyun * Tracepoints for arch_timer 245*4882a593Smuzhiyun */ 246*4882a593Smuzhiyun TRACE_EVENT(kvm_timer_update_irq, 247*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_id, __u32 irq, int level), 248*4882a593Smuzhiyun TP_ARGS(vcpu_id, irq, level), 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun TP_STRUCT__entry( 251*4882a593Smuzhiyun __field( unsigned long, vcpu_id ) 252*4882a593Smuzhiyun __field( __u32, irq ) 253*4882a593Smuzhiyun __field( int, level ) 254*4882a593Smuzhiyun ), 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun TP_fast_assign( 257*4882a593Smuzhiyun __entry->vcpu_id = vcpu_id; 258*4882a593Smuzhiyun __entry->irq = irq; 259*4882a593Smuzhiyun __entry->level = level; 260*4882a593Smuzhiyun ), 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun TP_printk("VCPU: %ld, IRQ %d, level %d", 263*4882a593Smuzhiyun __entry->vcpu_id, __entry->irq, __entry->level) 264*4882a593Smuzhiyun ); 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun TRACE_EVENT(kvm_get_timer_map, 267*4882a593Smuzhiyun TP_PROTO(unsigned long vcpu_id, struct timer_map *map), 268*4882a593Smuzhiyun TP_ARGS(vcpu_id, map), 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun TP_STRUCT__entry( 271*4882a593Smuzhiyun __field( unsigned long, vcpu_id ) 272*4882a593Smuzhiyun __field( int, direct_vtimer ) 273*4882a593Smuzhiyun __field( int, direct_ptimer ) 274*4882a593Smuzhiyun __field( int, emul_ptimer ) 275*4882a593Smuzhiyun ), 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun TP_fast_assign( 278*4882a593Smuzhiyun __entry->vcpu_id = vcpu_id; 279*4882a593Smuzhiyun __entry->direct_vtimer = arch_timer_ctx_index(map->direct_vtimer); 280*4882a593Smuzhiyun __entry->direct_ptimer = 281*4882a593Smuzhiyun (map->direct_ptimer) ? arch_timer_ctx_index(map->direct_ptimer) : -1; 282*4882a593Smuzhiyun __entry->emul_ptimer = 283*4882a593Smuzhiyun (map->emul_ptimer) ? arch_timer_ctx_index(map->emul_ptimer) : -1; 284*4882a593Smuzhiyun ), 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun TP_printk("VCPU: %ld, dv: %d, dp: %d, ep: %d", 287*4882a593Smuzhiyun __entry->vcpu_id, 288*4882a593Smuzhiyun __entry->direct_vtimer, 289*4882a593Smuzhiyun __entry->direct_ptimer, 290*4882a593Smuzhiyun __entry->emul_ptimer) 291*4882a593Smuzhiyun ); 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun TRACE_EVENT(kvm_timer_save_state, 294*4882a593Smuzhiyun TP_PROTO(struct arch_timer_context *ctx), 295*4882a593Smuzhiyun TP_ARGS(ctx), 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun TP_STRUCT__entry( 298*4882a593Smuzhiyun __field( unsigned long, ctl ) 299*4882a593Smuzhiyun __field( unsigned long long, cval ) 300*4882a593Smuzhiyun __field( int, timer_idx ) 301*4882a593Smuzhiyun ), 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun TP_fast_assign( 304*4882a593Smuzhiyun __entry->ctl = timer_get_ctl(ctx); 305*4882a593Smuzhiyun __entry->cval = timer_get_cval(ctx); 306*4882a593Smuzhiyun __entry->timer_idx = arch_timer_ctx_index(ctx); 307*4882a593Smuzhiyun ), 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun TP_printk(" CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d", 310*4882a593Smuzhiyun __entry->ctl, 311*4882a593Smuzhiyun __entry->cval, 312*4882a593Smuzhiyun __entry->timer_idx) 313*4882a593Smuzhiyun ); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun TRACE_EVENT(kvm_timer_restore_state, 316*4882a593Smuzhiyun TP_PROTO(struct arch_timer_context *ctx), 317*4882a593Smuzhiyun TP_ARGS(ctx), 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun TP_STRUCT__entry( 320*4882a593Smuzhiyun __field( unsigned long, ctl ) 321*4882a593Smuzhiyun __field( unsigned long long, cval ) 322*4882a593Smuzhiyun __field( int, timer_idx ) 323*4882a593Smuzhiyun ), 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun TP_fast_assign( 326*4882a593Smuzhiyun __entry->ctl = timer_get_ctl(ctx); 327*4882a593Smuzhiyun __entry->cval = timer_get_cval(ctx); 328*4882a593Smuzhiyun __entry->timer_idx = arch_timer_ctx_index(ctx); 329*4882a593Smuzhiyun ), 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun TP_printk("CTL: %#08lx CVAL: %#16llx arch_timer_ctx_index: %d", 332*4882a593Smuzhiyun __entry->ctl, 333*4882a593Smuzhiyun __entry->cval, 334*4882a593Smuzhiyun __entry->timer_idx) 335*4882a593Smuzhiyun ); 336*4882a593Smuzhiyun 337*4882a593Smuzhiyun TRACE_EVENT(kvm_timer_hrtimer_expire, 338*4882a593Smuzhiyun TP_PROTO(struct arch_timer_context *ctx), 339*4882a593Smuzhiyun TP_ARGS(ctx), 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun TP_STRUCT__entry( 342*4882a593Smuzhiyun __field( int, timer_idx ) 343*4882a593Smuzhiyun ), 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun TP_fast_assign( 346*4882a593Smuzhiyun __entry->timer_idx = arch_timer_ctx_index(ctx); 347*4882a593Smuzhiyun ), 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun TP_printk("arch_timer_ctx_index: %d", __entry->timer_idx) 350*4882a593Smuzhiyun ); 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun TRACE_EVENT(kvm_timer_emulate, 353*4882a593Smuzhiyun TP_PROTO(struct arch_timer_context *ctx, bool should_fire), 354*4882a593Smuzhiyun TP_ARGS(ctx, should_fire), 355*4882a593Smuzhiyun 356*4882a593Smuzhiyun TP_STRUCT__entry( 357*4882a593Smuzhiyun __field( int, timer_idx ) 358*4882a593Smuzhiyun __field( bool, should_fire ) 359*4882a593Smuzhiyun ), 360*4882a593Smuzhiyun 361*4882a593Smuzhiyun TP_fast_assign( 362*4882a593Smuzhiyun __entry->timer_idx = arch_timer_ctx_index(ctx); 363*4882a593Smuzhiyun __entry->should_fire = should_fire; 364*4882a593Smuzhiyun ), 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun TP_printk("arch_timer_ctx_index: %d (should_fire: %d)", 367*4882a593Smuzhiyun __entry->timer_idx, __entry->should_fire) 368*4882a593Smuzhiyun ); 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun #endif /* _TRACE_ARM_ARM64_KVM_H */ 371*4882a593Smuzhiyun 372*4882a593Smuzhiyun #undef TRACE_INCLUDE_PATH 373*4882a593Smuzhiyun #define TRACE_INCLUDE_PATH . 374*4882a593Smuzhiyun #undef TRACE_INCLUDE_FILE 375*4882a593Smuzhiyun #define TRACE_INCLUDE_FILE trace_arm 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun /* This part must be outside protection */ 378*4882a593Smuzhiyun #include <trace/define_trace.h> 379