1 #if !defined(_TRACE_KVM_MAIN_H) || defined(TRACE_HEADER_MULTI_READ) 2 #define _TRACE_KVM_MAIN_H 3 4 #include <linux/tracepoint.h> 5 6 #undef TRACE_SYSTEM 7 #define TRACE_SYSTEM kvm 8 9 #define ERSN(x) { KVM_EXIT_##x, "KVM_EXIT_" #x } 10 11 #define kvm_trace_exit_reason \ 12 ERSN(UNKNOWN), ERSN(EXCEPTION), ERSN(IO), ERSN(HYPERCALL), \ 13 ERSN(DEBUG), ERSN(HLT), ERSN(MMIO), ERSN(IRQ_WINDOW_OPEN), \ 14 ERSN(SHUTDOWN), ERSN(FAIL_ENTRY), ERSN(INTR), ERSN(SET_TPR), \ 15 ERSN(TPR_ACCESS), ERSN(S390_SIEIC), ERSN(S390_RESET), ERSN(DCR),\ 16 ERSN(NMI), ERSN(INTERNAL_ERROR), ERSN(OSI), ERSN(PAPR_HCALL), \ 17 ERSN(S390_UCONTROL), ERSN(WATCHDOG), ERSN(S390_TSCH) 18 19 TRACE_EVENT(kvm_userspace_exit, 20 TP_PROTO(__u32 reason, int errno), 21 TP_ARGS(reason, errno), 22 23 TP_STRUCT__entry( 24 __field( __u32, reason ) 25 __field( int, errno ) 26 ), 27 28 TP_fast_assign( 29 __entry->reason = reason; 30 __entry->errno = errno; 31 ), 32 33 TP_printk("reason %s (%d)", 34 __entry->errno < 0 ? 35 (__entry->errno == -EINTR ? "restart" : "error") : 36 __print_symbolic(__entry->reason, kvm_trace_exit_reason), 37 __entry->errno < 0 ? -__entry->errno : __entry->reason) 38 ); 39 40 #if defined(CONFIG_HAVE_KVM_IRQFD) 41 TRACE_EVENT(kvm_set_irq, 42 TP_PROTO(unsigned int gsi, int level, int irq_source_id), 43 TP_ARGS(gsi, level, irq_source_id), 44 45 TP_STRUCT__entry( 46 __field( unsigned int, gsi ) 47 __field( int, level ) 48 __field( int, irq_source_id ) 49 ), 50 51 TP_fast_assign( 52 __entry->gsi = gsi; 53 __entry->level = level; 54 __entry->irq_source_id = irq_source_id; 55 ), 56 57 TP_printk("gsi %u level %d source %d", 58 __entry->gsi, __entry->level, __entry->irq_source_id) 59 ); 60 #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ 61 62 #if defined(__KVM_HAVE_IOAPIC) 63 #define kvm_deliver_mode \ 64 {0x0, "Fixed"}, \ 65 {0x1, "LowPrio"}, \ 66 {0x2, "SMI"}, \ 67 {0x3, "Res3"}, \ 68 {0x4, "NMI"}, \ 69 {0x5, "INIT"}, \ 70 {0x6, "SIPI"}, \ 71 {0x7, "ExtINT"} 72 73 TRACE_EVENT(kvm_ioapic_set_irq, 74 TP_PROTO(__u64 e, int pin, bool coalesced), 75 TP_ARGS(e, pin, coalesced), 76 77 TP_STRUCT__entry( 78 __field( __u64, e ) 79 __field( int, pin ) 80 __field( bool, coalesced ) 81 ), 82 83 TP_fast_assign( 84 __entry->e = e; 85 __entry->pin = pin; 86 __entry->coalesced = coalesced; 87 ), 88 89 TP_printk("pin %u dst %x vec=%u (%s|%s|%s%s)%s", 90 __entry->pin, (u8)(__entry->e >> 56), (u8)__entry->e, 91 __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), 92 (__entry->e & (1<<11)) ? "logical" : "physical", 93 (__entry->e & (1<<15)) ? "level" : "edge", 94 (__entry->e & (1<<16)) ? "|masked" : "", 95 __entry->coalesced ? " (coalesced)" : "") 96 ); 97 98 TRACE_EVENT(kvm_ioapic_delayed_eoi_inj, 99 TP_PROTO(__u64 e), 100 TP_ARGS(e), 101 102 TP_STRUCT__entry( 103 __field( __u64, e ) 104 ), 105 106 TP_fast_assign( 107 __entry->e = e; 108 ), 109 110 TP_printk("dst %x vec=%u (%s|%s|%s%s)", 111 (u8)(__entry->e >> 56), (u8)__entry->e, 112 __print_symbolic((__entry->e >> 8 & 0x7), kvm_deliver_mode), 113 (__entry->e & (1<<11)) ? "logical" : "physical", 114 (__entry->e & (1<<15)) ? "level" : "edge", 115 (__entry->e & (1<<16)) ? "|masked" : "") 116 ); 117 118 TRACE_EVENT(kvm_msi_set_irq, 119 TP_PROTO(__u64 address, __u64 data), 120 TP_ARGS(address, data), 121 122 TP_STRUCT__entry( 123 __field( __u64, address ) 124 __field( __u64, data ) 125 ), 126 127 TP_fast_assign( 128 __entry->address = address; 129 __entry->data = data; 130 ), 131 132 TP_printk("dst %u vec %x (%s|%s|%s%s)", 133 (u8)(__entry->address >> 12), (u8)__entry->data, 134 __print_symbolic((__entry->data >> 8 & 0x7), kvm_deliver_mode), 135 (__entry->address & (1<<2)) ? "logical" : "physical", 136 (__entry->data & (1<<15)) ? "level" : "edge", 137 (__entry->address & (1<<3)) ? "|rh" : "") 138 ); 139 140 #define kvm_irqchips \ 141 {KVM_IRQCHIP_PIC_MASTER, "PIC master"}, \ 142 {KVM_IRQCHIP_PIC_SLAVE, "PIC slave"}, \ 143 {KVM_IRQCHIP_IOAPIC, "IOAPIC"} 144 145 #endif /* defined(__KVM_HAVE_IOAPIC) */ 146 147 #if defined(CONFIG_HAVE_KVM_IRQFD) 148 149 TRACE_EVENT(kvm_ack_irq, 150 TP_PROTO(unsigned int irqchip, unsigned int pin), 151 TP_ARGS(irqchip, pin), 152 153 TP_STRUCT__entry( 154 __field( unsigned int, irqchip ) 155 __field( unsigned int, pin ) 156 ), 157 158 TP_fast_assign( 159 __entry->irqchip = irqchip; 160 __entry->pin = pin; 161 ), 162 163 #ifdef kvm_irqchips 164 TP_printk("irqchip %s pin %u", 165 __print_symbolic(__entry->irqchip, kvm_irqchips), 166 __entry->pin) 167 #else 168 TP_printk("irqchip %d pin %u", __entry->irqchip, __entry->pin) 169 #endif 170 ); 171 172 #endif /* defined(CONFIG_HAVE_KVM_IRQFD) */ 173 174 175 176 #define KVM_TRACE_MMIO_READ_UNSATISFIED 0 177 #define KVM_TRACE_MMIO_READ 1 178 #define KVM_TRACE_MMIO_WRITE 2 179 180 #define kvm_trace_symbol_mmio \ 181 { KVM_TRACE_MMIO_READ_UNSATISFIED, "unsatisfied-read" }, \ 182 { KVM_TRACE_MMIO_READ, "read" }, \ 183 { KVM_TRACE_MMIO_WRITE, "write" } 184 185 TRACE_EVENT(kvm_mmio, 186 TP_PROTO(int type, int len, u64 gpa, u64 val), 187 TP_ARGS(type, len, gpa, val), 188 189 TP_STRUCT__entry( 190 __field( u32, type ) 191 __field( u32, len ) 192 __field( u64, gpa ) 193 __field( u64, val ) 194 ), 195 196 TP_fast_assign( 197 __entry->type = type; 198 __entry->len = len; 199 __entry->gpa = gpa; 200 __entry->val = val; 201 ), 202 203 TP_printk("mmio %s len %u gpa 0x%llx val 0x%llx", 204 __print_symbolic(__entry->type, kvm_trace_symbol_mmio), 205 __entry->len, __entry->gpa, __entry->val) 206 ); 207 208 #define kvm_fpu_load_symbol \ 209 {0, "unload"}, \ 210 {1, "load"} 211 212 TRACE_EVENT(kvm_fpu, 213 TP_PROTO(int load), 214 TP_ARGS(load), 215 216 TP_STRUCT__entry( 217 __field( u32, load ) 218 ), 219 220 TP_fast_assign( 221 __entry->load = load; 222 ), 223 224 TP_printk("%s", __print_symbolic(__entry->load, kvm_fpu_load_symbol)) 225 ); 226 227 TRACE_EVENT(kvm_age_page, 228 TP_PROTO(ulong gfn, int level, struct kvm_memory_slot *slot, int ref), 229 TP_ARGS(gfn, level, slot, ref), 230 231 TP_STRUCT__entry( 232 __field( u64, hva ) 233 __field( u64, gfn ) 234 __field( u8, level ) 235 __field( u8, referenced ) 236 ), 237 238 TP_fast_assign( 239 __entry->gfn = gfn; 240 __entry->level = level; 241 __entry->hva = ((gfn - slot->base_gfn) << 242 PAGE_SHIFT) + slot->userspace_addr; 243 __entry->referenced = ref; 244 ), 245 246 TP_printk("hva %llx gfn %llx level %u %s", 247 __entry->hva, __entry->gfn, __entry->level, 248 __entry->referenced ? "YOUNG" : "OLD") 249 ); 250 251 #ifdef CONFIG_KVM_ASYNC_PF 252 DECLARE_EVENT_CLASS(kvm_async_get_page_class, 253 254 TP_PROTO(u64 gva, u64 gfn), 255 256 TP_ARGS(gva, gfn), 257 258 TP_STRUCT__entry( 259 __field(__u64, gva) 260 __field(u64, gfn) 261 ), 262 263 TP_fast_assign( 264 __entry->gva = gva; 265 __entry->gfn = gfn; 266 ), 267 268 TP_printk("gva = %#llx, gfn = %#llx", __entry->gva, __entry->gfn) 269 ); 270 271 DEFINE_EVENT(kvm_async_get_page_class, kvm_try_async_get_page, 272 273 TP_PROTO(u64 gva, u64 gfn), 274 275 TP_ARGS(gva, gfn) 276 ); 277 278 DEFINE_EVENT(kvm_async_get_page_class, kvm_async_pf_doublefault, 279 280 TP_PROTO(u64 gva, u64 gfn), 281 282 TP_ARGS(gva, gfn) 283 ); 284 285 DECLARE_EVENT_CLASS(kvm_async_pf_nopresent_ready, 286 287 TP_PROTO(u64 token, u64 gva), 288 289 TP_ARGS(token, gva), 290 291 TP_STRUCT__entry( 292 __field(__u64, token) 293 __field(__u64, gva) 294 ), 295 296 TP_fast_assign( 297 __entry->token = token; 298 __entry->gva = gva; 299 ), 300 301 TP_printk("token %#llx gva %#llx", __entry->token, __entry->gva) 302 303 ); 304 305 DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_not_present, 306 307 TP_PROTO(u64 token, u64 gva), 308 309 TP_ARGS(token, gva) 310 ); 311 312 DEFINE_EVENT(kvm_async_pf_nopresent_ready, kvm_async_pf_ready, 313 314 TP_PROTO(u64 token, u64 gva), 315 316 TP_ARGS(token, gva) 317 ); 318 319 TRACE_EVENT( 320 kvm_async_pf_completed, 321 TP_PROTO(unsigned long address, u64 gva), 322 TP_ARGS(address, gva), 323 324 TP_STRUCT__entry( 325 __field(unsigned long, address) 326 __field(u64, gva) 327 ), 328 329 TP_fast_assign( 330 __entry->address = address; 331 __entry->gva = gva; 332 ), 333 334 TP_printk("gva %#llx address %#lx", __entry->gva, 335 __entry->address) 336 ); 337 338 #endif 339 340 #endif /* _TRACE_KVM_MAIN_H */ 341 342 /* This part must be outside protection */ 343 #include <trace/define_trace.h> 344