1 #if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ) 2 #define _TRACE_KVM_H 3 4 #include <linux/tracepoint.h> 5 6 #undef TRACE_SYSTEM 7 #define TRACE_SYSTEM kvm 8 #define TRACE_INCLUDE_PATH . 9 #define TRACE_INCLUDE_FILE trace 10 11 /* 12 * Tracepoint for guest mode entry. 13 */ 14 TRACE_EVENT(kvm_ppc_instr, 15 TP_PROTO(unsigned int inst, unsigned long _pc, unsigned int emulate), 16 TP_ARGS(inst, _pc, emulate), 17 18 TP_STRUCT__entry( 19 __field( unsigned int, inst ) 20 __field( unsigned long, pc ) 21 __field( unsigned int, emulate ) 22 ), 23 24 TP_fast_assign( 25 __entry->inst = inst; 26 __entry->pc = _pc; 27 __entry->emulate = emulate; 28 ), 29 30 TP_printk("inst %u pc 0x%lx emulate %u\n", 31 __entry->inst, __entry->pc, __entry->emulate) 32 ); 33 34 TRACE_EVENT(kvm_stlb_inval, 35 TP_PROTO(unsigned int stlb_index), 36 TP_ARGS(stlb_index), 37 38 TP_STRUCT__entry( 39 __field( unsigned int, stlb_index ) 40 ), 41 42 TP_fast_assign( 43 __entry->stlb_index = stlb_index; 44 ), 45 46 TP_printk("stlb_index %u", __entry->stlb_index) 47 ); 48 49 TRACE_EVENT(kvm_stlb_write, 50 TP_PROTO(unsigned int victim, unsigned int tid, unsigned int word0, 51 unsigned int word1, unsigned int word2), 52 TP_ARGS(victim, tid, word0, word1, word2), 53 54 TP_STRUCT__entry( 55 __field( unsigned int, victim ) 56 __field( unsigned int, tid ) 57 __field( unsigned int, word0 ) 58 __field( unsigned int, word1 ) 59 __field( unsigned int, word2 ) 60 ), 61 62 TP_fast_assign( 63 __entry->victim = victim; 64 __entry->tid = tid; 65 __entry->word0 = word0; 66 __entry->word1 = word1; 67 __entry->word2 = word2; 68 ), 69 70 TP_printk("victim %u tid %u w0 %u w1 %u w2 %u", 71 __entry->victim, __entry->tid, __entry->word0, 72 __entry->word1, __entry->word2) 73 ); 74 75 TRACE_EVENT(kvm_gtlb_write, 76 TP_PROTO(unsigned int gtlb_index, unsigned int tid, unsigned int word0, 77 unsigned int word1, unsigned int word2), 78 TP_ARGS(gtlb_index, tid, word0, word1, word2), 79 80 TP_STRUCT__entry( 81 __field( unsigned int, gtlb_index ) 82 __field( unsigned int, tid ) 83 __field( unsigned int, word0 ) 84 __field( unsigned int, word1 ) 85 __field( unsigned int, word2 ) 86 ), 87 88 TP_fast_assign( 89 __entry->gtlb_index = gtlb_index; 90 __entry->tid = tid; 91 __entry->word0 = word0; 92 __entry->word1 = word1; 93 __entry->word2 = word2; 94 ), 95 96 TP_printk("gtlb_index %u tid %u w0 %u w1 %u w2 %u", 97 __entry->gtlb_index, __entry->tid, __entry->word0, 98 __entry->word1, __entry->word2) 99 ); 100 101 102 /************************************************************************* 103 * Book3S trace points * 104 *************************************************************************/ 105 106 #ifdef CONFIG_KVM_BOOK3S_PR 107 108 TRACE_EVENT(kvm_book3s_exit, 109 TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu), 110 TP_ARGS(exit_nr, vcpu), 111 112 TP_STRUCT__entry( 113 __field( unsigned int, exit_nr ) 114 __field( unsigned long, pc ) 115 __field( unsigned long, msr ) 116 __field( unsigned long, dar ) 117 __field( unsigned long, srr1 ) 118 ), 119 120 TP_fast_assign( 121 struct kvmppc_book3s_shadow_vcpu *svcpu; 122 __entry->exit_nr = exit_nr; 123 __entry->pc = kvmppc_get_pc(vcpu); 124 __entry->dar = kvmppc_get_fault_dar(vcpu); 125 __entry->msr = vcpu->arch.shared->msr; 126 svcpu = svcpu_get(vcpu); 127 __entry->srr1 = svcpu->shadow_srr1; 128 svcpu_put(svcpu); 129 ), 130 131 TP_printk("exit=0x%x | pc=0x%lx | msr=0x%lx | dar=0x%lx | srr1=0x%lx", 132 __entry->exit_nr, __entry->pc, __entry->msr, __entry->dar, 133 __entry->srr1) 134 ); 135 136 TRACE_EVENT(kvm_book3s_reenter, 137 TP_PROTO(int r, struct kvm_vcpu *vcpu), 138 TP_ARGS(r, vcpu), 139 140 TP_STRUCT__entry( 141 __field( unsigned int, r ) 142 __field( unsigned long, pc ) 143 ), 144 145 TP_fast_assign( 146 __entry->r = r; 147 __entry->pc = kvmppc_get_pc(vcpu); 148 ), 149 150 TP_printk("reentry r=%d | pc=0x%lx", __entry->r, __entry->pc) 151 ); 152 153 #ifdef CONFIG_PPC_BOOK3S_64 154 155 TRACE_EVENT(kvm_book3s_64_mmu_map, 156 TP_PROTO(int rflags, ulong hpteg, ulong va, pfn_t hpaddr, 157 struct kvmppc_pte *orig_pte), 158 TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte), 159 160 TP_STRUCT__entry( 161 __field( unsigned char, flag_w ) 162 __field( unsigned char, flag_x ) 163 __field( unsigned long, eaddr ) 164 __field( unsigned long, hpteg ) 165 __field( unsigned long, va ) 166 __field( unsigned long long, vpage ) 167 __field( unsigned long, hpaddr ) 168 ), 169 170 TP_fast_assign( 171 __entry->flag_w = ((rflags & HPTE_R_PP) == 3) ? '-' : 'w'; 172 __entry->flag_x = (rflags & HPTE_R_N) ? '-' : 'x'; 173 __entry->eaddr = orig_pte->eaddr; 174 __entry->hpteg = hpteg; 175 __entry->va = va; 176 __entry->vpage = orig_pte->vpage; 177 __entry->hpaddr = hpaddr; 178 ), 179 180 TP_printk("KVM: %c%c Map 0x%lx: [%lx] 0x%lx (0x%llx) -> %lx", 181 __entry->flag_w, __entry->flag_x, __entry->eaddr, 182 __entry->hpteg, __entry->va, __entry->vpage, __entry->hpaddr) 183 ); 184 185 #endif /* CONFIG_PPC_BOOK3S_64 */ 186 187 TRACE_EVENT(kvm_book3s_mmu_map, 188 TP_PROTO(struct hpte_cache *pte), 189 TP_ARGS(pte), 190 191 TP_STRUCT__entry( 192 __field( u64, host_va ) 193 __field( u64, pfn ) 194 __field( ulong, eaddr ) 195 __field( u64, vpage ) 196 __field( ulong, raddr ) 197 __field( int, flags ) 198 ), 199 200 TP_fast_assign( 201 __entry->host_va = pte->host_va; 202 __entry->pfn = pte->pfn; 203 __entry->eaddr = pte->pte.eaddr; 204 __entry->vpage = pte->pte.vpage; 205 __entry->raddr = pte->pte.raddr; 206 __entry->flags = (pte->pte.may_read ? 0x4 : 0) | 207 (pte->pte.may_write ? 0x2 : 0) | 208 (pte->pte.may_execute ? 0x1 : 0); 209 ), 210 211 TP_printk("Map: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", 212 __entry->host_va, __entry->pfn, __entry->eaddr, 213 __entry->vpage, __entry->raddr, __entry->flags) 214 ); 215 216 TRACE_EVENT(kvm_book3s_mmu_invalidate, 217 TP_PROTO(struct hpte_cache *pte), 218 TP_ARGS(pte), 219 220 TP_STRUCT__entry( 221 __field( u64, host_va ) 222 __field( u64, pfn ) 223 __field( ulong, eaddr ) 224 __field( u64, vpage ) 225 __field( ulong, raddr ) 226 __field( int, flags ) 227 ), 228 229 TP_fast_assign( 230 __entry->host_va = pte->host_va; 231 __entry->pfn = pte->pfn; 232 __entry->eaddr = pte->pte.eaddr; 233 __entry->vpage = pte->pte.vpage; 234 __entry->raddr = pte->pte.raddr; 235 __entry->flags = (pte->pte.may_read ? 0x4 : 0) | 236 (pte->pte.may_write ? 0x2 : 0) | 237 (pte->pte.may_execute ? 0x1 : 0); 238 ), 239 240 TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", 241 __entry->host_va, __entry->pfn, __entry->eaddr, 242 __entry->vpage, __entry->raddr, __entry->flags) 243 ); 244 245 TRACE_EVENT(kvm_book3s_mmu_flush, 246 TP_PROTO(const char *type, struct kvm_vcpu *vcpu, unsigned long long p1, 247 unsigned long long p2), 248 TP_ARGS(type, vcpu, p1, p2), 249 250 TP_STRUCT__entry( 251 __field( int, count ) 252 __field( unsigned long long, p1 ) 253 __field( unsigned long long, p2 ) 254 __field( const char *, type ) 255 ), 256 257 TP_fast_assign( 258 __entry->count = to_book3s(vcpu)->hpte_cache_count; 259 __entry->p1 = p1; 260 __entry->p2 = p2; 261 __entry->type = type; 262 ), 263 264 TP_printk("Flush %d %sPTEs: %llx - %llx", 265 __entry->count, __entry->type, __entry->p1, __entry->p2) 266 ); 267 268 TRACE_EVENT(kvm_book3s_slb_found, 269 TP_PROTO(unsigned long long gvsid, unsigned long long hvsid), 270 TP_ARGS(gvsid, hvsid), 271 272 TP_STRUCT__entry( 273 __field( unsigned long long, gvsid ) 274 __field( unsigned long long, hvsid ) 275 ), 276 277 TP_fast_assign( 278 __entry->gvsid = gvsid; 279 __entry->hvsid = hvsid; 280 ), 281 282 TP_printk("%llx -> %llx", __entry->gvsid, __entry->hvsid) 283 ); 284 285 TRACE_EVENT(kvm_book3s_slb_fail, 286 TP_PROTO(u16 sid_map_mask, unsigned long long gvsid), 287 TP_ARGS(sid_map_mask, gvsid), 288 289 TP_STRUCT__entry( 290 __field( unsigned short, sid_map_mask ) 291 __field( unsigned long long, gvsid ) 292 ), 293 294 TP_fast_assign( 295 __entry->sid_map_mask = sid_map_mask; 296 __entry->gvsid = gvsid; 297 ), 298 299 TP_printk("%x/%x: %llx", __entry->sid_map_mask, 300 SID_MAP_MASK - __entry->sid_map_mask, __entry->gvsid) 301 ); 302 303 TRACE_EVENT(kvm_book3s_slb_map, 304 TP_PROTO(u16 sid_map_mask, unsigned long long gvsid, 305 unsigned long long hvsid), 306 TP_ARGS(sid_map_mask, gvsid, hvsid), 307 308 TP_STRUCT__entry( 309 __field( unsigned short, sid_map_mask ) 310 __field( unsigned long long, guest_vsid ) 311 __field( unsigned long long, host_vsid ) 312 ), 313 314 TP_fast_assign( 315 __entry->sid_map_mask = sid_map_mask; 316 __entry->guest_vsid = gvsid; 317 __entry->host_vsid = hvsid; 318 ), 319 320 TP_printk("%x: %llx -> %llx", __entry->sid_map_mask, 321 __entry->guest_vsid, __entry->host_vsid) 322 ); 323 324 TRACE_EVENT(kvm_book3s_slbmte, 325 TP_PROTO(u64 slb_vsid, u64 slb_esid), 326 TP_ARGS(slb_vsid, slb_esid), 327 328 TP_STRUCT__entry( 329 __field( u64, slb_vsid ) 330 __field( u64, slb_esid ) 331 ), 332 333 TP_fast_assign( 334 __entry->slb_vsid = slb_vsid; 335 __entry->slb_esid = slb_esid; 336 ), 337 338 TP_printk("%llx, %llx", __entry->slb_vsid, __entry->slb_esid) 339 ); 340 341 #endif /* CONFIG_PPC_BOOK3S */ 342 343 344 /************************************************************************* 345 * Book3E trace points * 346 *************************************************************************/ 347 348 #ifdef CONFIG_BOOKE 349 350 TRACE_EVENT(kvm_booke206_stlb_write, 351 TP_PROTO(__u32 mas0, __u32 mas8, __u32 mas1, __u64 mas2, __u64 mas7_3), 352 TP_ARGS(mas0, mas8, mas1, mas2, mas7_3), 353 354 TP_STRUCT__entry( 355 __field( __u32, mas0 ) 356 __field( __u32, mas8 ) 357 __field( __u32, mas1 ) 358 __field( __u64, mas2 ) 359 __field( __u64, mas7_3 ) 360 ), 361 362 TP_fast_assign( 363 __entry->mas0 = mas0; 364 __entry->mas8 = mas8; 365 __entry->mas1 = mas1; 366 __entry->mas2 = mas2; 367 __entry->mas7_3 = mas7_3; 368 ), 369 370 TP_printk("mas0=%x mas8=%x mas1=%x mas2=%llx mas7_3=%llx", 371 __entry->mas0, __entry->mas8, __entry->mas1, 372 __entry->mas2, __entry->mas7_3) 373 ); 374 375 TRACE_EVENT(kvm_booke206_gtlb_write, 376 TP_PROTO(__u32 mas0, __u32 mas1, __u64 mas2, __u64 mas7_3), 377 TP_ARGS(mas0, mas1, mas2, mas7_3), 378 379 TP_STRUCT__entry( 380 __field( __u32, mas0 ) 381 __field( __u32, mas1 ) 382 __field( __u64, mas2 ) 383 __field( __u64, mas7_3 ) 384 ), 385 386 TP_fast_assign( 387 __entry->mas0 = mas0; 388 __entry->mas1 = mas1; 389 __entry->mas2 = mas2; 390 __entry->mas7_3 = mas7_3; 391 ), 392 393 TP_printk("mas0=%x mas1=%x mas2=%llx mas7_3=%llx", 394 __entry->mas0, __entry->mas1, 395 __entry->mas2, __entry->mas7_3) 396 ); 397 398 #endif 399 400 #endif /* _TRACE_KVM_H */ 401 402 /* This part must be outside protection */ 403 #include <trace/define_trace.h> 404