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 __entry->exit_nr = exit_nr; 122 __entry->pc = kvmppc_get_pc(vcpu); 123 __entry->dar = kvmppc_get_fault_dar(vcpu); 124 __entry->msr = vcpu->arch.shared->msr; 125 __entry->srr1 = to_svcpu(vcpu)->shadow_srr1; 126 ), 127 128 TP_printk("exit=0x%x | pc=0x%lx | msr=0x%lx | dar=0x%lx | srr1=0x%lx", 129 __entry->exit_nr, __entry->pc, __entry->msr, __entry->dar, 130 __entry->srr1) 131 ); 132 133 TRACE_EVENT(kvm_book3s_reenter, 134 TP_PROTO(int r, struct kvm_vcpu *vcpu), 135 TP_ARGS(r, vcpu), 136 137 TP_STRUCT__entry( 138 __field( unsigned int, r ) 139 __field( unsigned long, pc ) 140 ), 141 142 TP_fast_assign( 143 __entry->r = r; 144 __entry->pc = kvmppc_get_pc(vcpu); 145 ), 146 147 TP_printk("reentry r=%d | pc=0x%lx", __entry->r, __entry->pc) 148 ); 149 150 #ifdef CONFIG_PPC_BOOK3S_64 151 152 TRACE_EVENT(kvm_book3s_64_mmu_map, 153 TP_PROTO(int rflags, ulong hpteg, ulong va, pfn_t hpaddr, 154 struct kvmppc_pte *orig_pte), 155 TP_ARGS(rflags, hpteg, va, hpaddr, orig_pte), 156 157 TP_STRUCT__entry( 158 __field( unsigned char, flag_w ) 159 __field( unsigned char, flag_x ) 160 __field( unsigned long, eaddr ) 161 __field( unsigned long, hpteg ) 162 __field( unsigned long, va ) 163 __field( unsigned long long, vpage ) 164 __field( unsigned long, hpaddr ) 165 ), 166 167 TP_fast_assign( 168 __entry->flag_w = ((rflags & HPTE_R_PP) == 3) ? '-' : 'w'; 169 __entry->flag_x = (rflags & HPTE_R_N) ? '-' : 'x'; 170 __entry->eaddr = orig_pte->eaddr; 171 __entry->hpteg = hpteg; 172 __entry->va = va; 173 __entry->vpage = orig_pte->vpage; 174 __entry->hpaddr = hpaddr; 175 ), 176 177 TP_printk("KVM: %c%c Map 0x%lx: [%lx] 0x%lx (0x%llx) -> %lx", 178 __entry->flag_w, __entry->flag_x, __entry->eaddr, 179 __entry->hpteg, __entry->va, __entry->vpage, __entry->hpaddr) 180 ); 181 182 #endif /* CONFIG_PPC_BOOK3S_64 */ 183 184 TRACE_EVENT(kvm_book3s_mmu_map, 185 TP_PROTO(struct hpte_cache *pte), 186 TP_ARGS(pte), 187 188 TP_STRUCT__entry( 189 __field( u64, host_va ) 190 __field( u64, pfn ) 191 __field( ulong, eaddr ) 192 __field( u64, vpage ) 193 __field( ulong, raddr ) 194 __field( int, flags ) 195 ), 196 197 TP_fast_assign( 198 __entry->host_va = pte->host_va; 199 __entry->pfn = pte->pfn; 200 __entry->eaddr = pte->pte.eaddr; 201 __entry->vpage = pte->pte.vpage; 202 __entry->raddr = pte->pte.raddr; 203 __entry->flags = (pte->pte.may_read ? 0x4 : 0) | 204 (pte->pte.may_write ? 0x2 : 0) | 205 (pte->pte.may_execute ? 0x1 : 0); 206 ), 207 208 TP_printk("Map: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", 209 __entry->host_va, __entry->pfn, __entry->eaddr, 210 __entry->vpage, __entry->raddr, __entry->flags) 211 ); 212 213 TRACE_EVENT(kvm_book3s_mmu_invalidate, 214 TP_PROTO(struct hpte_cache *pte), 215 TP_ARGS(pte), 216 217 TP_STRUCT__entry( 218 __field( u64, host_va ) 219 __field( u64, pfn ) 220 __field( ulong, eaddr ) 221 __field( u64, vpage ) 222 __field( ulong, raddr ) 223 __field( int, flags ) 224 ), 225 226 TP_fast_assign( 227 __entry->host_va = pte->host_va; 228 __entry->pfn = pte->pfn; 229 __entry->eaddr = pte->pte.eaddr; 230 __entry->vpage = pte->pte.vpage; 231 __entry->raddr = pte->pte.raddr; 232 __entry->flags = (pte->pte.may_read ? 0x4 : 0) | 233 (pte->pte.may_write ? 0x2 : 0) | 234 (pte->pte.may_execute ? 0x1 : 0); 235 ), 236 237 TP_printk("Flush: hva=%llx pfn=%llx ea=%lx vp=%llx ra=%lx [%x]", 238 __entry->host_va, __entry->pfn, __entry->eaddr, 239 __entry->vpage, __entry->raddr, __entry->flags) 240 ); 241 242 TRACE_EVENT(kvm_book3s_mmu_flush, 243 TP_PROTO(const char *type, struct kvm_vcpu *vcpu, unsigned long long p1, 244 unsigned long long p2), 245 TP_ARGS(type, vcpu, p1, p2), 246 247 TP_STRUCT__entry( 248 __field( int, count ) 249 __field( unsigned long long, p1 ) 250 __field( unsigned long long, p2 ) 251 __field( const char *, type ) 252 ), 253 254 TP_fast_assign( 255 __entry->count = to_book3s(vcpu)->hpte_cache_count; 256 __entry->p1 = p1; 257 __entry->p2 = p2; 258 __entry->type = type; 259 ), 260 261 TP_printk("Flush %d %sPTEs: %llx - %llx", 262 __entry->count, __entry->type, __entry->p1, __entry->p2) 263 ); 264 265 TRACE_EVENT(kvm_book3s_slb_found, 266 TP_PROTO(unsigned long long gvsid, unsigned long long hvsid), 267 TP_ARGS(gvsid, hvsid), 268 269 TP_STRUCT__entry( 270 __field( unsigned long long, gvsid ) 271 __field( unsigned long long, hvsid ) 272 ), 273 274 TP_fast_assign( 275 __entry->gvsid = gvsid; 276 __entry->hvsid = hvsid; 277 ), 278 279 TP_printk("%llx -> %llx", __entry->gvsid, __entry->hvsid) 280 ); 281 282 TRACE_EVENT(kvm_book3s_slb_fail, 283 TP_PROTO(u16 sid_map_mask, unsigned long long gvsid), 284 TP_ARGS(sid_map_mask, gvsid), 285 286 TP_STRUCT__entry( 287 __field( unsigned short, sid_map_mask ) 288 __field( unsigned long long, gvsid ) 289 ), 290 291 TP_fast_assign( 292 __entry->sid_map_mask = sid_map_mask; 293 __entry->gvsid = gvsid; 294 ), 295 296 TP_printk("%x/%x: %llx", __entry->sid_map_mask, 297 SID_MAP_MASK - __entry->sid_map_mask, __entry->gvsid) 298 ); 299 300 TRACE_EVENT(kvm_book3s_slb_map, 301 TP_PROTO(u16 sid_map_mask, unsigned long long gvsid, 302 unsigned long long hvsid), 303 TP_ARGS(sid_map_mask, gvsid, hvsid), 304 305 TP_STRUCT__entry( 306 __field( unsigned short, sid_map_mask ) 307 __field( unsigned long long, guest_vsid ) 308 __field( unsigned long long, host_vsid ) 309 ), 310 311 TP_fast_assign( 312 __entry->sid_map_mask = sid_map_mask; 313 __entry->guest_vsid = gvsid; 314 __entry->host_vsid = hvsid; 315 ), 316 317 TP_printk("%x: %llx -> %llx", __entry->sid_map_mask, 318 __entry->guest_vsid, __entry->host_vsid) 319 ); 320 321 TRACE_EVENT(kvm_book3s_slbmte, 322 TP_PROTO(u64 slb_vsid, u64 slb_esid), 323 TP_ARGS(slb_vsid, slb_esid), 324 325 TP_STRUCT__entry( 326 __field( u64, slb_vsid ) 327 __field( u64, slb_esid ) 328 ), 329 330 TP_fast_assign( 331 __entry->slb_vsid = slb_vsid; 332 __entry->slb_esid = slb_esid; 333 ), 334 335 TP_printk("%llx, %llx", __entry->slb_vsid, __entry->slb_esid) 336 ); 337 338 #endif /* CONFIG_PPC_BOOK3S */ 339 340 #endif /* _TRACE_KVM_H */ 341 342 /* This part must be outside protection */ 343 #include <trace/define_trace.h> 344